1:网络爬虫
1.1:为什么要网络爬虫
在现在这个大数据时代,信息瞬息万变,在我们做的项目时可能因为某些原因,不会去产生这些数据,但是我们项目中又需要某些数据,这个时候我们就需要网络爬虫了
1.2:网络爬虫原理
那么什么是网络爬虫呢,顾名思义就是通过我们代码操作去爬取别的网站的数据,然后提取出来变成我们自己的数据,网络爬虫主要就是通过一个url地址链接然后返回一个页面元素,我们在通过提取,把数据提取出来,下面就是流程图
Jsoup网络爬虫
虽然使用python语言比较擅长网络爬虫,但是Java其实相对来说在网络爬取也并不会比python差太多,我就告诉大家使用Jsoup网络爬取,下面使用依赖
<!-- jsoup网络爬虫 -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.9.2</version>
</dependency>
Jsoup快速上手
常用方法:
/**
* Jsoup.connect()写入需要爬取数据的链接
* get()获取数据返回Document元素
* timeout()爬取网站的超时时间
*/
Document doc = Jsoup.connect("https://info.sporttery.cn/football/match_list.php").timeout.(5000)get();
Elements elementById = doc.getElementsByClass("cili-item");//获取div class里面有cili-item的div
getElementsByTag("a");//获取 Element 对象里面有什么样的的标签的数据
attr("href")//获取href标签里面的数据,
attributes()获取所有属性
text()获取内容
html()获取元素内的HTML html(String value)设置元素内的HTML内容
outerHtml()获取元素外HTML内容
data()获取数据内容
//文本操作
append(String html) //添加元素
appendText(String text), prependText(String text)
appendElement(String tagName), prependElement(String tagName)
html(String value)
//Selector选择器概述
tagname: 通过标签查找元素,比如:ans|tag: 通过标签在命名空间查找元素,比如:可以用 fb|name 语法来查找 <fb:name> 元素
#id: 通过ID查找元素,比如:#logo.class: 通过class名称查找元素,比如:.masthead
[attribute]: 利用属性查找元素,比如:[href]
[^attr]: 利用属性名前缀来查找元素,比如:可以用[^data-] 来查找带有HTML5 Dataset属性的元素
[attr=value]: 利用属性值来查找元素,比如:[width=500]
[attr^=value], [attr$=value], [attr*=value]: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href*=/path/]
[attr~=regex]: 利用属性值匹配正则表达式来查找元素,比如: img[src~=(?i)\.(png|jpe?g)]
下面代码是我之前写一个爬取bt兔子的代码,他主要就是获取磁力链接的一些信息
我写爬虫一般是获取他们的页面数据,在获取需要提取元素的div在来获取div里面的数据,然后进行数据提取,然后把数据封装到一个对象里面,封装对象后你就能做一些操作了,比如返回给前端,或者保存到数据库
/**
* 搜索返回数据 bt兔子 bttuzi.vip
* @param name 搜索名字
* @param pageNum 页数
* @return
*/
@ResponseBody
@RequestMapping("/reptile.do")
public MsgInfo reptiles(String fileName,Integer pageNum) {
MsgInfo msgInfo=new MsgInfo();
try {
Document doc = Jsoup.connect("https://www.btcilicili.me/s/"+fileName+"/time-"+pageNum+".html").timeout(5000).get();
String text = doc.text();
if(doc!=null && text!=null && !text.trim().equals("")) {
List<SearchFileVO> list=new ArrayList<>();
Elements elementById = doc.getElementsByClass("cili-item");
//循环div
for (Element element : elementById) {
SearchFileVO searchFileVO=new SearchFileVO();
Elements elementsByTag = element.getElementsByTag("a");//获取a链接
Element element2 = elementsByTag.get(1);
String path = element2.attr("href");
Elements elementsByTag2 = element.getElementsByTag("li");
String title = elementsByTag2.text();
Element element3 = element.getElementsByClass("item-bar").get(0);//分割获得文件大小和文件时间
String nr = element3.text();
String[] split3 = nr.split(":");
String creDate =split3[1];
String fileSize=split3[2];
String[] split4 = creDate.split("\\s+");
String[] split5 = fileSize.split("\\s+");
searchFileVO.setCreDate(split4[0]);
searchFileVO.setFileSize(split5[0]+split5[1]);
searchFileVO.setMagneticLink(path);//磁力链接
searchFileVO.setTitle(title);
list.add(searchFileVO);
}
msgInfo.setObj(list);
msgInfo.setSuccess(true);
}
} catch (IOException e) {
logger.error("--dataGet--error-"+"->", e);
msgInfo.setMsg("获取数据失败");
return msgInfo;
}
return msgInfo;
}
如果你有不懂话可以加我,有什么问题的话可以加我微信:18473437400