【发布时间】:2021-01-21 17:11:43
【问题描述】:
我使用 Capybara + ChromeDriver Selenium 来抓取网页。 在请求期间,主要目标是下载 csv 文件。 请求大约需要 15-20 秒。
当我同时运行 2 个请求时 - 它运行良好 3,4,5 等并行请求失败 - 看起来文件没有被下载。
这里有什么问题? 这是我的配置。
谢谢!
require 'csv'
require 'capybara'
require 'capybara/dsl'
class Scraper
include Capybara::DSL
Capybara.default_driver = :selenium
Capybara.register_driver :selenium do |app|
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--disable-popup-blocking')
options.add_argument('--window-size=1920,1268')
options.add_preference(:download, directory_upgrade: true,
prompt_for_download: false,
default_directory: DownloadHelpers.getpath)
options.add_preference(:browser, set_download_behavior: { behavior: 'allow' })
driver = Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
bridge = driver.browser.send(:bridge)
path = '/session/:session_id/chromium/send_command'
path[':session_id'] = bridge.session_id
bridge.http.call(:post, path,
cmd: 'Page.setDownloadBehavior',
params: {
behavior: 'allow',
downloadPath: DownloadHelpers.getpath
}
)
driver
end
Capybara.default_driver = :selenium
Capybara.javascript_driver = :selenium
end
更新
我如何运行任务 - 通过 rake 任务。
Scraper 位于 rails lib 文件夹内。 每个请求都通过 rake 任务调用,初始化 Rails 环境并运行爬虫脚本。
【问题讨论】:
-
你是如何创建并行会话的?
-
另外——假设你使用的是最近的 selenium-webdriver,你应该能够调用
driver.browser.execute_cdp ...而不必处理bridge——尽管只是调用driver.browser.download_path = DownloadHelpers.getpath)可能会做同样的事情东西 -
@ThomasWalpole,更新了问题的答案。
标签: selenium selenium-webdriver selenium-chromedriver capybara