python - Scrapy - 在第一次请求后禁用 Selenium
问题描述
我正在从网站上抓取网址,但只有第一个请求需要 selenium,而另一个则不需要。是否可以在报废过程中关闭 Selenium?我想这样做,因为就像你现在可能的那样,Selenium 大大减慢了报废过程。这是蜘蛛的代码:
class StoreSpider(scrapy.Spider):
name = 'store'
allowed_domains = ['www.store.com.br']
custom_settings = {
'COLLECTION_NAME' : 'store',
'URLS_COLLECTION_NAME' : 'store_urls',
'USES_SELENIUM' : True,
'HEADLESS' : True,
'DOWNLOADER_MIDDLEWARES': {
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,
'navigator.middlewares.SeleniumMiddleware': 700,
}
}
categories_le = LinkExtractor(restrict_xpaths="//li[@class='h3']/a[not(@id)]")
def start_requests(self):
urls = [
'https://www.store.com.br/loja/mapa-do-site',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse_categories)
解决方案
您可以修改中间件,使其仅在请求带有render_js
元键时使用 Selenium。
像这样的东西:
class SeleniumMiddleware(object):
...
def process_request(self, request, spider):
if not request.meta.get('render_js'):
# disable js rendering in a per-request basis
return
# render with selenium
...
这是因为当下载器中间件process_request
返回None
时,请求将继续到链中的下一个中间件,最终到达 Scrapy 的下载器。
推荐阅读
- mysql - Mysql Table - CREATE COLUMN 比较其他列的值?
- list - 如何遍历单个
飞镖中的列表对 - excel - VBA 从监视窗口打开 Outlook
- html - 调整从中心 CSS 扩展的图像大小
- terraform - 在 2 个不同的项目中使用相同的 .tfstate
- python - Pyinstaller错误运行带有pyzmq依赖的脚本
- c++ - 如何在 C++ 中“如果(向量中的对象)”
- ruby-on-rails - Rails 将表 A 中的 user_id 列与表 B 中的 user_id 列匹配,然后使用表 B 数据
- javascript - rvest html_table() 错误 max(p) 返回 -Inf
- javascript - 反应 Redux 状态问题