Java爬虫入门——爬取百度热搜

  • Post author:
  • Post category:java




前言

最近在做项目的过程中,需要通过爬虫去各大网站爬取数据作为项目的数据源。众所周知,现在主流的爬虫技术都是用的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 版权协议,转载请附上原文出处链接和本声明。