Scrapy - 动态等待页面加载 - selenium + scrapy

时间:2017-09-18 11:56:21

标签: python selenium web-scraping scrapy

我最近用python和Selenium创建了一个webscraper,我发现它很简单。该页面使用ajax调用来加载数据,最初我等待一个固定的time_out来加载页面。这工作了一段时间。 之后,我发现selenium有一个内置函数,WebDriverWait可以使用wait.until()等待加载特定元素。 这使我的webscraper运行得更快。

问题是,我仍然对结果不满意。我每页平均花了1.35秒来下载内容。

我试图对此进行并列化,但时间并没有变得更好,因为如果驱动程序实例(使用Chrome或PhantomJS)占用了大部分的抓取时间,那么创建时间会很短。

所以我转向了scrapy。 在完成教程并且已经编写了解析器之后,我的两个问题是:

1)scrapy是否会在paralel中自动运行多个url请求?

2)如何使用scrapy设置动态超时,例如Selenium的WebDriverWait wait.until()

3)如果没有可用于scrapy的动态设置时间,并且解决方案是使用scrapy + selenium,让硒等到内容加载,是否真的有使用scrapy的任何优势?我可以使用selenium选择器简单地检索数据,就像我在使用scrapy之前所做的那样

谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

  1. 是的,Scrapy可以同时处理多个请求,这些请求是异步计划和处理的。这意味着Scrapy不需要等待请求完成和处理,它可以在此期间发送另一个请求或执行其他操作。简而言之,它非常快,可以配置为完全符合您的要求。
    1. Splashjavascript rendering service。它是一个带有HTTP API的轻量级Web浏览器,使用Twisted和QT5在Python 3中实现。在Scrapy中使用此功能,您可以使用与Selenium类似的动态内容。 通过默认 Splash 等待来加载所有远程资源,但在大多数情况下,最好不要永远等待它们。要在超时后中止资源加载并为整个页面提供渲染使用资源超时的机会,可以设置splash.resource_timeoutrequest:set_timeout
      1. 同样,我感觉到的最大区别在于不同实现的抓取过程的速度。而且由于Scrapy处理事物Asynchronously,这使它比其他事物更具优势。