多线程以及多进程往往能实现爬虫速度的大幅提升,不过协程作为一个更加轻量化的方式可以以更小的代价实现高并发异步爬虫,当io操作越多事,其优势愈加明显。
在使用python的asyncio时,会遭遇需要调用已完成tasks的结果的情况,而实现的方法有两个,一个是add_done_callback(func())而另一个则是task.result()。这里使用第二种方法进行操作。
import aiohttp
import asyncio
from lxml import etree
import requests
import aiofiles
这里之所以设置两个header是因为在请求图片url下载时有防盗链,所有需要进行设置。
headers = {
'User-Agent' :'User-Agent=Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0',
'host':'www.tooopen.com',
'Accept-Language': 'en-USen;q=0.9',
'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'accept-encoding':'gzip, deflate, br',
'connection'