从Python请求中克服ReadTimeout

时间:2019-01-30 19:10:41

标签: python python-requests

我正在尝试使用Python和请求抓取Home Depot网站。 Selenium Webdriver可以很好地工作,但是会花费太多时间,因为目标是在本地油漆厂和电动工具厂之间建立一个对时间敏感的价格比较工具。

当我向其他网站发送请求时,它的工作原理与往常一样。如果我使用任何浏览器手动导航到网站,它也可以正常工作(带有或不带有会话数据/ cookie数据)。我尝试将随机标头添加到请求中,但这似乎无济于事。据我所知,在每个时间段内发送太多请求不是一个问题(考虑到硒和手动浏览在任何时候都仍然有效。)我相信这个特定问题并不是因为速率限制。 / p>

我的代码:

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,但是任何与硒一样运行速度很快的方法都适用。我了解自己被封锁了,我的问题不是“什么事情阻止了我进行抓取?”,而是“我该怎么做才能进一步人性化我的抓取器,从而使我能够继续?'

1 个答案:

答案 0 :(得分:1)

该错误来自用户代理。 Selenium工作而不发出请求的原因是因为Selenium正在使用Web驱动程序发出请求,因此请求humanlike较多,而请求更容易被检测为脚本。从Home Depot's robots.txt page起,似乎不允许产品被刮擦。我只是使用此代码,并通过使用以下代码获得了响应:

type Record<K extends keyof any, T> = {[P in K]: T};

通过使用这些用户代理,您可以“欺骗”网站,使您认为自己是真实的人,而Selenium的Web驱动程序就是这样做的。