Java 爬虫 CSDN

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

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 回帖 • 2 关注
  • Java

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

    3201 引用 • 8216 回帖
  • 爬虫

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

    106 引用 • 275 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖 • 1 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 188 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 35 关注
  • 反馈

    Communication channel for makers and users.

    120 引用 • 906 回帖 • 279 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 4 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    108 引用 • 153 回帖
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 612 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    80 引用 • 396 回帖 • 1 关注
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖 • 3 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 631 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 367 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 663 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖 • 3 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 152 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 143 回帖 • 1 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 184 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    77 引用 • 37 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    172 引用 • 534 回帖
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 222 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    947 引用 • 1460 回帖
  • 导航

    各种网址链接、内容导航。

    45 引用 • 177 回帖
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    167 引用 • 597 回帖 • 2 关注
  • 996
    13 引用 • 200 回帖 • 3 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖