将 Selenium 与 Scrapy 集成
Posted
技术标签:
【中文标题】将 Selenium 与 Scrapy 集成【英文标题】:Integrating Selenium with Scrapy 【发布时间】:2015-10-02 03:25:10 【问题描述】:有没有什么方法可以有效地将 Selenium 集成到 Scrapy 中以实现其页面渲染功能(以生成屏幕截图)?
我见过的很多解决方案只是在 WebDriver Scrapy 已经处理了请求之后抛出一个 Scrapy 请求/响应 URL,然后就可以解决这个问题。这会创建两倍的请求,在很多方面都失败(需要登录的站点、具有动态或伪随机内容的站点等),并使许多扩展/中间件无效。
有没有什么“好”的方法可以让两者一起工作?有没有更好的方法来生成我正在抓取的内容的屏幕截图?
【问题讨论】:
【参考方案1】:使用 Scrapy 的 Downloader Middleware。请参阅我对另一个问题的回答以获取一个简单的示例:https://***.com/a/31186730/639806
【讨论】:
我看过这个,虽然它确实解决了其中一个问题(请求加倍),但它绕过了 Scrapy 提供的许多功能。它丢弃用户代理配置、代理配置、标头,并在调用之间提供零持久性(无会话/cookie)。此外,在 Selenium 中无法提交 POST 请求,因此 FormRequests 之类的东西会中断或产生非常意外的结果。 它确实绕过了这些东西。这是一个非常简单的示例,但其中很多东西可以在 Selenium 中复制(例如 cookie、标头和用户代理字符串)。事实上,您可以使用作为参数提供给process_request
方法的请求信息来提取大部分信息。此外,您不需要通过 Selenium 发布。在拉取 Selenium 响应后,您没有理由不能通过 parse
中的 Scrapy 做到这一点。
FormRequest 不会在通过时被 Selenium 下载器中间件“劫持”,然后被 Selenium 处理为 driver.get(url)”吗?如何防止?跨度>
使用条件(例如,if should_process_js(request):
),如果任何条件为假(例如请求是 POST 或您决定的任何内容),只需返回 return request
即可继续正常处理。
我已经解决了这个问题并发现了其他问题,我很好奇你是否有任何想法。返回 htmlResponse 不会触发 response_downloaded 信号,并且任何依赖它的东西都会中断(例如节流)。 CustomHeaders,最重要的是“Referer”不能在WebDriver上手动设置。以上是关于将 Selenium 与 Scrapy 集成的主要内容,如果未能解决你的问题,请参考以下文章
使用scrapy-selenium, chrome-headless抓取动态网页
爬虫5 scrapy框架2 全站爬取cnblogs, scarpy请求传参, 提高爬取效率, 下载中间件, 集成selenium, fake-useragent, 去重源码分析, 布隆过滤器,