Web scraping 特定站点的刮擦和飞溅超时
我在尝试从中获取响应时遇到了Web scraping 特定站点的刮擦和飞溅超时,web-scraping,scrapy,scrapy-splash,scrapinghub,splash-js-render,Web Scraping,Scrapy,Scrapy Splash,Scrapinghub,Splash Js Render,我在尝试从中获取响应时遇到了Scrapy、Crawlera和Splash问题 我尝试了以下方法,但运气不佳: 纯Scrapyshell-超时 Scrapy+Crawlera-超时 ScrapinghubSplash实例(小)-超时 不过,我可以使用Selenium的Firefox Web驱动程序来抓取该站点。但我不想这样,而是想使用Splash 是否有避免这些超时的解决方法 注: 如果我使用由站点加载设置的本地Splash实例,尽管与Firefox webdriver的10秒相比仍然需要20
Scrapy
、Crawlera
和Splash
问题
我尝试了以下方法,但运气不佳:
- 纯
shell-超时Scrapy
+Scrapy
-超时Crawlera
- Scrapinghub
实例(小)-超时Splash
Selenium
的Firefox Web驱动程序来抓取该站点。但我不想这样,而是想使用Splash
是否有避免这些超时的解决方法
注:
如果我使用由站点加载设置的本地
Splash
实例,尽管与Firefox webdriver的10秒相比仍然需要20多秒。尝试增加Splash的超时时间。如果使用Docker运行Splash,请将参数--max timeout
设置为更大的值,例如3600
(有关更多信息,请查看)
接下来,在Splash请求中,还要增加超时。如果使用库,则将SplashRequest
参数timeout
设置为更高的值,例如3600
。像这样:
yield scrapy_splash.SplashRequest(
url, self.parse, endpoint='execute',
args={'lua_source': script, 'timeout': 3600})
您可以使用scrapy shell重试请求,并在标头中设置用户代理。对我来说,使用这种方法只需几秒钟。使用默认用户代理导致站点断开连接。默认用户代理声明您正在使用scrapy,因此站点选择断开连接是有意义的 替换自定义用户代理以匹配您自己的浏览器或首选用户代理以及url。您可以尝试使用以下步骤,然后在浏览器中查看响应:
scrapy shell
url = "https://www.yoururl.com"
request = scrapy.Request(url, headers={'User-Agent': 'custom user agent'})
fetch(request)
view(response)
是的,我能做到,但我认为这不是正确的方法。当一个站点可以在3秒内加载时,我为什么要设置3600秒的超时?还有其他加速飞溅的方法吗?试一下,看看是否有帮助并解决问题。如果是这样的话,你可以考虑更好的方法。另外,看看我在答案中链接的文档,有一整节专门讨论这些问题。我似乎无法为Scrapinghub上托管的Splash实例设置最大超时。我也读了上千遍这些文件,但都没用。除此之外,我认为它在某种程度上与一些反刮解决方案有关,因为我不明白为什么Splash需要如此长的时间来呈现页面,也许网站有一些特定的防御措施。此外,我还使用了各种标题,如:User Agent、Referer,以获得不同的结果,但没有运气。我相信有一种方法,只需继续使用它们。当您尝试使用Splash web控制台呈现页面时,您可以看到计时。还有其他技巧,例如设置以加快渲染过程。谢谢您的回答。我已经尝试在Splash中设置自定义用户代理标题,但运气不好。但我会再检查一遍的!有什么对你有用吗?@DavidKong最后找到了一种方法,只使用请求而不使用无头浏览器。