第一次学习并尝试分析、爬取一个网站的数据,所有是从零开始的经验,但愿对各位看官有帮助,固然,本次爬取的是一个比较简单的网页,没有任何反爬虫措施的网页。json
网上查了一下Java爬数据,最原始的方式是用请求网页的字符串而后用正则解析标签,再查了一下有什么爬虫、解析网页的工具,而后就查到了这个gecco,当是也没多想,就是干吧。segmentfault
主要参考了两个博客:maven
一、入门到精通:https://segmentfault.com/a/1190000010086659工具
二、精通到放弃:https://blog.csdn.net/gf771115/article/details/53218022学习
最后附上官方地址:http://www.geccocrawler.com/网站
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页
二、读取第一页的帖子列表,而后进入每个帖子的帖子详情,将标题、图片列表的数据拿出来
三、访问下一页,而后遍历帖子列表拿数据,一直循环,直到没有下一页
废话:按照我作的时候,我解析第一页的时候,是先解析列表信息,最后才开始研究怎么解析出来哪一个是下一页,如今是回过来写的,因此就一步到位了,直接解析第一页的列表信息和下一页的链接地址
大概意思是主要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方法,注:代码中必需要有)
这个类就是前面提到的须要用到popelines的,这个类主要的做用就是等待DoutusheIndex类解析好了网页的内容以后,跳到这一个类来处理下一步的信息,好比我这里以下图这样写:
而后获得的输出结果是(我没有打印名称列表):
咱们须要的信息已经打印出来了,因此咱们须要完善咱们的逻辑。
第一页的数据咱们其实不须要保存的,详情页的数据才是咱们须要的,因此第一页的数据解析出来以后,就要执行咱们的两个逻辑了:一、遍历列表(打开列表的每个详情页)二、跳到下一页
因此咱们改一下FinishDoutusheIndex就能够了,修改以后以下:
注:咱们作好相关网页解析就好,若是访问了这个网页,url匹配的上的话,会调起解析程序,因此这里遍历的放心大胆的访问链接就能够了,不须要其余操做。
解析帖子详情,并对咱们索须要的数据进行处理,该说的上面都说了,这里直接贴代码就行了。
最后输出的结果,随便贴一点: