爬虫项目(一)爬虫+jsoup轻松爬知乎

爬虫+jsoup轻松爬知乎

爬知乎是为了测试调试爬虫,而且知乎很好爬,也建议新手爬一爬知乎和百度知道之类的网站入门。
最近对大数据很感兴趣,趁着写爬虫的劲把java也学了。本人之前很少接触面相对象的编程语言,只有少量的VB基础。了解java之后才发现面向对象语言之美。(对我这样只是把编程当爱好的fish而言)java最美妙的地方即是有丰富的jar包可以调用,还有大神更新源源不断的jar包,比起以前写C语言,每一行代码都自己敲,现在写java,敲一个点,n多功能函数直接调用,而且代码质量都很高,简直就是搬砖屌丝到摸腿高富帅的升级!

我最开始写的爬虫没用jsoup包,直接用java自带的httpconnect获取,用parttern,matcher加正则语法筛选标签和元素。正则语法看的晕,parttern定义的模板通用性很差。做出来的爬虫整体代码冗长,完全没有代码的美感。

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

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

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

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

//下载网页
String URL="输入网址";
Document document=Jsoup.cnnect("URL");
//在下载的document里进行检索的语句
elements test=document.select("#div_JK")
.select("div.item_list").select("div:nth-child(1)").select("div.dTit.tracking-ad").select("a");
//这样test标签就是我们最开始右键单击检查的标签
String Str=test.toString();//将标签转化成字符串
String text=test.text();//将标签里的文本提取出来
//其他转换方法省略,检索到目标标签,提取标签里的特定元素so easy

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

代码块

简单的java爬虫代码:

package jsouptest;

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupTest {
    public static void main(String[] args) throws IOException {
        //获取编辑推荐页
        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)")
                .get();
        Element main=document.getElementById("zh-recommend-list-full");
        Elements url=main.select("div").select("div:nth-child(2)")
                .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/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)")
                    .get();
            //问题
            Elements title=document2.select("#zh-question-title").select("h2").select("a");
            //问题描述
            Elements detail=document2.select("#zh-question-detail");
            //回答
            Elements answer=document2.select("#zh-question-answer-wrap")
                    .select("div.zm-item-rich-text.expandable.js-collapse-body")
                    .select("div.zm-editable-content.clearfix");
            System.out.println("\n"+"链接:"+URL
                    +"\n"+"标题:"+title.text()
                    +"\n"+"问题描述:"+detail.text()
                    +"\n"+"回答:"+answer.text());
        }   
    }
}

抓取效果图:
爬虫项目(一)爬虫+jsoup轻松爬知乎_第1张图片

eclipse编辑器不支持自动换行,所以文本都堆在一行,可以用file类把抓取到的数据储存到本地txt文件或doc之类的文件里。

写爬虫的第一个目标是抓携程之类的机票数据,当然不是为了做大数据分析,就是给自己用。大家都知道携程途牛之类,机票最便宜的时候不是起飞前一天,也不是起飞前一个月,大概是起飞前十天十几天,这时候机票价格有个波谷。因此想写个机票爬虫部署到服务器上,顺手再写个安卓app传递爬取目标到服务器,让爬虫爬。爬的次数也不多,一天爬两三次就够了,也省的研究反爬虫了,机票进入期望价格或者波谷的时候,发个消息通知我即可,手动买票。
是的,如果顺利的话还会有3-4篇后续的文章,直到完成这个项目。为了可以多坐几次飞机见小女友,祝自己成功!

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