首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
1.1 HTTP基本原理
1.2 Web 网页基础
1.3 爬虫的基本原理
1.4 Session和Cookie
1.5 代理的基本原理
1.6 多线程和多进程的基本原理
2.1 urllib的使用
2.2 requests的使用
2.3 正则表达式
2.4 httpx的使用
2.5 基础爬虫案例实战
3.1 XPath的使用
3.2 Beautiful Soup的使用
3.3 pyquery的使用
3.4 parsel 的使用
4.1 TXT 文本文件存储
4.2 JSON 文件存储
4.3 CSV 文件存储
4.4 MySQL 存储
4.5 MongoDB 文档存储
4.6 Redis缓存存储
4.7 Elasticsearch 搜索引擎存储
4.8 RabbitMQ 的使用
5.1 什么是 Ajax
5.2 Ajax分析方法
5.3 Ajax 分析与爬取实战
6.1 协程的基本原理
6.2 aiohttp的使用
6.3 aiohttp 异步爬取实战
7.1 Selenium 的使用
7.2 Splash 的使用
7.3 Pyppeteer 的使用
7.4 Playwright 的使用
7.5 Selenium 爬取实战
7.6 Pyppeteer 爬取实战
7.7 CSS 位置偏移反爬案例分析与爬取实战
7.8 字体反爬案例分析与爬取实战
8.1 使用 OCR 技术识别图形验证码
8.2 使用 OpenCV 识别滑动验证码的缺口
8.3 使用深度学习识别图形验证码
8.4 使用深度学习识别滑动验证码的缺口
8.5 使用打码平台识别验证码
8.6 手机验证码的自动化处理
9.1 代理的设置
9.2 代理池的维护
9.3 付费代理的使用
9.4 ADSL 拨号代理的搭建方法
9.5 代理反爬案例爬取实战
10.1 模拟登录的基本原理
10.2 基于Session和Cookie的模拟登录爬取实战
10.3 基于JWT的模拟登录爬取实战
10.4 大规模账号池的搭建
11.1 网站加密和混淆技术简介
11.2 浏览器调试常用技巧
11.3 JavaScript Hook 的使用
11.4 无限 debugger 的原理与绕过
11.5 使用 Python 模拟执行 JavaScript
11.6 使用 Node.js 模拟执行 JavaScript
11.7 浏览器环境下 JavaScript 的模拟执行
11.8 AST 技术简介
11.9 使用 AST 技术还原混淆代码
11.10 特殊混淆案例的还原
11.11 WebAssembly 案例分析和爬取实战
11.12 JavaScript 逆向技巧总结
11.13 JavaScript 逆向爬取实战
当前位置:
首页>>
技术小册>>
Python3网络爬虫开发实战(上)
小册名称:Python3网络爬虫开发实战(上)
### 6.3 aiohttp 异步爬取实战 在网络爬虫的开发过程中,性能优化始终是一个重要的议题。随着网络数据的日益庞大和复杂,传统的同步请求方式在处理大规模数据抓取时显得力不从心。`aiohttp` 作为 Python 中的一个强大异步 HTTP 客户端/服务端框架,为构建高效的网络爬虫提供了有力的支持。本章将深入介绍如何使用 `aiohttp` 进行异步爬取实战,包括基础概念、安装配置、请求发送、数据解析以及错误处理等关键步骤。 #### 6.3.1 aiohttp 简介 `aiohttp` 是一个基于 asyncio 的异步 HTTP 客户端/服务器框架,支持客户端和服务器两端的异步操作。它提供了丰富的功能和良好的性能,非常适合用于构建需要处理大量并发请求的网络爬虫。与传统同步 HTTP 客户端(如 `requests`)相比,`aiohttp` 能够利用 Python 的 `asyncio` 库实现非阻塞的 I/O 操作,从而显著提高爬取效率。 #### 6.3.2 安装 aiohttp 在开始使用 `aiohttp` 之前,首先需要确保它已经安装在你的 Python 环境中。可以通过 pip 命令轻松安装: ```bash pip install aiohttp ``` 此外,如果你打算使用异步的 HTTP 服务器,可能还需要安装 `aiohttp` 的服务端组件,但这在大多数爬虫项目中不是必需的。 #### 6.3.3 异步爬取基础 异步爬取的核心在于利用 `asyncio` 库来并发执行多个 HTTP 请求。`aiohttp` 提供了 `ClientSession` 类,用于管理多个请求和响应的会话。以下是一个基本的异步爬取示例: ```python import aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(): async with aiohttp.ClientSession() as session: html1 = await fetch(session, 'http://example.com/page1') html2 = await fetch(session, 'http://example.com/page2') # 这里可以添加更多异步请求 # 处理响应数据 print(html1) print(html2) # Python 3.7+ asyncio.run(main()) ``` 在上述代码中,`fetch` 函数是一个异步函数,它接收一个 `aiohttp.ClientSession` 实例和一个 URL,然后发送 GET 请求并返回响应的文本内容。`main` 函数则负责创建会话并并发地调用 `fetch` 函数来获取两个页面的内容。 #### 6.3.4 并发控制 虽然 `aiohttp` 允许你并发地发送多个请求,但无限制地增加并发数可能会导致目标网站因压力过大而采取反爬措施,如限制 IP 访问频率、验证码验证等。因此,合理控制并发数是异步爬取中的一个重要策略。 `aiohttp` 并没有直接提供限制并发的内置机制,但你可以使用 `asyncio.Semaphore` 来控制同时进行的任务数: ```python import aiohttp import asyncio async def fetch(session, url, semaphore): async with semaphore: async with session.get(url) as response: return await response.text() async def main(): concurrency = 10 # 并发数 semaphore = asyncio.Semaphore(concurrency) urls = ['http://example.com/page{}'.format(i) for i in range(1, 21)] tasks = [] async with aiohttp.ClientSession() as session: for url in urls: task = asyncio.create_task(fetch(session, url, semaphore)) tasks.append(task) # 等待所有任务完成 results = await asyncio.gather(*tasks) for result in results: print(result[:100]) # 示例:仅打印前100个字符 asyncio.run(main()) ``` 在这个示例中,我们使用 `asyncio.Semaphore` 来限制同时进行的 HTTP 请求数量,从而避免对目标网站造成过大的压力。 #### 6.3.5 数据解析 在获取到网页的 HTML 内容后,接下来需要进行数据解析以提取所需的信息。虽然 `aiohttp` 主要负责 HTTP 请求的发送和接收,但你可以结合其他库(如 `BeautifulSoup`、`lxml` 或正则表达式)来进行数据解析。 例如,使用 `BeautifulSoup` 解析 HTML 内容: ```python from bs4 import BeautifulSoup async def parse_html(html): soup = BeautifulSoup(html, 'html.parser') # 假设我们要提取所有标题 titles = [title.get_text() for title in soup.find_all('h1')] return titles # 在 main 函数中调用 parse_html # ... titles = await asyncio.gather(*[parse_html(html) for html in results]) for title_list in titles: for title in title_list: print(title) ``` #### 6.3.6 错误处理 在网络爬虫中,错误处理是一个不可或缺的环节。由于网络状况的不稳定性和目标网站结构的频繁变动,请求可能会失败或返回非预期的结果。因此,在编写爬虫时,应该添加适当的错误处理逻辑来增强代码的健壮性。 `aiohttp` 提供了丰富的异常类型,你可以通过捕获这些异常来处理各种可能的错误情况: ```python async def fetch_with_error_handling(session, url): try: async with session.get(url) as response: response.raise_for_status() # 抛出异常如果响应状态码不是 200-299 return await response.text() except aiohttp.ClientError as e: print(f"Error for {url}: {e}") return None # 在 main 函数中调用 fetch_with_error_handling # ... ``` #### 6.3.7 总结 通过本章的学习,你应该已经掌握了如何使用 `aiohttp` 进行异步网络爬取的基本技能。从安装配置、请求发送、数据解析到错误处理,每一步都是实现高效爬取的关键。在实际项目中,你可能还需要根据目标网站的具体情况和爬取需求,对爬虫进行进一步的优化和调整。记住,合理控制并发数、妥善处理异常、遵守网站的爬虫协议,是构建可靠、高效网络爬虫的重要原则。
上一篇:
6.2 aiohttp的使用
下一篇:
7.1 Selenium 的使用
该分类下的相关小册推荐:
Python合辑5-格式化字符串
Python爬虫入门与实战开发(上)
Python合辑7-集合、列表与元组
剑指Python(磨刀不误砍柴工)
Python合辑11-闭包函数
Python数据分析与挖掘实战(下)
Python合辑3-字符串用法深度总结
Python合辑2-字符串常用方法
Python编程轻松进阶(一)
Python机器学习基础教程(上)
Python3网络爬虫开发实战(下)
Python合辑6-字典专题