前言
最近在做项目的过程中,需要通过爬虫去各大网站爬取数据作为项目的数据源。众所周知,现在主流的爬虫技术都是用的python,而我的项目是采用的Java技术栈,考虑到项目整体的架构和维护,我准备采用Java爬虫获取数据,以下为Java爬虫的入门案例——爬取百度热搜。
技术框架
先分享一个零基础入门爬虫的教程:
Java爬虫教程
经过调查后准备采用WebMagic爬虫框架,经过实操发现很容易上手,教程:
WebMaginc教程
实现步骤
引入以下maven依赖
<!-- webmagic核心包 -->
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- webmagic拓展包 -->
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.6</version>
</dependency>
<!-- webmagic对布隆过滤器的支持 -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
先进入百度热搜的网页:
百度热搜
打开chrome的开发者工具,调出页面源码,找到待爬取的板块
这里可以直接复制对应内容的css选择器路径,后面会用上
直接上代码
package com.poas.crawler.processor;
import com.poas.bean.Event;
import com.poas.crawler.pipeline.ConsolePipeline;
import com.poas.utils.DateUtil;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import java.util.ArrayList;
import java.util.List;
public class BaiduProcessor implements PageProcessor {
private Site site = Site
.me()
.setSleepTime(3000)
.setRetryTimes(3)
.setUserAgent(
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31");
@Override
public void process(Page page) {
// 热搜标题
List<String> titleList = page.getHtml().css("div.c-single-text-ellipsis", "text").all();
// 热搜指数
List<String> weightList = page.getHtml().css("div.hot-index_1Bl1a", "text").all();
// 热搜链接
List<String> urlList = page.getHtml().css("div.content_1YWBm a", "href").all();
// 第一个元素不属于热搜,要去掉
titleList.remove(0);
weightList.remove(0);
urlList.remove(0);
String currentTime = DateUtil.getCurrentTime();
List<Event> eventList = new ArrayList<>();
// 将各部分拼成统一对象
for (int i = 0; i < titleList.size(); i++) {
Event event = new Event(titleList.get(i).trim(), Integer.parseInt(weightList.get(i).trim()), urlList.get(i), "baidu", currentTime);
eventList.add(event);
}
page.putField("event", eventList);
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider.create(new BaiduProcessor())
.addUrl("https://top.baidu.com/board?tab=realtime")
.addPipeline(new ConsolePipeline())
.thread(3)
.run();
}
}
Event类如下:
package com.poas.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* 热搜话题
*/
@Data
@AllArgsConstructor
public class Event {
private String content;
/*
话题热度
*/
private Integer trending;
/*
话题链接
*/
private String url;
/*
来源
*/
private String origin;
/*
爬取时间
*/
private String crawlTime;
}
输出结果可以根据自己的需要自己实现Pipeline,此处就省略了
效果如下(数据太多只取了前几条):
Event(content=塔吉克斯坦7.2级地震 新疆震感强烈, trending=4983654, url=https://www.baidu.com/s?wd=%E5%A4%AF%E5%AE%9E%E7%A7%91%E6%8A%80%E8%87%AA%E7%AB%8B%E8%87%AA%E5%BC%BA%E6%A0%B9%E5%9F%BA&sa=fyb_news&rsv_dl=fyb_news, origin=baidu, crawlTime=2023-02-23 10:24:36), Event(content=58岁清华毕业找不到超5000元的工作, trending=4819739, url=https://www.baidu.com/s?wd=%E5%A4%AF%E5%AE%9E%E7%A7%91%E6%8A%80%E8%87%AA%E7%AB%8B%E8%87%AA%E5%BC%BA%E6%A0%B9%E5%9F%BA&sa=fyb_news&rsv_dl=fyb_news, origin=baidu, crawlTime=2023-02-23 10:24:36), Event(content=好种子“育出”新希望, trending=4718120, url=https://www.baidu.com/s?wd=%E5%A1%94%E5%90%89%E5%85%8B%E6%96%AF%E5%9D%A67.2%E7%BA%A7%E5%9C%B0%E9%9C%87+%E6%96%B0%E7%96%86%E9%9C%87%E6%84%9F%E5%BC%BA%E7%83%88&sa=fyb_news&rsv_dl=fyb_news, origin=baidu, crawlTime=2023-02-23 10:24:36), Event(content=内蒙古煤矿塌方量巨大 51人仍失联, trending=4664010, url=https://www.baidu.com/s?wd=%E5%A1%94%E5%90%89%E5%85%8B%E6%96%AF%E5%9D%A67.2%E7%BA%A7%E5%9C%B0%E9%9C%87+%E6%96%B0%E7%96%86%E9%9C%87%E6%84%9F%E5%BC%BA%E7%83%88&sa=fyb_news&rsv_dl=fyb_news, origin=baidu, crawlTime=2023-02-23 10:24:36)...]
版权声明:本文为wzc3614原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。