【问题标题】:How to Take Advantage of Scrapy's Concurrency With Non-Selenium Requests如何利用 Scrapy 与非 Selenium 请求的并发性
【发布时间】:2020-02-18 02:17:38
【问题描述】:

我在这里遇到了一个有趣的问题。我正在编写一个 Scrapy 网络爬虫来从网站上获取产品。目录页面使用延迟加载,这意味着我无法获得超过前 12 个项目或使用默认 Scrapy 使用分页。我已经开始将 Selenium 与无头 chrome 客户端一起使用,以便手动滚动页面以获取数据。

我在网上看到使用 Scrapy + Selenium 意味着我不能同时运行 Scrapy 请求,这很不幸,因为我的绝大多数请求都不需要 Selenium。我的 selenium 中间件检查 request.meta 属性以查看它是否需要做任何事情,否则它只会返回 None。但是,所有请求都通过中间件过滤。

我的问题是:有没有办法让那些不需要 Selenium 的请求同时运行?

我的中间件:

def __init__(self):
    options = Options()
    options.add_argument("--headless")
    self.driver = webdriver.Chrome("path/to/driver", chrome_options=options)

def process_request(self, request, spider):
    if request.meta.get("selenium"):
        self.driver.get(request.url)
        ... # Perform selinium scroll logic and return body
    return None

我的蜘蛛解析函数:

def parse(self, response):
    meta = {"otherMetaData": "data", "selenium": True}
    ... # Obtain link to catalog page
    yield response.follow(page_link, callback=self.parseProducts, meta=meta)

def parseProducts(self, response):
    ... # Obtain links to product pages
    response.meta.pop("selenium")
    yield response.follow(page_link, callback=self.parseProductPage, response.meta)

编辑:格式化

【问题讨论】:

    标签: python selenium scrapy


    【解决方案1】:

    这是我最近遇到的一个问题,你需要知道的是Scrapy依赖调度器来发出请求的时间,调度器一直等到CONCURRENT_REQUESTS的值(如果有这个值会被跳过)要发出的请求数量较少,即当蜘蛛完成最终请求时)然后它将发出请求,调度程序还取决于priority,您可以修改它以赋予某些链接更高的优先级,使它们在早期启动排队。

    没有直接的方法来做你所要求的,但一个好的方法是将你的“非硒”请求传递给另一个蜘蛛,它有自己的custom_settings

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 2020-07-26
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 2019-03-08
      • 2014-06-28
      相关资源
      最近更新 更多