使用Jsoup框架基于Java语言进行爬虫
背景
市面上的爬虫框架有很多,大都是基于Python的,不得不说Python在处理数据方面很出色,尤其是在把数据做成可视化的图表方面。但是作为Java程序员,对Java情有独钟,我觉得关于Java的爬虫框架也要或多或少的了解,而且平常在工作中有时候需要从网上爬一点数据拿过来用,这个时候来回切换语言也是很不适的,我直接在当前的开发环境扒点数据入库,多好……
简单介绍
Jsoup是一个Java爬虫框架,具体它是什么此处不介绍,只简单说一下爬虫的大概流程。
其实爬虫就是伪装成浏览器向目标服务器发起请求,然后处理返回的数据这样的一个过程,在Jsoup中,大概流程如下:
- 指定一个URL,请求一个DOM
- 定义我们的规则,或者说是正则表达式
- 解析DOM文档
大的步骤就是这样,就是访问服务器,得到一个超文本字符串,然后从这个字符串中抠下来我们需要的内容。
代码
话不多说,直接上码,结合注释理解。
package com.cloud.study.demo.Controller; import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; public class JsoupUtil { public static void main(String[] args) throws IOException { //爬取凤凰网今日要闻 Connection connection = Jsoup.connect("http://www.ifeng.com/"); //设置一些请求头信息,某些场景下可躲避反爬。其他信息此处省略,费劲…… connection.header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0"); //得到一篇HTML文档,即DOM树 Document document=connection.get(); //模拟GET请求访问 //定义我们想要扒取的内容规则,跟CSS选择器差不多 String select="div[id=headLineDefault]>ul[class=FNewMTopLis]>ul>li"; //拿到结果,通过Document对象的select(String query)方法,传入我们定义的选择器 Elements results=document.select(select); //打印标签之间的内容 for (Element element:results){ System.out.println(element.text()); } } }
运行结果:
简述
上述代码,爬取了凤凰网首页的这一部分内容:
其实太简单了,主要就是对这个HTML文档进行解析挖取,而我们的Jsoup实际上就是一个HTML解析器。最核心的地方在于怎样拼写选择器,主要就是对这个页面结构进行分析:
通过它的页面结构可以看出来,我们需要的信息字符串在哪一个层级下,所以就可以根据自己的需要指定选择器了。其实这个选择器还挺好理解的,跟CSS里的选择器差不多。
到这里,我们的数据爬取就完成了,再往下怎么利用这个数据就是自己的事了。
比如你的APP或者网站要内置一个板块,专门用来展示热点新闻,但是你们公司自己又不愿在这方面花费太多成本,这时候就可以通过爬虫的方式从第三方获取数据,你可以爬下来之后直接入库,顺便往缓存中放一份,这样在用户查询的时候提升效率。
PS:Jsoup在处理一个Element的时候,如果调用text()方法发现内容是超链接,它是可以继续向下访问这个超链接的目标地址的,所以你就可以更深一层次的进行爬取,这个功能可以用在爬取新闻的场景,因为我们爬取新闻网站一般只能先爬取下来标题,然后访问它所带的超链接(又是另外一个URL了),才是它的具体内容。
好了,年底了,祝大家一切都好,不要被裁,被裁的都顺利找到下一家~~~(虽然我还没找到下家)