Java 爬虫 CSDN

本贴最后更新于 1699 天前,其中的信息可能已经时移世改

Java 版的爬虫 爬取 CSDN 搜索韩顺平的文章

这个是爬虫下的结果,结果为 txt 可以使用 poi 生成到 excel 文件 具体我就不讲解了

万物皆可爬(Java 万能的)

本文项目使用 Spring Boot 搭建 普通 Maven 项目亦可!!!

先看一下结果吧(不爬取广告栏):

JavaPython.png

这个是 CSDN 官网的数据:

CSDNPyt.png

主要使用的是 jsoup 进行爬虫,英语比较好的话建议还是看下官方的文档 = =

这个是项目搭建结构
20190705235339JavaPythone.png

下载工具,包含各种类型的请求 Client.java

package com.niu.req.downloader;


import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.util.StringUtils;

import java.io.UnsupportedEncodingException;
import java.util.*;

/**
 * @Description 下载工具,包含各种类型的请求
 */
public class Client {

    // 编码格式。发送编码格式统一用UTF-8
    private static final String ENCODING = "UTF-8";

    // 设置连接超时时间,单位毫秒。
    private static final int CONNECT_TIMEOUT = 60000;

    // 请求获取数据的超时时间(即响应时间),单位毫秒。
    private static final int SOCKET_TIMEOUT = 60000;

    public static Page doRequest(Request request) throws Exception {

        HttpRequestBase http = null;

        switch (request.getMethod()) {
            case POST:
                http = new HttpPost(request.getUrl());
                break;
            case GET:
            default:
                http = new HttpGet(request.getUrl());
                break;

        }

        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(CONNECT_TIMEOUT)
                .setSocketTimeout(SOCKET_TIMEOUT).build();

        http.setConfig(requestConfig);

        if (request.getHeaders() != null && !request.getHeaders().isEmpty()) {
            packageHeader(request.getHeaders(), http);
        }

        if (http instanceof HttpPost && request.getParams() != null) {
            packageParam(request.getParams(), (HttpPost) http);
        }


        Page page = Page.build(request);

        // 执行请求并获得响应结果
        try (final CloseableHttpClient httpClient = HttpClients.custom().build();
             final CloseableHttpResponse httpResponse = httpClient.execute(http)
        ) {
            if (httpResponse != null
                    && !StringUtils.isEmpty(httpResponse.getStatusLine())
                    && httpResponse.getEntity() != null
            ) {

                String content = EntityUtils.toString(httpResponse.getEntity(), ENCODING);
                page.setStatusCode(httpResponse.getStatusLine().getStatusCode());
                page.setRaw(content);

            }
        }

        return page;
    }


    /**
     * Description: 封装请求头
     *
     * @param params
     * @param httpMethod
     */
    private static void packageHeader(final Map<String, String> params, final HttpRequestBase httpMethod) {
        if (params == null || params.isEmpty()) {
            return;
        }

        params.entrySet().stream().forEach(e -> {
            httpMethod.setHeader(e.getKey(), e.getValue());
        });
    }

    /**
     * Description: 封装请求参数
     *
     * @param params
     * @param httpMethod
     * @throws UnsupportedEncodingException
     */
    private static void packageParam(final Map<String, String> params, final HttpEntityEnclosingRequestBase httpMethod)
            throws UnsupportedEncodingException {

        if (params == null || params.isEmpty()) {
            return;
        }

        final List<NameValuePair> nvps = new ArrayList<NameValuePair>();
        params.entrySet().stream().forEach(e -> {
            nvps.add(new BasicNameValuePair(e.getKey(), e.getValue()));
        });

        httpMethod.setEntity(new UrlEncodedFormEntity(nvps, ENCODING));
    }


}

Constant.java Http 请求的一些常用参数

package com.niu.req.downloader;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * @Description http 请求的一些常用参数
 */
public class Constant {

    @Getter
    @AllArgsConstructor
    public enum Method {
        GET("GET"),POST("POST");
        String code;
    }

    @Getter
    @AllArgsConstructor
    public enum StatusCode {
        CODE_200(200),CODE_404(404),CODE_503(503),CODE_500(500);
        Integer code;

    }

    @Getter
    @AllArgsConstructor
    public enum Header {
        REFERER("Referer"),USER_AGENT("User-Agent");
        String code;
    }
}

Page.java 页面实体

package com.niu.req.downloader;

import lombok.Getter;
import lombok.Setter;

/**
 * @Description TODO
 */
@Getter
@Setter
public class Page {

    private Request request;

    private Integer statusCode = Constant.StatusCode.CODE_500.getCode();

    private String raw;

    private Page(){ }

    public static Page build(Request request){
        Page page = new Page();
        page.setRequest(request);

        return page;
    }
}

Request.java 封装请求实体类

package com.niu.req.downloader;

import lombok.Getter;
import lombok.Setter;

import java.util.Map;

/**
 * @Description TODO
 */
@Setter
@Getter
public class Request {

    public Request(String url){
        this.url = url;
    }

    private Constant.Method method = Constant.Method.GET;

    private String url;

    private Map<String,String> headers;

    private Map<String,String> params;

}

Request.java 测试类

package com.niu.req.course01;

import com.niu.req.downloader.Client;
import com.niu.req.downloader.Page;
import com.niu.req.downloader.Request;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * @Description 主要爬CSDN 搜索韩顺平后页面的所有文章
 */
public class RequestTest {

    public static void main(String[] args) throws Exception {
        Request request = new Request("https://so.csdn.net/so/search/s.do?q=%E9%9F%A9%E9%A1%BA%E5%B9%B3&t=%20&u=");  // url 路径

        Page page = Client.doRequest(request);

        Document parse = Jsoup.parse(page.getRaw()); //得到Html文本

        Elements select = parse.select("div.search-list-con"); //获取要得到的节点

        select.forEach( e -> {
            Elements data = e.select("dl.search-list.J_search");  // 再找到节点下的节点
            if (data == null || data.isEmpty()) {
                return;
            }
            for (Element datum : data) {
                System.out.println(datum.text());// 得到text
            }
        });
    }
}

搭建结束 运行 Request.java 即可

  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3167 引用 • 8207 回帖
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    5 引用 • 15 回帖 • 224 关注
  • Sillot

    Sillot (汐洛)孵化自思源笔记,致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点
    Github 地址:https://github.com/Hi-Windom/Sillot

    14 引用 • 4 回帖 • 26 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 692 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 17 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 169 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 452 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    7 引用 • 26 回帖 • 3 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 242 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 251 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    284 引用 • 4481 回帖 • 656 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 398 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 553 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖 • 1 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖 • 2 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 15 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    21 引用 • 58 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    103 引用 • 294 回帖 • 3 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    139 引用 • 441 回帖 • 1 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 4 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    180 引用 • 447 回帖 • 2 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 745 关注
  • 安装

    你若安好,便是晴天。

    128 引用 • 1184 回帖 • 1 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    25 引用 • 215 回帖 • 163 关注