这篇文章主要是介绍生成器和IO多路复用机制, 算是学习asyncio需要的预备知识. 这个系列还有另外两篇文章:
首先创建一个crawler.py文件, 写入以下代码:
import socket req = 'GET / HTTP/1.0\r\nHost:cn.bing.com\r\n\r\n'.encode('utf8') address = ('cn.bing.com', 80) db = [] def simple_crawler(): sock = socket.socket() sock.connect(address) sock.send(req) response = b'' while 1: chunk = sock.recv(1024) if chunk == b'': sock.close() break else: response += chunk db.append(response) if __name__ == '__main__': print('开始爬取...') simple_crawler() print('获取到{}条数据'.format(len(db)))
运行crawler.py文件, 结果如下:
其中, simple_crawler函数做了如下几件事:
- 创建一个socket对象
- 连接服务器
- 向服务器发送http请求
- 接收服务端的响应内容
- 处理和储存响应内容
通过这五个步骤, 我们实现了一个最基本的爬虫实例.
这里的请求之所以使用HTTP1.0协议, 是因为HTTP1.0默认不是长连接, 服务器在发送完数据后会自己断开. 因此当socket接收到空字节的时候, 就说明服务器已经断开了, 也就是说数据已经接收完了.
如果要使用HTTP1.1协议, 那么在请求头中加上Connection:close就行.