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)...]
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,您想了解关于Java版Web爬虫系统和Java开源爬虫框架WebCollector的教程,主要是如何索引擎的内容,对吗?那我来给您介绍一下。 WebCollector是一款Java开源爬虫框架,它基于Jsoup解析库,提供了一系列简单易用的API,可以帮助用户快速开发爬虫程序。WebCollector可以用于各种类型的网站,包括索引擎。 下面是一个简单的WebCollector爬虫程序示例,可以用来百度索结果页面的内容: ```java import cn.edu.hfut.dmic.webcollector.model.Page; import cn.edu.hfut.dmic.webcollector.net.HttpRequest; import cn.edu.hfut.dmic.webcollector.net.HttpResponse; import cn.edu.hfut.dmic.webcollector.net.Requester; import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler; public class BaiduSearchCrawler extends BreadthCrawler { public BaiduSearchCrawler(String crawlPath, boolean autoParse) { super(crawlPath, autoParse); this.addSeed("https://www.baidu.com/s?wd=webcollector"); } public void visit(Page page, HttpRequest httpRequest, HttpResponse httpResponse) { System.out.println(page.getHtml()); } public static void main(String[] args) throws Exception { BaiduSearchCrawler crawler = new BaiduSearchCrawler("crawl", true); crawler.setThreads(10); crawler.start(2); } } ``` 在这个示例中,我们定义了一个名为BaiduSearchCrawler的类,它继承自BreadthCrawler类。在BaiduSearchCrawler的构造函数中,我们指定了爬虫程序的路径和是否自动解析网页内容。然后,我们使用addSeed()方法添加了一个种子URL,这个URL是百度索webcollector的结果页面。 在visit()方法中,我们定义了页面时的处理逻辑,这里我们只是简单地将页面内容打印出来。在main()方法中,我们创建了一个BaiduSearchCrawler对象,设置了线程数为10,并启动了爬虫程序。 当您运行这个程序时,它将会百度索webcollector的结果页面,并将页面内容打印出来。 当然,实际的爬虫程序往往比这个示例要复杂得多,需要考虑到各种情况和异常处理。但是,WebCollector的API非常简单易用,您可以根据自己的需求快速开发出符合要求的爬虫程序。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值