Python爬虫 socket库应用详解

Python爬虫(七)

学习Python爬虫过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。

—— socket库应用详解 ——

一.socket库的函数

  1. gethostname():返回主机名。
    socket库应用详解

  2. gethostbyname():将host主机名转换为ipv4地址。

    socket.gethostbyname(‘edu.aqniu.com’)
    socket.gethostbyname(‘www.jd.com’)
    结果如下图:
    socket库应用详解

  3. gethostbyname_ex():功能扩展的gethostbyname函数,返回主机名、主机别名列表、主机IP地址列表。

    socket.gethostbyname_ex(‘edu.aqniu.com’)
    socket.gethostbyname_ex(‘www.jd.com’)
    结果如下图:
    socket库应用详解
    我们可以看到京东的结果和安全牛有不同,即京东在使用CDN,所以建议使用gethostbyname_ex()而非gethostbyname()函数,前者信息更全面,更容易发现目标是否使用了CDN等服务。

    ——了解CDN服务信息点击链接查看。

  4. gethostbyaddr():通过ip地址,返回包括主机名的三元组:(hostname, aliaslist, ipaddrlist)。

    socket.gethostbyaddr(“180.76.136.71”)
    socket.gethostbyaddr(‘202.165.102.205’)
    socket.gethostbyaddr(‘192.168.99.110’)
    但是这个函数有个问题:
    socket库应用详解
    对于部分ip地址会报错,原因可能是gethostbyaddr在输入参数时ip地址,并没有经过dns转换,因此无法获取域名等信息。所以对于一部分ip地址不会报错,一部分会报错:
    socket库应用详解
    这里通过雅虎的ip地址就可以查到,因此建议使用于内网。

    扫描二维码关注公众号,回复: 9560261 查看本文章
  5. getservbyport():返回该端口号的服务名,仅限本机。

    socket.getservbyport(80, ‘tcp’)
    socket库应用详解

  6. getservbyname():通过给定的服务名,协议名,返回该服务所在的端口号。

    socket.getservbyname(‘http’, ‘tcp’)
    socket库应用详解

  7. getaddrinfo():返回一个包含5元组的list,用来获得host的地址信息,兼容ipv4和ipv6,在gethostbyname()函数不能兼容的ipv6的时候,可以使用这个函数。

    socket.getaddrinfo(‘edu.aqniu.com’,80)
    socket.getaddrinfo(“www.baidu.com”,None)
    socket库应用详解

  8. socket(family, type):创建一个socket连接。
    ● family参数代表地址家族,可为AF_INETAF_UNIX
    ●AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。
    ●socket.AF_INET指的是IPv4,socket.AF_INET6指的是IPv6。
    ●type表示套接字类型,socket.SOCK_STREAM指的是TCP连接,socket.SOCK_DGRAM指的是UDP协议

    socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket库应用详解

  9. connect((host, port)):连接到远程地址,注意括号内部是一个元组
    sock.connect((‘edu.aqniu.com’, 80))
    [连接成功没有提示]
    socket库应用详解

  10. gettimeout():返回socket超时时间,以秒计(float)。

    socket.gettimeout()

  11. settimeout(timeout):设置Socket超时时间,以秒计(float)

    socket.settimeout(timeout)

二.socket库的方法

  1. connect(address):连接到一个address对应的远程socket。
    如果连接被中断,这个方法会等待直到连接完成,或者会抛出socket.timeout错误(超时)。

  2. accept():接受一个连接,但前提是socket必须已经绑定了一个地址,在等待连接。
    在默认情况下,socket是阻塞式的,意思就是socket的方法的调用在任务完成之前是不会返回的。
    调用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素address是客户的Internet地址。

  3. recv(bufsize):从socket接收数据,注意是byte类型,bufsize指定一次最多接收的数据大小。

    buf = connection.recv(1024)

  4. recvfrom(bufsize) ,与上一个recv(bufsize)方法的区别是返回值除了数据还有发送数据的地址,返回值是一个数据,地址对(data, address)。

    recv = s.recvfrom(1024)

  5. send(bytes):发送数据到socket,前提是已经连接到远程socket,返回值是发送数据的量,检查数据是否发送完是应用的责任。

    str = ‘Thank you for connecting’
    str = str.encode()
    connection.send(str)

  6. sendto(bytes, flags, address):基本与socket.send()相同。

    s.sendto(str,client_addr)

  7. close():关闭连接,当socket.close()执行时,与这个连接相关的底层操作也会关闭(如文件描述符),一旦关闭,再对相关的文件对象操作都会失败。

    connection.close()

  8. bind(address):将socket对象绑定到一个地址,但这个地址必须是没有被占用的,否则会连接失败。
    这里的address一般是一个ip,port对。

    s.bind(‘localhost’, 10000)

  9. listen([backlog]) :监听,使得服务器能接收服务端连接,如果backlog指定了(最少是0,如果比0小,系统默认改成0),限制可以连接的数量,如果没有指定,将指派一个默认的合理值。

    s.listen(5)

【socket库的具体原理请参照TCP协议三次握手】

发布了56 篇原创文章 · 获赞 19 · 访问量 8872

猜你喜欢

转载自blog.csdn.net/qq_44867435/article/details/104575956
今日推荐