故障排除噩梦:webscraping时出现不可复制的错误

时间:2018-01-24 20:44:36

标签: ruby-on-rails web-scraping capybara

我正在尝试运行一个刮擦Indeed.com并申请工作的webscraper。我真正得到的是不一致但随机的错误。我不是程序员,但据我了解,如果2 + 2 = 4,那么它应该总是4。

这是我正在尝试运行的脚本: https://github.com/jmopr/job-hunter/blob/master/scraper.rb

由于geckodriver

,似乎只能使用firefox v45.0.2

如果你想自己执行脚本,我自己在scraper.rb中修复:

config.allow_url("indeed.com")
JobScraper.new('https://www.indeed.com/', ARGV[0], ARGV[3]).scrape(ARGV[1], ARGV[2])

错误

示例1

def perform_search
# For indeed0
save_and_open_page
fill_in 'q', :with => @skillset
fill_in 'l', :with => @region
find('#fj').click
sleep(1)
end

错误:无法找到类#fj。所以它能够找到q和l,但不能找到fj。 q和l是形式,而fj是按钮。怎么能找到表格而不是按钮...... ?????通过终端命令rails server重新执行代码,错误消失了。后来又回来了,性质多么随意!!!!这怎么可能?我甚至无法预测它何时会发生,所以我可以save_and_open_page

示例2:运行搜索时出现错误。找不到工作。

错误:阻止传递给#window_opened _by打开0个窗口而不是1个(Capybara :: Window Error) 重新执行代码,错误消失,后来回来......

澄清示例2:

由于我有一个加拿大IP地址并且它将我重定向到really.ca,因此有时会出现该错误。但是,当通过VPN使用美国IP地址时,该错误在100%的时间内都是一致的。为了解决这个问题,我已经修改了代码以转到美国版本的网站,这个错误在100%的时间内都是一致的。当我在使用美国版本的Indeed.com时,有什么想法为什么这个窗口没有出现?

要点: 我不一定在寻找解决方案,而是了解正在发生的事情。为什么错误的随机性。

1 个答案:

答案 0 :(得分:0)

在给定的一组假设和条件下,

2 + 2 = 4。遗憾的是,浏览器和抓取工具不可预测,随机延迟,页面限制,更改页面,不同技术的支持级别等等。

在您当前的情况下,window_opened_by错误的原因可能是Capybara.default_max_wait_time设置的时间不够长(Capybara等待窗口打开多长时间),但是如果您尝试手动搜索如果当前窗口宽度足以在右侧面板中显示,indeed将在新窗口中显示indeed.com不再打开作业说明。基本上,由于indeed.com工作方式的变化,您尝试使用的代码不再与save_and_open_screenshot if page.has_no_css?('#fj') 完全兼容。您可以通过将驱动程序窗口大小设置为Indeed.com将始终打开新窗口的大小,或者通过将窗口大小设置为足够大的作业描述在同一页面上打开并重写代码而不是查找新窗口来解决此问题。

至于#fj'问题,最简单的调试方法是放

find('#fj').click
indeed.com之前

,看看没有'#fj'元素就可以了。这样做会显示indeed.com随机返回移动网站。为什么会发生这种情况我不知道,但它可能就是click_button('Find Jobs')在没有识别当前用户代理时所做的事情。如果是这种情况,您可以通过设置capybara-webkit驱动程序使用的用户代理来解决这个问题,或者您可以切换到调用Dir.glob,这应该单击移动设备上的按钮和非移动设备移动页面。