首页 文章

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

提问于
浏览
2

我最近用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真的有什么优势吗?我可以使用硒选择器简单地检索数据,就像我在使用scrapy之前所做的那样

谢谢你的帮助 .

1 回答

  • 1
    • 是的,Scrapy可以处理 multiple requests concurrently ,它们被安排和处理 asynchronously . 这意味着Scrapy不需要等待请求完成和处理,它可以在此期间发送另一个请求或执行其他操作 . 简而言之,它的速度极快,可以配置为完全符合您的要求 .

    • Splashjavascript rendering service . 它是一个带有HTTP API的轻量级Web浏览器,使用Twisted和QT5在Python 3中实现 . 在Scrapy中使用它,您可以像使用Selenium一样使用_512530 . 通过 default Splash waits 来加载所有远程资源,但在大多数情况下最好不要永远等待它们 . 要在超时后中止资源加载并为整个页面提供渲染使用资源超时的机会,可以设置 splash.resource_timeoutrequest:set_timeout .

    • 同样,我感觉到的最大区别在于不同实现的抓取过程的 speed . 而且,由于Scrapy处理事情 Asynchronously ,这使它比其他人更有优势 .

相关问题