使用aiohttp库实现异步爬虫进行优化

简介: 这篇文章我们详细介绍aiohttp库的用法和爬取实战

在日常爬虫工作中,我们经常使用requests库去爬取某个站点的数据,但是每发出一个请求,程序必须等待网站返回响应才能接着运行,而在整个爬虫过程中爬虫程序是一直在等待的,实际上没有做任何事情。像这种占用磁盘/内存IO、网络IO的任务,大部分时间是CPU在等待的操作,就叫IO密集型任务。对于这种情可以考虑使用aiohttp库实现异步爬虫进行优化。
这篇文章我们详细介绍aiohttp库的用法和爬取实战。aiohttp 是一个支持异步请求的库,它和 asyncio 配合使用,可以使我们非常方便地实现异步请求操作。aiohttp请求的方法和之前有明显区别,主要包括如下几点:

  1. 除了导入aiohttp库,还必须引入asyncio库,因为要实现异步,需要启动协程。
  2. 异步的方法定义不同,前面都要统一加async来修饰。
  3. with as用于声明上下文管理器,帮我们自动分配和释放资源,加上async代码支持异步。

在一些大型数据爬虫中,对并发的要求很高,而aiohttp可以支持非常高的并发量,但面对高并发网站可能会承受不住,随时有挂掉的危险,这时需要对并发进行一些控制。比如这里我们使用aiohttp来爬取新闻微博数据,因为目标网站反爬机制比较严,所以需要爬取过程中需要加上不同的代理IP和header,实例如下

import asyncio
import aiohttp
from aiohttp_socks import ProxyConnector
import random

# 定义目标网站和代理服务器的列表
urls = ["weibo.com/?sudaref=www.baidu.com"
proxies = ["socks5://16yun:16ip@www.16yun.cn:8888", "socks5://16yun:16ip@www.16yun.cn:11111", "socks5://username:password@host3:port3"]

# 定义用户代理的列表
user_agents = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_6_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Safari/605.1.15",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 15_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15 Mobile/15E148 Safari/604.1"
]

# 定义异步函数来发送GET请求,并使用不同的代理服务器和头部来连接目标网站
async def fetch(url):
    try:
        # 随机选择一个代理服务器和一个用户代理
        proxy = random.choice(proxies)
        user_agent = random.choice(user_agents)
        
        # 创建一个aiohttp_socks.ProxyConnector对象,用来设置代理服务器的参数    
        connector = ProxyConnector.from_url(proxy)
        
        # 创建一个字典,用来设置头部参数    
        headers = {"User-Agent": user_agent}
        
        # 创建并启动一个aiohttp.ClientSession对象,用来发送HTTP请求,并传入connector和headers参数    
        async with aiohttp.ClientSession(connector=connector, headers=headers) as session:
            async with session.get(url) as response:
                # 检查响应状态码是否为200,否则抛出异常
                if response.status != 200:
                    raise Exception(f"Bad status code: {response.status}")
                # 返回响应内容的文本格式
                return await response.text()
                
            # 在每次请求之后关闭会话    
            await session.close()
            
    except Exception as e:
        # 打印异常信息,并返回None
        print(e)
        return None

# 定义异步主函数来创建并运行多个协程任务,并控制并发数量和超时时间等参数    
async def main():
    # 创建一个空列表,用来存储所有的协程任务        
    tasks = []
    # 循环遍历目标网站列表,每次创建一个fetch函数的协程任务,并添加到列表中        
    for url in urls:
        task = asyncio.create_task(fetch(url))
        tasks.append(task)
        
    # 使用asyncio.gather函数来收集并执行所有的协程任务,并返回一个包含所有结果的列表        
    results = await asyncio.gather(*tasks)
    
    # 打印结果列表    
    print(results)

# 在程序入口处调用异步主函数,并启动事件循环         
if __name__ == "__main__":
     asyncio.run(main())
相关文章
|
10天前
|
数据采集 存储 JSON
Python爬取知乎评论:多线程与异步爬虫的性能优化
Python爬取知乎评论:多线程与异步爬虫的性能优化
|
2月前
|
数据采集 安全 网络安全
使用aiohttp实现异步HTTPS爬虫的SSL优化
使用aiohttp实现异步HTTPS爬虫的SSL优化
194 81
|
1天前
|
数据采集 监控 网络协议
基于aiohttp的高并发爬虫实战:从原理到代码的完整指南
在数据驱动时代,传统同步爬虫效率低下,而基于Python的aiohttp库可构建高并发异步爬虫。本文通过实战案例解析aiohttp的核心组件与优化策略,包括信号量控制、连接池复用、异常处理等,并探讨代理集成、分布式架构及反爬应对方案,助你打造高性能、稳定可靠的网络爬虫系统。
25 0
|
7天前
|
数据采集 机器学习/深度学习 边缘计算
Python爬虫动态IP代理报错全解析:从问题定位到实战优化
本文详解爬虫代理设置常见报错场景及解决方案,涵盖IP失效、403封禁、性能瓶颈等问题,提供动态IP代理的12种核心处理方案及完整代码实现,助力提升爬虫系统稳定性。
40 0
|
1月前
|
数据采集 存储 Web App开发
多线程爬虫优化:快速爬取并写入CSV
多线程爬虫优化:快速爬取并写入CSV
|
2月前
|
数据采集 存储 监控
Scrapy框架下地图爬虫的进度监控与优化策略
Scrapy框架下地图爬虫的进度监控与优化策略
|
2月前
|
数据采集 人工智能 边缘计算
爬虫IP代理效率优化:策略解析与实战案例
本文深入探讨了分布式爬虫中代理池效率优化的关键问题。首先分析了代理效率瓶颈的根源,包括不同类型代理的特点、连接耗时及IP失效问题。接着提出了六大核心优化策略:智能IP轮换矩阵、连接复用优化、动态指纹伪装、智能重试机制等,并结合电商价格监控、社交媒体舆情分析和金融数据抓取三个实战案例,展示了优化效果。同时建立了三维效率评估体系,从质量、成本和稳定性全面衡量性能。最后展望了AI驱动调度、边缘计算融合等未来演进方向,帮助爬虫系统实现从“暴力采集”到“智能获取”的进化,大幅提升效率并降低成本。
81 0
|
3月前
|
数据采集 存储 网络协议
Java HttpClient 多线程爬虫优化方案
Java HttpClient 多线程爬虫优化方案
|
8月前
|
数据采集 JSON 测试技术
Python爬虫神器requests库的使用
在现代编程中,网络请求是必不可少的部分。本文详细介绍 Python 的 requests 库,一个功能强大且易用的 HTTP 请求库。内容涵盖安装、基本功能(如发送 GET 和 POST 请求、设置请求头、处理响应)、高级功能(如会话管理和文件上传)以及实际应用场景。通过本文,你将全面掌握 requests 库的使用方法。🚀🌟
1406 7
|
3月前
|
数据采集 测试技术 C++
无headers爬虫 vs 带headers爬虫:Python性能对比
无headers爬虫 vs 带headers爬虫:Python性能对比