协程是在一个线程内部执行, 一旦遇到了网络 I/O 阻塞,它就会立刻切换到另一个协程中运行,通行不断的轮询,降低了爬取网页的时间。
协程实现爬虫,步骤如下:
① 定义一个负责爬虫的类,所有的爬虫工作完全交由该类负责。
② 使用一个队列 data_queue 保存所有的数据。
③ 创建多个协程任务,每个协程都会使用页码构建完整的网址,访问网址爬取和提取有用的数据,并保存到数据队列中,直到所有网页中的数据提取出来。
④ 将 data_queue 队列中的数据全部取出来,保存到本地文件 duanzi.txt 中。
一、创建一个 Spider 类,负责采集和解析网页的源代码
在 movie_gevent.py 文件中import requests
from queue import Queue
class Spider(object):
def __init__(self):
self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36", "Accept-Language": "zh-CN,zh;q=0.8"}
self.base_url = "https://www.qiushibaike.com/8hr/page/"
# 创建保存数据的队列
self.data_queue = Queue()
# 统计数量
self.count = 0
二、定义一个用于发送请求的方法 send_request()
在 Spider 类中def send_request(self, url):
print("[INFO]: 正在爬取" + url)
html = requests.get(url, headers=self.headers).content
# 每次请求间隔 1s
time.sleep(1)
self.parse_page(html)