首页 > 解决方案 > 从 Python 请求中获取过去的 ReadTimeout

问题描述

我正在尝试使用 Python 和请求来抓取 Home Depot 网站。Selenium Webdriver 工作正常,但需要太多时间,因为目标是在当地油漆店和电动工具店之间制作一个时间敏感的价格比较工具。

当我向任何其他网站发送请求时,它正常工作。如果我使用任何浏览器手动导航到网站,它也可以正常工作(有或没有会话数据/cookie 数据)。我尝试在请求中添加随机标头,但这似乎对解决问题没有帮助。从我所见,这不是每个时间段发送太多请求的问题,(考虑到硒和手动浏览在任何时候仍然有效。)我相信这个特定问题不是因为速率限制。

我的代码:

from random import choice
import requests
import traceback

list_desktopagents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36']
def random_headers():
    return {'User-Agent': choice(list_desktopagents),
        'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}

response = requests.get(
    'https://www.homedepot.com/p/BEHR-1-gal-White-Alkyd-Semi-Gloss-Enamel-Alkyd- 
     Interior-Exterior-Paint-390001/300831629', 
     headers=myheaders,
     timeout=10)

我的错误:

raise ReadTimeout(e, request=request)
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='www.homedepot.com', port=443): Read timed out. (read timeout=10)

有没有人建议我还能做些什么来成功收到我的回复?我更喜欢使用 Requests,但是任何与 selenium 不同的运行速度快的东西都是合适的。我知道我被阻止了,我的问题不是“发生了什么阻止我抓取?”,而是“我可以做些什么来进一步使我的抓取器人性化,以便它允许我继续?”

标签: pythonpython-requests

解决方案


错误来自用户代理。Selenium 工作而不是请求的原因是因为 Selenium 使用 Web 驱动程序发出请求,因此它更人性化,而请求更容易被检测为脚本。从Home Depot 的 robots.txt 页面来看,似乎不允许抓取产品。我刚刚使用了这段代码并通过使用这段代码得到了响应:

headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
response = requests.get('https://www.homedepot.com/p/BEHR-1-gal-White-Alkyd-Semi-Gloss-Enamel-Alkyd-Interior-Exterior-Paint-390001/300831629', headers=headers)    

print(response.content)

通过使用这些用户代理,您可以“诱骗”网站认为您是一个真实的人,这就是 Selenium 的 Web 驱动程序所做的。


推荐阅读