故障排除噩梦:网络抓取时出现不可复制的错误

Troubleshooting nightmare: non-replicatable errors while webscraping

我正在尝试 运行 抓取 indeed.com 并申请工作的网络抓取工具。真正让我着迷的是不一致但随机的错误。我不是程序员,但据我了解,如果 2+2=4,那么它应该总是 4。

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

似乎只适用于 firefox v45.0.2,因为 geckodriver

如果您想自己执行脚本,我在 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

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

示例 2:当您 运行 搜索时出现错误。没有职位发布。

错误:块传递给#window_opened_by 打开了 0 windows 而不是 1(Capybara::Window 错误) 重新执行代码,错误消失,稍后回来...

澄清示例 2:

这个错误有时会出现,因为我有一个加拿大 IP 地址并将我重定向到 indeed.ca。但是,当通过 VPN 使用美国 IP 地址时,该错误在 100% 的时间里都是一致的。为了解决这个问题,我修改了代码以转到网站的美国版本,同样,该错误在 100% 的时间里都是一致的。知道为什么当我使用美国版 indeed.com 时这个 window 没有弹出吗?

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

2+2=4 在一组给定的假设和条件下。不幸的是,浏览器和抓取工具并不是那么可预测,具有随机延迟、页面节流、更改页面、对不同技术的不同支持级别等。

在您当前的情况下,window_opened_by 错误的原因可能是没有将 Capybara.default_max_wait_time 设置得足够长(水豚将等待 window 打开多长时间),但是如果您尝试手动搜索,您将看到 indeed 不再在新的 window 中打开职位描述,前提是当前 window 的宽度足以在右侧面板中显示。基本上,由于 indeed.com 工作方式的变化,您尝试使用的代码不再与 indeed.com 完全兼容。您可以通过将驱动程序 window 的大小设置为 indeed.com 将始终打开一个新的 window 的大小来解决此问题,或者将 window 的大小设置得足够大同一页面并重写代码以不寻找新的 window.

至于没有'#fj'的问题,最简单的调试方法就是把

save_and_open_screenshot if page.has_no_css?('#fj')

find('#fj').click 之前,看看页面上没有“#fj”元素时的样子。这样做表明 indeed.com 正在随机返回移动站点。我不知道为什么会这样,但这可能只是 indeed.com 在无法识别当前用户代理时所做的。如果是这种情况,您可能可以通过设置 capybara-webkit 驱动程序使用的用户代理来解决这个问题,或者您可以切换到调用 click_button('Find Jobs') ,它应该点击移动和非移动页面上的按钮。