本文目录:

  • 同步方式爬取博客标题
  • async/await异步爬取博客标题

本片为深入理解协程系列文章的补充

你将会在从本文中了解到:async/await如何运用的实际的爬虫中。

案例

从CSDN上批量爬取指定文章的标题。文章列表如下:

urls = [
'https://blog.csdn.net/Jmilk/article/details/103218919',
'https://blog.csdn.net/stven_king/article/details/103256724',
'https://blog.csdn.net/csdnnews/article/details/103154693',
'https://blog.csdn.net/dg_lee/article/details/103951021',
'https://blog.csdn.net/m0_37907797/article/details/103272967',
'https://blog.csdn.net/zzq900503/article/details/49618605',
'https://blog.csdn.net/weixin_44339238/article/details/103977138',
'https://blog.csdn.net/dengjin20104042056/article/details/103930275',
'https://blog.csdn.net/Mind_programmonkey/article/details/103940511',
'https://blog.csdn.net/xufive/article/details/102993570',
'https://blog.csdn.net/weixin_41010294/article/details/104009722',
'https://blog.csdn.net/yunqiinsight/article/details/103137022',
'https://blog.csdn.net/qq_44210563/article/details/102826406',
]

同步爬虫

import requests
import time
from lxml import etree urls = [
'https://blog.csdn.net/Jmilk/article/details/103218919',
'https://blog.csdn.net/stven_king/article/details/103256724',
...此处略
] def get_title(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
}
r = requests.get(url, headers)
html = r.content
title = etree.HTML(html).xpath('//h1[@class="title-article"]/text()')[0]
print(title) def main():
for url in urls:
get_title(url) if __name__ == '__main__':
start = time.time()
main()
print(f'cost time: {time.time() - start}s')

输出结果如下:

4G LTE/EPC 协议栈
Android-Universal-Image-Loader源码分析
8年经验面试官详解 Java 面试秘诀
AES中ECB模式的加密与解密(Python3.7)
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
java进阶(四)------java编程规范---代码质量检测工具FindBugs、PMD和CheckStyle的安装
这是一份集合一线大厂Android工程师必备技能体系+学习路线!
【程序人生】程序员接私活常用平台汇总
你不得不了解的卷积神经网络发展史
致 Python 初学者
OOM别慌,手把手教你定位
中国数据库OceanBase登顶之路
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
cost time: 6.065227508544922s

用时:6.065227508544922s

async/await异步爬虫

要实现一个真正的异步爬虫,就需要引入aiohttp模块,aiohttp是一个利用asyncio的库,可以暂时看成协程版的requests

import asyncio
import time
import aiohttp
from lxml import etree urls = [
'https://blog.csdn.net/Jmilk/article/details/103218919',
'https://blog.csdn.net/stven_king/article/details/103256724',
...此处略
] async def async_get_url(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
}
async with aiohttp.ClientSession() as session: # 解释1
async with session.get(url, headers=headers) as r:
html = await r.read()
title = etree.HTML(html).xpath('//h1[@class="title-article"]/text()')[0]
print(title) def async_main():
loop = asyncio.get_event_loop()
tasks = [async_get_url(url) for url in urls]
loop.run_until_complete(asyncio.wait(tasks))
loop.close() if __name__ == '__main__':
start = time.time()
async_main()
print(f'cost time: {time.time() - start}s')

输出结果:

网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
【程序人生】程序员接私活常用平台汇总
致 Python 初学者
中国数据库OceanBase登顶之路
Android-Universal-Image-Loader源码分析
OOM别慌,手把手教你定位
这是一份集合一线大厂Android工程师必备技能体系+学习路线!
AES中ECB模式的加密与解密(Python3.7)
4G LTE/EPC 协议栈
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
8年经验面试官详解 Java 面试秘诀
java进阶(四)------java编程规范---代码质量检测工具FindBugs、PMD和CheckStyle的安装
你不得不了解的卷积神经网络发展史
cost time: 0.6428999900817871s

说明

解释1:此处为异步的上下文管理器,是aiohttp官方文档提供的写法。如果对上下文管理器不是很了解的话,可以参看【吃透Python上下文管理器】

用时:0.6428999900817871s。从两种爬虫的输出结果中可以看到:

  • 文章标题的顺序不同。同步爬虫会按照urls内部的url顺序依次爬取文章标题。而异步爬虫爬取的顺序并不完全和urls中的url顺序相同。
  • 爬取速度差异很大。异步爬虫速度大概是普通同步爬虫的8~10倍。异步爬虫充分利用了网络请求这段时间。从而提高了爬取效率。

关于aiohttp的更多用法。会在后面文章讲到。

推荐阅读

深入理解协程(一):协程的引入

深入理解协程(二):yield from实现异步协程

深入理解协程(三):async/await实现异步协程

Python进阶:上下文管理器

关注公众号西加加先生一起玩转Python

最新文章

  1. CSharpGL(20)用unProject和Project实现鼠标拖拽图元
  2. ctex moderncv版本更新--用latex写一个漂亮的简历
  3. JSP页面跳转方式
  4. 【风马一族_xml】xml的两种解析思想
  5. JDK 动态代理实现原理
  6. 百度bae定时任务使用方法
  7. android中ListView点击和里边按钮点击不能同时生效问题解决
  8. 关于编译Lambda时报告返回的为void的错误
  9. Keil C51.uew
  10. 设计模式值六大原则——开闭原则(OCP)
  11. selenium切换窗口
  12. centos6.5-vsftp搭建
  13. 【原创】大叔问题定位分享(7)Spark任务中Job进度卡住不动
  14. python精进之路1---基础数据类型
  15. 芯灵思Sinlinx A64 linux 通过设备树写LED驱动(附参考代码,未测试)
  16. 【Linux命令】Linux下的tar压缩解压缩命令详解(转)
  17. 潭州课堂25班:Ph201805201 第四课:Linux的命令以及VIM的使用 (课堂笔记)
  18. 显示定位方法,提取中间text 封装成函数的方法
  19. .net 中使用oracle 的sql 语句
  20. Nginx 如何设置反向代理

热门文章

  1. 2018-8-10-VisualStudio-合并代码文件
  2. 【9307】&【a303】过河卒(NOIP2002)
  3. P1038 间谍入侵
  4. tensorflow在文本处理中的使用——辅助函数
  5. Recall(召回率);Precision(准确率);F1-Meature(综合评价指标);true positives;false positives;false negatives..
  6. CSS 高度居中方案
  7. IntPtr、Struct 相互转换
  8. 超详细!如何利用Huginn制作专属RSS
  9. 为什么在做微服务设计的时候需要DDD?
  10. spring注解之@Import注解的三种使用方式