python - Scrapy 与多个 Selenium 实例(并行)
问题描述
我需要用Selenium
and刮掉很多网址Scrapy
。为了加快整个过程,我正在尝试创建一堆共享Selenium
实例。我的想法是在需要和完成的情况下为任何人提供一组并行Selenium
实例。Request
released
我试图创建一个Middleware
,但问题是它Middleware
是顺序的(我看到所有驱动程序(我称之为浏览器)加载 url,它似乎是顺序的)。我希望所有驱动程序并行工作。
class ScrapySpiderDownloaderMiddleware(object):
BROWSERS_COUNT = 10
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.free_browsers = set(
[webdriver.Chrome(executable_path=BASE_DIR + '/chromedriver') for x in range(self.BROWSERS_COUNT)])
def get_free_browser(self):
while True:
try:
return self.free_browsers.pop()
except KeyError:
time.sleep(0.1)
def release_browser(self, browser):
self.free_browsers.add(browser)
def process_request(self, request, spider):
browser = self.get_free_browser()
browser.get(request.url)
body = str.encode(browser.page_source)
self.release_browser(browser)
# Expose the driver via the "meta" attribute
request.meta.update({'browser': browser})
return HtmlResponse(
browser.current_url,
body=body,
encoding='utf-8',
request=request
)
我不喜欢你做的解决方案:
driver.get(response.url)
在parse
方法中,因为它会导致冗余请求。每个网址都被请求两次,我需要避免。
例如这个https://stackoverflow.com/a/17979285/2607447
你知道该怎么做吗?
解决方案
正如@Granitosaurus 建议的那样,Splash 是一个不错的选择。我个人使用Scrapy-splash -Scrapy
负责并行处理并Splash
负责网站渲染,包括JavaScript
执行。
推荐阅读
- biztalk - 创建位图文件并将其发送给客户端
- javascript - JavaScript 无法更改图像的 src 属性值
- react-testing-library - 用于 redux 中操作的 React 测试库
- javascript - moment - 按时区结束一天
- mysql - MySQL:无法删除交叉连接中的重复组合
- c# - 重构许多重复的 ProducesResponseType 以使其 DRY
- android-studio - 无法理解 Gradle 设置文件,请在 Flutter 中手动添加路径 'aar_file_name' 错误
- r - 采样嵌套 For 循环
- c++ - 在 C++ 中读取 CSV 文件中的特定行
- arrays - Ruby - 将数组元素移动到给定位置