前言
这是个在写计算机网络课设的时候碰到的问题,卡了我一天,所以总结一下。
其实在之前就有用requests写过python爬虫,但是计算机网络要求更底层的实现,刚好我看到了[这篇文章]1结果发现他就是用socket来实现的请求,所以就学习了。
本来也觉得应该不难,毕竟就是建立tcp连接。
原网站的例子如下: def fetch(url):
sock = socket.socket() # 建立socket
sock.connect(('xkcd.com', 80)) # 远程连接
request = 'GET {} HTTP/1.0\r\nHost: xkcd.com\r\n\r\n'.format(url) # 构建请求
sock.send(request.encode('ascii')) # 向socket发送数据
response = b''
chunk = sock.recv(4096) # 从socket接收数据
while chunk:
response += chunk
chunk = sock.recv(4096)
# Page is now downloaded.
links = parse_links(response)
q.add(links)
我选择爬取的网站是链家,当然也看了很多其他例子,还用fiddler抓包,把headers整个放了上去,首先是参考了这个文章:https://segmentfault.com/a/1190000005126160 ,该文章介绍到:
Python通过socket发送http请求
我们以访问百度主页为案例,使用socket发送http请求。 import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('www.baidu.com',80))
s.send('''GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Inse