Java 从零开始学爬虫(gecco)

废话:

    第一次学习并尝试分析、爬取一个网站的数据,所有是从零开始的经验,但愿对各位看官有帮助,固然,本次爬取的是一个比较简单的网页,没有任何反爬虫措施的网页。json

    网上查了一下Java爬数据,最原始的方式是用请求网页的字符串而后用正则解析标签,再查了一下有什么爬虫、解析网页的工具,而后就查到了这个gecco,当是也没多想,就是干吧。segmentfault

    主要参考了两个博客:maven

    一、入门到精通:https://segmentfault.com/a/1190000010086659工具

    二、精通到放弃:https://blog.csdn.net/gf771115/article/details/53218022学习

    最后附上官方地址:http://www.geccocrawler.com/网站

导入gecco包

maven代码:url

<!--gecco抓包工具-->
    <dependency>
      <groupId>com.geccocrawler</groupId>
      <artifactId>gecco</artifactId>
      <version>1.0.8</version>
    </dependency>

目标网站

由于我是搞定了才会过来写博客的,因此就直奔主题,说明我主要要作什么了。spa

网站是:https://doutushe.com/portal/index/index.net

(站主要是看到了,请联系我删除,没看到的话,嘿嘿,我就不厚道的继续放着了)code

通过观察,分页以后的格式是:https://doutushe.com/portal/index/index/p/1(没错,这个1就是对应页数)

页面大概是这样的:

而后每个帖子的详情:https://doutushe.com/portal/article/index/id/XR5(最后的XR5是帖子id)

页面是这样的:

个人任务

个人任务很简单,就是把列表的全部的帖子的标题、全部的图片,这两个数据爬下来

逻辑

一、访问第1页

二、读取第一页的帖子列表,而后进入每个帖子的帖子详情,将标题、图片列表的数据拿出来

三、访问下一页,而后遍历帖子列表拿数据,一直循环,直到没有下一页

第一步:解析第一页

废话:按照我作的时候,我解析第一页的时候,是先解析列表信息,最后才开始研究怎么解析出来哪一个是下一页,如今是回过来写的,因此就一步到位了,直接解析第一页的列表信息和下一页的链接地址

一、建立一个类(我这里命名是:DoutuSheIndex)

    

    大概意思是主要gecco爬了这个https://doutushe.com/portal/index/index/p/格式的网址,就会交给DuotusheIndex这个类来解析,后面这个popelines则是解析出来的结果传送到另一个类作下一步处理,这个popelines算是一个标识,以后就会发现玄机。

    咱们经过页面的审查元素,能够看到列表的标签信息(以下图),咱们所要的信息,基本上所有包含在这个class为link-2的a标签里面:

    因此我分为两个List<String>用来分别保存列表的名称和详情页面的连接,即a标签的内容和a标签的href值,因此获得的解析为下图:

    这里须要再次提醒的是,@Href注解不能单独使用,必须用@HtmlField定位到对应的地方,而后再在上方加上@Href标签才能拿到href的值,不然拿到的就是a标签的值,其余的注解用法,能够直接查看gecco官网的“使用手册”,吐槽一些,写得好简单,只有说明没有示例,有时候不太明白他的意思,又没有例子能够参考,蛋蛋的忧伤。

    而后接着也须要将下一页的地址给解析出来,给分页审查元素的时候,获得下图:

    我没有找到只解析后面一个或者是根据标签内容过滤的方法,因此我只能是用最原始的办法,就是将全部的分页连接都解析出来。因此就涉及到了另一个东西,前面是解析单个内容,此次解析的话,除了解析分页的链接,我还须要页数,以断定是不是下一页,因此须要解析的是一个对象。

    这东西跟json是一个道理,我要将一个东西直接解析为一个对象的时候,首先要将整个对象的数据拿下来,而后再把这串数据解析为对象。看上面的图,ul标签的li标签就是一个对象的数据,因此咱们就将一个个li定位出来,也就有了下图的解析(IndexPageEntity是页数的对象)(建议第一次的时候,将IndexPageEntity改为String,看看输出了什么):

    接着是IndexPageEntity:

    由于a里面已经包含了咱们所要的信息,因此咱们将a标签解析为咱们须要的数据格式就能够了。

    最后附上DoutusheIndex类的详细内容(省略get set方法,注:代码中必需要有)

二、建立一个类,我这里命名(FinishDoutusheIndex)

    这个类就是前面提到的须要用到popelines的,这个类主要的做用就是等待DoutusheIndex类解析好了网页的内容以后,跳到这一个类来处理下一步的信息,好比我这里以下图这样写:

而后获得的输出结果是(我没有打印名称列表):

咱们须要的信息已经打印出来了,因此咱们须要完善咱们的逻辑。

三、第一页的逻辑

    第一页的数据咱们其实不须要保存的,详情页的数据才是咱们须要的,因此第一页的数据解析出来以后,就要执行咱们的两个逻辑了:一、遍历列表(打开列表的每个详情页)二、跳到下一页

    因此咱们改一下FinishDoutusheIndex就能够了,修改以后以下:

    注:咱们作好相关网页解析就好,若是访问了这个网页,url匹配的上的话,会调起解析程序,因此这里遍历的放心大胆的访问链接就能够了,不须要其余操做。

四、建立类DoutusheEntity、FinishDoutusheEntity

    解析帖子详情,并对咱们索须要的数据进行处理,该说的上面都说了,这里直接贴代码就行了。

最后输出的结果,随便贴一点:

五、调用

OK,搞定

相关文章
相关标签/搜索