打造个性化的有道单词本 (二)

在上一篇文章中,我们做了最基本的事情,我们自己写处理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查找。这就构成了抓取单词的主体。并且我们在文件的末端打印这一次抓取的日期,以便下次只下载加入单词本的日期在该日期之后的单词,避免重复抓取。
打造个性化的有道单词本 (二)_第1张图片
上图是最后的到的单词本的word版本。现在,我们的工作就全部完成了。

你可能感兴趣的:(html,Ruby,mechanize)