c 抓取网页数据(我试图通过删除阻止的I/O来加快Web抓取的速度 )

优采云 发布时间: 2022-01-14 20:00

  c 抓取网页数据(我试图通过删除阻止的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()

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线