在Python中实现异步爬虫,通常使用`asyncio`库来管理异步任务,结合`aiohttp`库进行异步HTTP请求。以下是一个简单的异步爬虫示例,使用`asyncio`和`aiohttp`爬取网页内容并保存到MongoDB中:
import asyncio
import aiohttp
from motor.motor_asyncio import AsyncIOMotorClient
连接MongoDB
client = AsyncIOMotorClient('mongodb://localhost:27017')
db = client['mydatabase']
collection = db['mycollection']
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def save_to_db(url, content):
await collection.insert_one({'url': url, 'content': content})
async def main():
urls = [
'https://example.com/page1',
'https://example.com/page2',
更多URL...
]
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
pages = await asyncio.gather(*tasks)
for url, page in zip(urls, pages):
await save_to_db(url, page)
运行事件循环
asyncio.run(main())
关键点解释:
异步HTTP请求:
使用`aiohttp.ClientSession().get(url)`发起异步HTTP请求。
并发执行:
使用`asyncio.gather`并发执行多个请求任务。
异步保存数据:
使用`motor.motor_asyncio.AsyncIOMotorClient`将爬取到的数据异步保存到MongoDB中。
异步爬虫的优势:
高并发:能够充分利用系统资源,提高爬取效率。
低延迟:异步操作允许在等待I/O操作(如网络请求)完成时执行其他任务。
资源利用:相比于多线程或多进程,异步编程更高效地利用系统资源,避免过多的线程或进程创建和销毁。
注意事项:
错误处理:实际应用中应添加错误处理逻辑,以应对网络请求失败或数据存储错误等情况。
限速和合规性:遵守目标网站的爬虫政策,合理控制爬取频率,避免对服务器造成过大压力。
以上示例展示了如何使用Python的异步编程特性来构建一个简单的爬虫,实际应用中可以根据需求进行扩展和优化