前言
说到爬虫,不管大家会不会,肯定或多或少都听过,就是用来抓取网站上的信息的一种技术。大家听得最多的肯定都是说用 Python 来爬虫,其实咱大 Java 也阔以的😎废话不多说,看看我们今天的“素材”。
我们在 Bilibili 上搜索 Java 自然会返回给我们的结果,我们今天就是要把它返回给我们的结果数据通过 Java 程序给获取到。
依赖
解析网页的爬虫包:jsoup
我们在这里只是网页,如果要获取文件、音乐和电影等数据需要用到
Apache的tika包,感兴趣的也可以去研究下这个🛠。
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
整活儿
获得整个页面
我们先拿到搜索页面的 URL 地址,这就是咱的“素材”😁
public static void main(String[] args) {
// 不能获取到 AJAX 请求的数据
String url = "https://search.bilibili.com/all?keyword=java&from_source=nav_suggest_new";
try {
// 开始解析网页:第一个参数是需要被解析的 URL,第二个参数是解析的超时时间,超时则报错
Document document = Jsoup.parse(new URL(url), 10000);
// 这里返回的 document 就是 JS 里的 Document 对象,把它打印出来其实还是挺亲切的。
System.out.println(document);
} catch (IOException e) {
e.printStackTrace();
}
}
在刚刚的搜索页面通过 F12 看到里面的内容其实和我们打印出来的是一样的。
获得目标数据
定位目标数据的位置
我们要获得
ul标签里的每个class值为 "video-item matrix" 的li标签。确定目标数据所在标签
我们这里就获得每个视频的标题、观看数、上传时间和up主的数据信息。
标题:获得当前这个
li标签里面class值为 "title" 的a标签的title值。观看:获得当前这个
li标签里面class值为 "so-icon watch-num" 的span标签。- 拿到当前该
span标签的title值 - 拿到当前该
span标签的文本内容
- 拿到当前该
上传时间:获得当前这个
li标签里面class值为 "so-icon watch-num" 的span标签。- 拿到当前该
span标签的title值 - 拿到当前该
span标签的文本内容
- 拿到当前该
UP主:这里的标签
class属性只有一个 "so-icon",它的前三个标签也有这个属性所以我们这里就是获得当前这个
li标签里面class值为 "so-icon" 的第四个span标签。- 拿到当前该
span标签的title值 - 拿到当前该
span标签的文本内容
- 拿到当前该
上代码
有没有觉得这些方法其实都非常熟悉?(不会
JS当我没说😁)获得标签的方式有很多种,不一定要和我完全一样
获得我们要的每一个
li标签Elements elements = document.getElementsByClass("video-item matrix");遍历每一个
li标签,拿到我们要的标签数据for (Element element : elements) { // 标题标签:class 值为 "title" 的第一个 a 标签 Element titleEle = element.getElementsByClass("title").get(0); // 观看标签:class 值为 "so-icon watch-num" 的第1个 span 标签 Element watchNumEle = element.getElementsByClass("so-icon watch-num").get(0); // 上传时间标签:class 值为 "so-icon time" 的第1个 span 标签 Element timeEle = element.getElementsByClass("so-icon time").get(0); // UP主标签:class 值为 "so-icon" 的第4个 span 标签 Element upEle = element.getElementsByClass("so-icon").get(3); System.out.println("标题:" + titleEle.attr("title")); // 观看标签的 title 值 → 观看标签的文本内容 System.out.println(watchNumEle.attr("title") + "→" + watchNumEle.text()); // 上传时间标签的 title 值 → 上传时间标签的文本内容 System.out.println(timeEle.attr("title") + " → " + timeEle.text()); // UP主标签的 title 值 → UP主标签的第2个子节点的文本内容 System.out.println(upEle.attr("title") + " → " + upEle.child(1).text()); }
运行!齐活儿~
jsoup是个很强大的工具,但它对中文的支持还是挺捉急的。就是如果把URL中的 java 直接换成一个中文词,比如编程,这时候其实是没用的。
有两种办法:
直接在浏览器地址栏中含有中文的
URL复制粘贴过来,它会自动把中文编码https://search.bilibili.com/all?keyword=%E7%BC%96%E7%A8%8B&from_source=nav_suggest_new
手动把你的中文词进行
URL编码URLEncoder.encode("编程");然后再拼接在你的
URL上
最后
这里只是带大家用 Java 入了个爬虫的门,爬虫的路其实还很长,大家感兴趣的可以走一遭😏
如果本文对你有帮助的话不妨点个👍呦。
分享技术,稳住,我们能赢💪!