本文目录:
同步方式爬取博客标题
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 的更多用法. 会在后面文章讲到.
来源: https://www.cnblogs.com/ghostlee/p/12208564.html