尝试请求页面时读取超时

Din*_*ero 0 python beautifulsoup web-scraping python-requests

我正在尝试抓取网站,有时会收到此错误,这令人担忧,因为我随机收到此错误,但在重试后,我没有收到此错误。

requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='www.somewebsite.com', port=443): Read timed out. (read timeout=None)
Run Code Online (Sandbox Code Playgroud)

我的代码如下所示

from bs4 import BeautifulSoup
from random_user_agent.user_agent import UserAgent
from random_user_agent.params import SoftwareName, OperatingSystem
import requests

software_names = [SoftwareName.CHROME.value]
operating_systems = [OperatingSystem.WINDOWS.value, OperatingSystem.LINUX.value]
user_agent_rotator = UserAgent(software_names=software_names, operating_systems=operating_systems, limit=100)
pages_to_scrape = ['https://www.somewebsite1.com/page', 'https://www.somewebsite2.com/page242']

for page in pages_to_scrape:
  time.sleep(2)
  page = requests.get(page, headers={'User-Agent':user_agent_rotator.get_random_user_agent()})
  soup = BeautifulSoup(page.content, "html.parser")
  # scrape info 
Run Code Online (Sandbox Code Playgroud)

正如您从我的代码中看到的,我什至使用 Time 使我的脚本休眠几秒钟,然后再请求另一个页面。我还使用随机的 user_agent。我不确定是否可以做任何其他事情来确保我永远不会收到“读取超时”错误。

我也遇到过这个,但他们似乎建议向标题添加额外的值,但我不确定这是否是一个通用的解决方案,因为这可能必须根据网站的具体情况而定。我还在另一篇SO Post上读到,我们应该对请求进行 Base64 处理并重试。这让我很困惑,因为我不知道该怎么做,而且这个人也没有提供例子。

任何有刮擦经验的人的建议将不胜感激。

αԋɱ*_*cαη 5

嗯,我已经验证了你的问题。基本上该网站正在使用AkamaiGHost防火墙。

\n\n
curl -s -o /dev/null -D - https://www.uniqlo.com/us/en/men/t-shirts\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此输入图像描述

\n\n

如果您的请求无效User-Agent且应该有效,它将阻止您的请求stable。您不需要在每次请求时都更改它。您还需要使用requests.Session()来持久化session并且不导致TCP层丢弃数据包,我已经能够在一秒内发送 1k 个请求并且没有被阻止。即使我验证了如果bootstrap我解析了 HTML 源代码是否会阻止请求,但它根本没有。

\n\n

被告知我使用它启动了所有测试,Google DNS这永远不会导致我的线程延迟,这可能导致firewall丢弃请求并将其定义为DDOS attack. 还有一点需要注意。DO NOT USE timeout=None因为这将导致请求永远等待响应,在后端防火墙会自动检测任何TCP listener进入pending state并自动丢弃它并阻止origin IP您。这是基于配置的时间:) \xe2\x80\x93

\n\n
curl -s -o /dev/null -D - https://www.uniqlo.com/us/en/men/t-shirts\n
Run Code Online (Sandbox Code Playgroud)\n\n

在线运行

\n