【发布时间】:2018-03-09 20:12:08
【问题描述】:
我正在使用 Scrapy 和 Selenium 创建一个网络爬虫。
代码如下所示:
class MySpider(scrapy.Spider):
urls = [/* a very long list of url */]
def start_requests(self):
for url in urls:
yield scrapy.Request(url=url, callback=self.parse_item)
def parse_item(self, response):
item = Item()
item['field1'] = response.xpath('some xpath').extract()[0]
yield item
sub_item_url = response.xpath('some another xpath').extract()[0]
# Sub items are Javascript generated so it needs a web driver
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=options)
driver.set_window_size(1920, 1080)
sub_item_generator = self.get_sub_item_generator(driver, sub_item_url)
while True:
try:
yield next(sub_item_generator)
except StopIteration:
break
driver.close()
def get_sub_item_generator(driver, url):
# Crawling using the web driver goes here which takes a long time to finish
yield sub_item
问题是爬虫运行了一段时间,然后由于内存不足而崩溃。 Scrapy 不断地从列表中调度一个新的 URL,因此运行的 Web 驱动程序进程太多。
有什么方法可以控制 Scrapy 调度程序在运行一定数量的 Web 驱动程序进程时不调度新 URL?
【问题讨论】:
-
考虑使用splash,比Selenium更轻量
标签: python selenium selenium-webdriver scrapy web-crawler