【发布时间】: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)
编辑:格式化
【问题讨论】: