【问题标题】:Scrapy and Splash times out for a specific site特定站点的 Scrapy 和 Splash 超时
【发布时间】:2018-06-27 13:54:34
【问题描述】:

在尝试从该site 获取响应时,我遇到了ScrapyCrawleraSplash 的问题。

我尝试了以下没有运气:

  • Scrapy shell - 超时
  • Scrapy + Crawlera - 超时
  • Scrapinghub Splash 实例(小)- 超时

但是,我可以使用 Selenium 的 Firefox 网络驱动程序抓取该站点。但我想摆脱这种情况并改用Splash

是否有避免这些超时的解决方法?

注意:

如果我使用由 aquarium 设置的本地 Splash 实例,则站点会加载,尽管与 Firefox 网络驱动程序的 10 秒相比,它仍然需要 20 多秒。

【问题讨论】:

  • 有什么对你有用的吗?
  • @DavidKong 最后找到了一种仅使用请求而不使用无头浏览器的方法来抓取它。

标签: web-scraping scrapy scrapy-splash scrapinghub splash-js-render


【解决方案1】:

您可以使用 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)

【讨论】:

  • 感谢您的回答。我已经尝试在 Splash 中设置自定义 User-Agent 标头,但没有运气。但我会重新检查以确保!
【解决方案2】:

尝试增加 Splash 的超时时间。如果您使用 Docker 运行 Splash,请将参数 --max-timeout 设置为更大的值,例如3600(欲了解更多信息,请查看documentation)。

接下来,在您的 Splash 请求中,还要创建超时。如果您使用scrapy-splash 库,则将SplashRequest 参数timeout 设置为更高的值,例如3600。像这样:

yield scrapy_splash.SplashRequest(
        url, self.parse, endpoint='execute',
        args={'lua_source': script, 'timeout': 3600})

【讨论】:

  • 是的,我可以这样做,但我认为这不是正确的方法。当一个站点可以在 3 秒内加载完毕,为什么要设置 3600 秒的超时时间?还有其他加快飞溅速度的选项吗?
  • 试一试,看看它是否有帮助并解决问题。如果是这样,您总是可以考虑更好的方法。另外,请查看我在答案中链接的文档,有一整节专门讨论此类问题。
  • 好吧,我似乎无法为 Scrapinghub 上托管的 Splash 实例设置最大超时。我也像一千次一样浏览了这些文档,但没有用。除此之外,我认为它在某种程度上与一些反刮擦解决方案有关,因为我只是不明白为什么 Splash 需要这么长时间才能呈现页面,也许该网站有一些特定的防御措施。我还使用了各种标题,例如:User-Agent、Referer 以获得不同的结果,但没有运气。
  • 我确定有办法,只需在support 上联系他们。
  • 当您尝试使用 Splash Web 控制台呈现页面时,您可以看到时间。还有其他技巧,例如设置resource_timeout 以加快渲染过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 2017-11-21
  • 1970-01-01
相关资源
最近更新 更多