【问题标题】:How to alter request handling?如何更改请求处理?
【发布时间】:2014-07-31 19:09:06
【问题描述】:

是否可以在 Scrapy 中更改请求处理? 例如,如果我希望特定的 URL 必须不是由 scrapys 标准机器请求,而是由 Selenium 请求,并让我能够使用 Selenium 驱动程序方法对其进行操作。

怎么做?

【问题讨论】:

  • 你读过Downloader Middleware吗?如果是这样,它怎么不是你想要的,或者你被困在哪里?如果没有,为什么不去读呢?
  • @abarnert 下载器中间件无法覆盖 url 的下载方式。
  • 可以。再读一遍。为什么你认为它被称为 downloader 中间件?如果HttpCacheMiddleware不能阻止正常下载,您认为它会如何工作?

标签: python selenium web-scraping scrapy


【解决方案1】:

您不必更改请求,只需在您的蜘蛛中执行 Selenium。

def parse(self, response):
    browser = webdriver.Firefox()
    for i in response.xpath("//a/@href").extract():
        browser.get(i)
        #then do other stuff

但根据我的经验,很少有事情是你无法单独使用scrapy 完成的。 你有一个链接来显示你正在寻找什么样的东西?

【讨论】:

  • 您的代码执行了不必要的请求,而我想覆盖处理请求的方式。
  • 不,这里没有多余的东西,每件作品都有自己的用途。如果你想使用 selenium 处理请求,那么使用 selenium,如果你想使用 scrapy 处理请求,那么使用 scrapy。我不明白它是如何变得比这更容易的。
【解决方案2】:

你想写的是downloader middleware component。您询问是否可以“更改请求处理”;它的介绍说它是一个“用于全局更改 Scrapy 请求和响应的系统”;我不知道你为什么不认为这就是你要找的东西,但如果你继续阅读,它就是它听起来的样子。

DownloaderMiddleware 对象中的关键方法是process_request。正如文档所说:

每个通过下载中间件的请求都会调用此方法。

process_request() 应该:return None,返回 Response 对象,返回 Request 对象,或引发 IgnoreRequest

如果它返回一个Response 对象,Scrapy 不会费心调用任何其他process_request()process_exception() 方法,或相应的下载函数;它会返回那个响应。

因此,您只需编写一个 DownloaderMiddlewareprocess_request 调用 Selenium,处理它返回的内容,然后将其返回包装在 Response 中。

如果不明显,内置的HttpCacheMiddleware 应该演示如何执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2017-02-05
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    相关资源
    最近更新 更多