我刚刚开始学习更多关于用Ruby编写网络爬虫的知识,该爬虫旨在抓取我的博客,并使用Anemone gem和下面的rake任务找到破碎的外部链接…
task :testing_this => :environment do
require 'anemone'
rooter = 'myblog.com'
banned = ['tel:','@', '#', 'facebook.com', 'twitter.com', 'pinterest.com', 'linkedin.com', 'youtube.com','reddit.com', 'wikipedia.org']
extensions = %w( .jpg .jpeg .png .doc .pdf .js .css .xml .csv. .exe .zip .gzip )
start = Time.now
Anemone.crawl("http://#{rooter}/", {:threads => 4, :discard_page_bodies => false, :obey_robots_txt => false, :user_agent => 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'}) do |anemone|
begin
anemone.on_every_page do |page|
puts page.url.path
links = page.doc.xpath("//a/@href")
if (links != nil)
links.each do |link|
this_link = link.to_s
unless extensions.any? { |exten| this_link && this_link.include?(exten) }
unless banned.any? { |word| this_link && this_link.include?(word) }
unless this_link.include? rooter
# puts this_link
obl = URI.parse(URI.encode(this_link.strip)).host
unless obl.blank?
if obl.include? 'www.'
obl = obl.gsub("www.", "")
end
Obl.find_or_create_by(url: obl)
end
end
end
end
end
end
end
rescue OpenURI::HTTPError => ex
puts ex
end
end
time_t = Time.now - start
puts "-------------"
puts "#{time_t} seconds"
puts "-------------"
end
它在我的演示文件夹上工作,然而,我一直在使用https://arthurdejong.org/webcheck/demo/来测试它,我得到以下错误:
NoMethodError: undefined method `xpath' for nil:NilClass
我试过构建一个扩展数组,因为我想知道这是否是导致问题的原因,但到目前为止还没有运气。
有没有人有关于如何调试这个或解决这个问题的任何提示?
似乎错误来自page.doc.xpath
: page.doc
是nil。
尝试用on_every_page
的方法来inspect
你的page
。
您还可以在.xpath
之前添加if
以避免错误:
anemone.on_every_page do |page|
puts page.url.path
if page.doc.present?
links = page.doc.xpath("//a/@href")