Python Crawler12:asynic协程

Python Crawler12:asynic协程

简介

协程:又称为微线程,在一个线程中执行,执行函数时可以随时中断,由程序(用户)自身控制,执行效率极高,与多线程比较,没有切换线程的开销和多线程锁机制。

测试

import aiohttp import asyncio from datetime import datetime async def fetch(client): headers = {'content-type': 'application/json', 'User-Agent': 'Python/3.8 aiohttp/3.8.2'} async with client.get('http://httpbin.org/get',headers=headers) as resp: return await resp.text() async def main(): async with aiohttp.ClientSession() as client: html = await fetch(client) print(html) loop = asyncio.get_event_loop() start = datetime.now() loop.run_until_complete(main()) end = datetime.now() print("aiohttp版爬虫花费时间为:") print(end - start)
 
 
爬虫实战| 1宅男女神(秀人网专区)---让人心情愉悦的图片爬取 !
目标是宅男女神的美女图片板块下的秀人板块, 页面上全部是该网站收录的美女图片分类, 大概浏览了一下, 发现各个杂志社的图片(妹子) 质量最高, 其中以秀人为首, 所以决定爬取所有秀人板块下的图片. 该网页这里显示只有5页, 后面的页面在点击下一页后出现. 为了过审还是打码了, 本来都是穿着衣服的正经妹妹, 兄弟们可别误会了~ 第一步先利用抓包工具来判断我们要爬取的网站是动态数据还是静态数据. 这里可以清楚的看到,当我们发起请求之后, 所有我们需要的东西都已经加载并缓存好了, 并没有什么反爬措施, 这一步分析后,我们可以直接写代码,看看我们分析的对不对. 发现确实是我们需要的网页信息, 现在就可以对页面进行分析, 用xpath拿到我们想要的数据 发现我们每个妹妹都在li标签里, 并且需要拼接的url和title也可以在li标签里找到. 现在主页面的信息我们都已经拿到了, 下一步就是进入每一个妹妹详情页面, 去下载图片 对详情页面分析, 发现每一页都会有三张图片, 并且下面需要翻页, 经测试如果翻到最后一页再点下一页会跳转到第一页, 这里找发现在第一页会显示每个妹妹图集里有多少张图 用xpath拿出来, 用正则把数字提取出来.到这一步我们的页面分析已经结束了, 直接上代码, 因为这么写下载速度很慢, 所以代码有几个版本, 包括线性的和协程的来对比和优化. 这里拿到了我们想要的结果, 每页下载图片, 然后翻页, 但是这么下载的速度实在是太慢了, 一个妹妹的全部图集一张一张的下载完, 全站的图片不知道哪年才能拿到 这里这个妹妹图片只有35张耗时17秒, 大部分妹妹的图集都超过70张, 所以现在想办法用asyncio协程来优化一下下载速度 这里发现如果用协成来下载的话, 速度比之前快很多, 变成了4秒钟左右, 但是翻页等操作还是线性的,还是会占用大块的时间, 现在想办法把对一个页面里所有妹妹的图集请求变成协成的, 最终代码如下 最终版本下载了目标页面宅男女神->美女图片->秀人网 下所有妹妹的图集(20个图集), 总用时不到30秒钟.
爬虫实战| 1宅男女神(秀人网专区)---让人心情愉悦的图片爬取 !
 

2. 报错

2.1 信号灯超时间已到问题

解决

注意当任务量较多时,以上写法会报错,提示信号灯超时时间已到,这是因为我们每个请求都创建了一个session,当请求过多时,就会报错,我们这时候就要使session复用,让每个请求使用同一个session。
 
 

3. 多进程结合

既然异步协程和多进程对网络请求都有提升,那么为什么不把二者结合起来呢?在最新的 PyCon 2018 上,来自 Facebook 的 John Reese 介绍了 asyncio 和 multiprocessing 各自的特点,并开发了一个新的库,叫做 aiomultiprocess。
安装
pip install aiomultiprocess