【发布时间】:2020-07-26 09:14:24
【问题描述】:
我正在尝试使用 Scrapy 和 Selenium 抓取一些网址。 其中一些 url 由 Scrapy 直接处理,而另一些则先由 Selenium 处理。
问题是:当 Selenium 处理一个 url 时,Scrapy 没有并行处理其他的。它等待 webdriver 完成它的工作。
我曾尝试在单独的进程中使用不同的初始化参数 run multiple spiders(使用多处理池),但我得到了 twisted.internet.error.ReactorNotRestartable。我还尝试在parse 方法中生成另一个进程。但似乎我没有足够的经验来做对。
在下面的示例中,所有 url 仅在 webdriver 关闭时打印。请指教,有没有办法让它“并行”运行?
import time
import scrapy
from selenium.webdriver import Firefox
def load_with_selenium(url):
with Firefox() as driver:
driver.get(url)
time.sleep(10) # Do something
page = driver.page_source
return page
class TestSpider(scrapy.Spider):
name = 'test_spider'
tasks = [{'start_url': 'https://www.theguardian.com/', 'selenium': False},
{'start_url': 'https://www.nytimes.com/', 'selenium': True}]
def start_requests(self):
for task in self.tasks:
yield scrapy.Request(url=task['start_url'], callback=self.parse, meta=task)
def parse(self, response):
if response.meta['selenium']:
response = response.replace(body=load_with_selenium(response.meta['start_url']))
for url in response.xpath('//a/@href').getall():
print(url)
【问题讨论】:
-
你试过多线程吗?进程不能共享内存,所以有些东西会中断。
-
@kagronick,我试过running multiple spiders in the same process(我传递了不同的初始化参数),但它导致了完全相同的问题:Scrapy 正在等待 webdriver 完成它的工作。