爬虫+jsoup轻松爬知乎

本次写的爬虫调用了jsoup jar包,jsoup是优秀的HTML解析器,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据,而且封装了get方法,可以直接调用获取页面。结合谷歌浏览器抓取页面元素快感不断。下面简单介绍一下用法顺便贴个知乎爬知乎的代码。

jsoup包的import就不说了,jsoup最主要用到的就是的elements类和select()方法。elements类相当于网页元素中的标签,而select()方法用于按一定条件选取符合条件的标签,组成符合条件的标签数组。element支持转成字符串或者文本等。总之功能很强大。只需要了解一下select()方法的过滤规则即可上手用了。但是有了谷歌浏览器!过滤规则都不用管了,直接上手用! 
来个示例: 
1.打开谷歌浏览器,右键单机想要抓取的元素,比如我右击了“Spring的JavaConfig注解这篇文章”选择检查,自动跳出源码框,并且定位到右键的元素的位置。 
爬虫+jsoup轻松爬知乎_第1张图片
2.右键点击代码行,copy–>copy selector 
爬虫+jsoup轻松爬知乎_第2张图片 
3.这时候我们可以贴出来看看copy到的东西:

#div_JK > div.item_list > div:nth-child(1) > div.dTit.tracking-ad > a
  • 1

表明了目标在网页代码中的位置,每个>前后面都代表一个检索条件。那么我们要得到这个标签,只要这样写:

@Test
   public void test2()throws  Exception{
      //下载网页
      String URL="http://blog.csdn.net/qq_29347295?ref=toolbar";
      Document document=Jsoup.connect(URL).timeout(50000).get();
      //System.out.println(document);
      //在下载的document里进行检索的语句
      //#main > div > ul.detail > li.blog-detail > ul.blog-units.blog-units-box > li:nth-child(11) > h3 > a
      Elements test=document.select("#main")
            .select("div")
            .select("ul.detail")
            .select("li.blog-detail")
            .select("ul.blog-units.blog-units-box")
            .select("li:nth-child(11)")
            .select("h3")
            .select("a");
   //这样test标签就是我们最开始右键单击检查的标签
      String Str=test.toString();//将标签转化成字符串
      String text=test.text();//将标签里的文本提取出来
      System.out.println(text);
//其他转换方法省略,检索到目标标签,提取标签里的特定元素so easy

   }
下面贴一下写的爬知乎代码,知乎和贴吧之类的网站都很好爬。 
目标是把知乎编辑推荐的所有热门问题的URL、问题名、问题描述、答案,都打印出来。

@Test
public void test3()throws  Exception{
   //获取编辑推荐页
   Document document=Jsoup.connect("https://www.zhihu.com/explore/recommendations")
         //模拟火狐浏览器
         //.userAgent("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)")
         .userAgent("Mozilla")
         .get();
   //#zh-recommend-list-full > div > div:nth-child(1) > h2 > a
   Element main=document.getElementById("zh-recommend-list-full");
   Elements url=main.select("div").select("div:nth-child(1)")
         .select("h2").select("a[class=question_link]");
   for(Element question:url) {
      //输出href后的值,即主页上每个关注问题的链接
      String URL = question.attr("abs:href");
      //下载问题链接指向的页面
      Document document2 = Jsoup.connect(URL)
            .userAgent("Mozilla")
            .get();
      //问题#root > div > main > div > div:nth-child(10) > div.QuestionHeader > div.QuestionHeader-content > div.QuestionHeader-main > h1
      Elements title = document2.select("#root")
                             .select("div")
                             .select("main")
                             .select("div")
                             .select("div:nth-child(10)")
                             .select("div.QuestionHeader")
                             .select("div.QuestionHeader-content")
                             .select("div.QuestionHeader-main")
                             .select("h1")
                             ;
      //问题描述#root > div > main > div > div:nth-child(10) > div.QuestionHeader > div.QuestionHeader-content > div.QuestionHeader-main > div:nth-child(3) > div > div > div > span
      Elements detail = document2.select("#root")
            .select("div")
            .select("main")
            .select("div")
            .select("div:nth-child(10)")
            .select("div.QuestionHeader")
            .select("div.QuestionHeader-content")
            .select("div.QuestionHeader-main")
            .select("div:nth-child(3)")
            .select("div")
            .select("div")
            .select("div")
            .select("span")
            ;
      //回答--#root > div > main > div > div.Question-main > div.Question-mainColumn > div.Card.AnswerCard > div > div > div.RichContent.RichContent--unescapable > div.RichContent-inner > span > p:nth-child(1)
      Elements answer = document2.select("#root")
            .select("div")
            .select("main")
            .select("div")
            .select("div.Question-main")
            .select("div.Question-mainColumn")
            .select("div.Card.AnswerCard")
            .select("div")
            .select("div")
            .select("div.RichContent.RichContent--unescapable")
            .select("div.RichContent-inner")
            .select("span");
            //.select("p:nth-child(1)");
      System.out.println("\n" + "链接:" + URL
            + "\n" + "标题:" + title.text()
            + "\n" + "问题描述:" + detail.text()
            + "\n" + "回答:" + answer.text());
   }
}


你可能感兴趣的:(java爬虫学习)