c 抓取网页数据(我试图通过删除阻止的I/O来加快Web抓取的速度 )
优采云 发布时间: 2022-01-14 20:00c 抓取网页数据(我试图通过删除阻止的I/O来加快Web抓取的速度
)
我正在尝试通过移除阻塞的 I/O 来加速网页抓取,因此我决定将请求包更改为 aiohttp。
不幸的是,在切换到 aiohttp 后,使用 Angular 构建的 网站 给了我一个没有动态内容的响应。
因此,我有以下两个问题,
如果 requests 模块没有像 selenium 那样运行 JS,但 aiohttp 没有运行 JS,为什么 requests 模块可以给我正确的(渲染的)内容?如何修复代码以使用 aiohttp 获取正确的内容?
import aiohttp
import asyncio
import requests
URL = 'https://justjoin.it/'
async def fetch_async(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
return await resp.text()
async def main():
content_async = await fetch_async(URL)
content_requests = requests.get(URL).text
print('Are equal: ', content_async == content_requests)
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
finally:
loop.close()
解决方案
我已经解决了我的问题。 Iain 建议我查看发送到服务器的 headers,在处理 headers 后,我发现返回的内容取决于 User-Agent。
当我使用 'USER-AGENT': 'python-requests/2.22.0' 发送 aiohttp 请求时,我得到的内容与 'Google Bot' 相同,但如果设置了 User-Agent到 'Python/3.6 aiohttp/3.6.2' 或 'Firefox' 我没有渲染内容。
因此,对于某些用户代理,服务器会进行服务器端渲染。
解决方案:
async def fetch_async(url):
async with aiohttp.ClientSession() as session:
async with session.get(url, headers={'User-Agent': 'python-requests/2.22.0'}) as resp:
print('AIOHTTP headers: ', dict(resp.request_info.headers))
return await resp.text()