在上一篇文章中,我们做了最基本的事情,我们自己写处理URL重定向的代码,我们自己保存这cookie,感觉很累是吧,其实的确是这样的。并且,文章的题目不是”打造个性化的又到单词本“,如果只是把最原始的html文档抓取下来,谈何个性化,应该换名成复古化吧。其实在ruby的世界里,有很多现成的包可以用的,由于gem的出现,各种包的管理更加方便了,就我们在第一篇文章中做的这些事情用mechanize这个包就可以做的很简单,因为它直接模仿我们手工在浏览器浏览页面的过程,而且这个框架提供了对URL重定向的支持,也很自动保存cookie,但它对javascript的理解不是很好,所以对密码加密还是要我们手工做。除此之外它还能够上传文件。我们在第一篇文章中做的大量的工作用以下这几行代码就可一搞定了,只能说mechanize太适合我们当前的这个小任务了。
def login
Mechanize.new do |agent|
agent.user_agent=@user_agent
main_page=agent.get(@main_addr)
login_page=main_page.link_with(text: "单词本").click
login_form=login_page.form_with("f")
login_form.username="××"
login_form.password="××"
agent.submit(login_form)
@word_page=agent.current_page
end
end
接下来就是nokogiri大显身手的时候了,通过分析源代码,我们可以直接通过单词表的xpath查询到每一个字段:
def crawl_words
login if @word_page==nil
File.open("myWords","w") do |file|
@word_page.xpath("//tbody//tr").each do |tr|
w=tr.xpath(".//td")
add_time=Date.parse(w[4].content)
#@stime=add_time if add_time>@stime
next if add_time<@stime
#print number of each word
#file.print w.shift.content,'. '
w.shift
file.print @@count+=1,'. '
puts "processing... #{@@count}"
#print literal content of each word
word_item=w.shift.xpath("./div").first
file.print word_item.content
@detail_page=@word_page
.link_with(text:word_item.content).click
#print phaonetic
file.print w.shift.xpath("./div").first.content,' '
#print meaning item of each word on the same line
w.shift.xpath(".//div").first.content.each_line {|mi| file.print mi.strip<<" "}
file.puts
@detail_page.xpath("//li//div//div//p").each{|example| file.puts example.content.strip}
end while turn_page
file.puts
file.print "scan time: ",Date.today
end
end
def turn_page
begin
@word_page=@word_page.link_with(text:"下一页").click unless @first_page
@first_page=false
@word_page
rescue
return nil
end
end
这段代码就是我们完成个性化的过程。首先通过单词表的xpath查找到每个表的行,然后依次将单词,音标,汉语解释抓取下来,每完成一页就翻到下一页。除了单词表给我们的这些信息之外,我还想的到柯林斯字典关于这个单词的例句,还好单词表里面给了链接,得到详细的单词解释的页面之后继续用xpath查找。这就构成了抓取单词的主体。并且我们在文件的末端打印这一次抓取的日期,以便下次只下载加入单词本的日期在该日期之后的单词,避免重复抓取。
上图是最后的到的单词本的word版本。现在,我们的工作就全部完成了。
本文介绍如何使用Ruby的Mechanize和Nokogiri库实现个性化单词本的爬取过程。从登录网站、获取单词信息到解析详细内容,仅需几行代码即可完成。此外,还介绍了如何避免重复抓取已有的单词。

被折叠的 条评论
为什么被折叠?



