从socket到爬虫

   0.爬虫是一种我们模拟用户向网络服务器快速送请求以获得数据的工具,我们通常使用的爬虫是基于http协议的,http协议是一个典型的应用层的协议,协议就是一些规定,我们按照协议做事就不会错,通过底层一点的协议模拟高级一点的协议可以更好的理解协议。今天从协议,和代码实现两个方面来讲一下socket爬虫,能够通过socket编写爬虫能够更好的理解爬虫。

  1.协议:

    1.1.http是Hyper Text Transfer Protocol的缩写。主要的特点是简单快速。协议主体主要包括,请求行,请求头部,和请求数据。

    1.2.请求行包括请求方法,请求的路径,以及请求的http版本号,请求方法有常见的post,get。还有常常在app或者client端使用的Put,delete等,路径就是url域名后面的一部分,请求版本号一般是http/1.1,现在http2.0也在使用了,可以尝试一下

    1.3.请求头部包括一些常见的对请求的描述比如connection描述链接的状态,常见的有close也就是传完就断开链接,还有keep-alive,也就是常见的长链接。user-agent描述浏览器的信息。content-type描述数据的形式。还有很多,可以自行查看

    1.4.请求数据。描述发送请求时附带的数据,get请求一般没有数据,post请求会把表单中的数据放在这里

  2.代码展示:

    

#以此文件演示基于http协议的爬虫
from socket import *


def genHttp1(host,path="/",method="GET"):
    temp = "{0} {1} HTTP/1.1\r\nHost:{2}\r\nConnection:close\r\n\r\n"
    request=temp.format(method,path,host)
    return request


def get(url,host):
    ip_port=(host,80)
    link = socket(AF_INET,SOCK_STREAM)
    link.connect(ip_port)
    requrl = genHttp1(host,path=url)
    print(requrl)
    link.send(requrl.encode("utf-8"))
    data = b''
    while True:
        d  = link.recv(1024)
        if d:
            data+=d
        else:
            break
    link.close()
    return data.decode("utf-8")


if __name__ == '__main__':
    print(get("/","www.baidu.com"))

猜你喜欢

转载自www.cnblogs.com/mayeye/p/10803719.html
今日推荐