【技术应用】java通过url爬虫获取公众号文章内容

  • 一、前言
  • 二、解决思路
  • 三、爬虫工具
  • 四、代码实现
    • 1.爬取公众号文章
    • 2.爬取CSDN文章
  • 五、总结

一、前言

平时在微信或者钉钉发送消息时,会自动把url链接转出卡片信息,提高了消息的可读性,是一个很好的用户体验,这两天我们正在开发的一个应用软件也涉及到这一块的内容,由于前端的限制,只能依赖于后端程序接口辅助实现此功能;

二、解决思路

后端提供转换接口,入参为url链接,后端代码通过url链接获取文章信息(文章标题部分内容封面图)回传给前端,供前端实现卡片功能,返回值格式如下:

{"title": "从入门到放弃","content": "java对象生命周期","image_url": "http://..."
}

注:今天不讲url如何转卡片,重点想总结一下java如何通过url获取文章信息,或者说java如何通过url爬取文章信息;

三、爬虫工具

网络爬虫前两年是一个很火的功能,之前一提到爬虫大家可能首先想到的是通过python实现爬虫功能,但是通过java实现爬虫功能的应用相对较少,这也是由于pythonjava的特点决定的,python做爬虫语法更简单,代码更简洁,java的语法比python严格,而且代码也更复杂;

我们要实现的爬虫功能很简单,所以我们主要讲通过java实现爬虫功能

首先介绍三种爬虫框架/程序Phantomjs/Casperjs, HtmlUnit, Selenium,关于这三个框架的内容这里不做详细讲解,需要的可以自行百度,这里只做一个特点对比,也方便我们理解技术选型,特点对比如下:

框架 javaScript engine cookie request[received]url Browser 访问速度,稳定性,可扩展性等
Phantomjs/Casperjs Base on WebKit 支持 支持 Base on WebKit 访问速度较快,有时程序会crash,支持各种js 框架,缺点:支持的js有限
HtmlUnit Rhino 支持 支持 Firefox or Internet Explorer 访问速度最快,比较稳定,支持各种js框架,可以由页面类容模拟url请求. 缺点:支持的js有限
Selenium Most engine 支持 不支持 Most Browsers 访问速度太慢,速度也不稳定,而且带有UI,想跨平台必须使用RemoteWebDriver,优点: 支持大部分浏览器

由上述框架的特点可知,我们只是要实现通过url获取文章的标题内容图片属性,不涉及js和界面渲染等相关内容,所以我们选择使用htmlunit
简单介绍htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。这个没有界面的浏览器,运行速度也是非常迅速的。

为了方便解析爬虫获取的html,我们使用jsoup工具,jsoup是一款Java的html解析工具,主要是对html和xml文件进行解析,使用jsoup能轻松从html/xml获取想要的内容。

四、代码实现

我们今天主要列举两种类型的数据爬取:公众号文章CSDN文章

首先引入pom.xml依赖:

<dependency><groupId>net.sourceforge.htmlunit</groupId><artifactId>htmlunit</artifactId><version>2.55.0</version></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.8.3</version></dependency>

1.爬取公众号文章

package com.example.tts.service.impl;import com.example.tts.service.ICrawlingService;
import com.example.tts.utils.ToSpeach;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Service;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;@Service
public class WXCrawlingService implements ICrawlingService {static String[] userAgent = {"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50","Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50","Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0","Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)","Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1","Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1","Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11","Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)","Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5","Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5","Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5","Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10","Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13","Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+","Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0","Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124","Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)","UCWEB7.0.2.37/28/999","NOKIA5700/ UCWEB7.0.2.37/28/999","Openwave/ UCWEB7.0.2.37/28/999","Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999","Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25",};static BrowserVersion browser =new BrowserVersion.BrowserVersionBuilder(BrowserVersion.CHROME).setUserAgent(userAgent[new Random().nextInt(userAgent.length)]).build();Map<String, Integer> proxy = new HashMap();private static final WebClient webClient = new WebClient(browser);ToSpeach toSpeach = new ToSpeach();public static String crawling02(String url) throws NullPointerException {ArrayList<String> texts = new ArrayList();webClient.getOptions().setThrowExceptionOnScriptError(false);webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);webClient.getOptions().setActiveXNative(false);webClient.getOptions().setCssEnabled(false);webClient.getOptions().setJavaScriptEnabled(true);webClient.setAjaxController(new NicelyResynchronizingAjaxController());HtmlPage page = null;try {page = webClient.getPage(url);} catch (Exception e) {e.printStackTrace();} finally {webClient.close();}webClient.waitForBackgroundJavaScript(30000);String pageXml = page.asXml();System.out.println(pageXml);Document document = Jsoup.parse(pageXml);String title = document.title();System.out.println(title);// rich_media_titleElements rich_media_title = document.getElementsByClass("rich_media_title");System.out.println("=================title=====================");//System.out.println(rich_media_title);rich_media_title.forEach(element -> System.out.println(element.getElementsByTag("h1").text()));Elements infoListEle = document.getElementsByClass("rich_media_content");System.out.println("==================content====================");//System.out.println(infoListEle);infoListEle.forEach(element -> System.out.println(element.getElementsByTag("p").text()));System.out.println("================获取封面图=====================");String urlXml = pageXml.substring(pageXml.indexOf("cdn_url_1_1"),pageXml.length());urlXml = urlXml.substring(urlXml.indexOf("\"")+1);String url_01_01 = urlXml.substring(0,urlXml.indexOf("\""));System.out.println(url_01_01);return pageXml;}public static void main(String[] args) {//String url = "https://mp.weixin.qq.com/s/mcUJt29Dq9g4EGH1GgcsGQ";String url = "https://mp.weixin.qq.com/s/s2Txc0xDZ8KTnZk-5vp3JQ";String xml = crawling02(url);// System.out.println(readXMLName02(xml,"title"));}public static String readXMLName02(String s, String name) {if (s.contains(name)) {int start = s.indexOf("<" + name + ">") + name.length() + 2;int end = s.indexOf("</" + name + ">");String substring = s.substring(start, end);return substring;}return null;}@Overridepublic ArrayList<String> crawling(String URL) {return null;}}

公众号文章:

爬取结果:

=================title=====================
Spring中获取bean的八种方式,你get了几种?
==================content====================
大家好,我是锋哥! Java1234 VIP大特惠(仅限100名额)!... 省略
================获取封面图=====================
https://mmbiz.qpic.cn/mmbiz_jpg/JfTPiahTHJhogG8qc16pF4gePH9FfnnLTia8m58vwDztbQCKcpxaoa44htlfuhVBtA9JicRns25WrofQTqzP2icGxw/0?wx_fmt=jpeg

2.爬取CSDN文章

package com.example.tts.service.impl;import com.example.tts.service.ICrawlingService;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Service;import java.util.ArrayList;@Service
public class CSDNCrawlingService implements ICrawlingService {private static WebClient webClient= new WebClient(BrowserVersion.CHROME);public static void crawling02(String URL){webClient.getOptions().setThrowExceptionOnScriptError(false);webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);webClient.getOptions().setActiveXNative(false);webClient.getOptions().setCssEnabled(false);webClient.getOptions().setJavaScriptEnabled(true);webClient.setAjaxController(new NicelyResynchronizingAjaxController());HtmlPage page = null;try {page = webClient.getPage(URL);} catch (Exception e) {e.printStackTrace();}finally {webClient.close();}webClient.waitForBackgroundJavaScript(30000);String pageXml = page.asXml();Document document = Jsoup.parse(pageXml);Elements titleListEle = document.getElementsByTag("title");String title = titleListEle.text();System.out.println("============文章标题=================");System.out.println(title);/*Elements infoListEle = document.getElementById("title").getElementsByTag("li");infoListEle.forEach(element -> {System.out.println(element.getElementsByClass("txt-box").first().getElementsByTag("h3").text());System.out.println(element.getElementsByClass("txt-box").first().getElementsByTag("a").attr("href"));});*/}public static void main(String[] args) {String url = "https://blog.csdn.net/Edward1027/article/details/124859901";crawling02(url);}@Overridepublic ArrayList<String> crawling(String URL) {return null;}
}

文章信息:

爬取结果:

============文章标题=================
CSDN插入表格_码农爱德华的博客-CSDN博客_csdn表格
Disconnected from the target VM, address: '127.0.0.1:58937', transport: 'socket'

五、总结

爬虫内容平时应用比较少,只在这里总结这两种应用,有兴趣的可以多总结,学习如果只是学相对片面,还要结合实际应用。

【技术应用】java通过url爬虫获取公众号文章内容相关推荐

  1. php通过链接获取公众号文章内容,php公众号链接提取文章标题、封面图、摘要、作者、公众号名称、简介、微信号、正文...

    //设置 header header("Content-type:application/json"); //初始化 CURL $ch = curl_init(); //目标服务器 ...

  2. 使用Python快速获取公众号文章定制电子书(二)

    原文链接 我的GitHub博客地址 接上篇文章使用Python快速获取公众号文章定制电子书(一).我们现在已经成功的将公众号历史消息的前十条文章给爬取了出来,使用 content_url 这个关键字段 ...

  3. 如何获取公众号文章并保存有道笔记

    如何获取公众号文章并保存有道笔记 写作目的 1. 获取公众号文章链接 2. 解析公众号文章 3. 保存有道笔记 源代码 最后感想 写作目的 做这个程序是出于自己的学习目的.因为我有学习英语的习惯,每天 ...

  4. 获取公众号文章小工具

    python的自动获取公众号文章 前言 由于作者想每天都发一篇公众号文章,但是却又不想天天写文章,作者没有这个精力和时间,于是,我就想来,写一个小工具,每天就只需要简单的操作就可以快速发布一篇文章,虽 ...

  5. 公众号简单爬虫--把公众号文章全部转载到网站(三)

    公众号简单爬虫--把公众号文章全部转载到网站(三) 根据上一篇的方法,我们得到了一个包含标题,时间,作者,封面,文章连接等信息的json文件.接下来,就是要提取文章详细信息和把一系列的信息写入数据库. ...

  6. 四个步骤,获取公众号文章封面图

    公众号也玩了好多年了,经常有朋友在后台私信问我:xxx文章的封面图可以发一下吗?也怪我,没有保留素材的习惯,就导致好多次都找不到原图了 相信很多朋友也有类似的情况,遇到喜欢的封面图后,发现推文正文中并 ...

  7. 使用Python快速获取公众号文章定制电子书(一)

    原文链接 我的GitHub博客地址 前言 分享一个笔者最近写的 Python 相关的小 demo,爬取某个公众号的所有历史文章,并导出到本地,方便之后在线下环境直接观看.参考了刘志军的小册基于Pyth ...

  8. 通过微信公众平台获取公众号文章

    我之前自己维护了一个公众号,但因为个人关系很久没有更新了,今天上来缅怀一下,却偶然发现了一个获取微信公众号文章的方法. 之前获取方法有很多,通过搜狗.清博.网页端.客户端等等都还可以,这个可能并没有其 ...

  9. 搜狗微信下线了怎么获取公众号文章?手把手教你最新获取方式

    关于微信公众号<云爬虫技术研究笔记>可以看到更多哦! 背景 最近发现搜狗微信在2019.10.29号的时候悄然下线了一个功能,也就是不能在搜狗搜索中指定公众号的名称,如下图   很多媒体以 ...

最新文章

  1. [学习笔记]Segment Tree Beats!九老师线段树
  2. Python3.7环境配置
  3. js去除字符串数字前面的0_JS基础复习-七种基本数据类型
  4. oracle建立dblink
  5. vue数组修改不触发视图更新、vue向响应式对象添加或删除属性
  6. 从FLC中学习的设计模式系列-创建型模式(3)-工厂方法
  7. Python高手之路【十】python基础之反射
  8. table表格高级用法(二)
  9. VMworld 2016 US带来了哪些惊喜?
  10. 《构建之法》阅读笔记03
  11. 【KALI使用】11 搜索引擎 SHODAN
  12. 图像处理我是这样入门的------我的第一篇csdn博文
  13. 计算机最快接口速度,实测:USB3.1究竟比USB3.0接口快多少?
  14. layui之图片上传
  15. 计算机输入法如何显示在桌面快捷方式,电脑桌面输入法图标不见了怎么办
  16. python画rgb渐变色_请问如何在matplotlib中画出自定义渐变色?
  17. 外贸企业邮箱如何撤回已发送的邮件,发错的邮件怎么撤回?
  18. protect java_java中的protect用法介绍
  19. .globl expression
  20. 【高并发趣事二】——JMM及程序中的幽灵

热门文章

  1. Github | 如何在Github上只下载一个文件或文件夹!?
  2. 什么是短链接?长连接?
  3. 【C++】秋招实习面经汇总篇
  4. 中医死期已到之经络的癌本质谭
  5. 猫狗坦克内测了,大家多支持
  6. 计算机及应用自考顺序,自考计算机应用专业科目学习次序
  7. 从入门到精通,Java学习路线导航
  8. 基于计算机视觉再仿真技术,基于计算机视觉技术的纬编针织物三维仿真研究
  9. Flutter: There are multiple heroes that share the same tag within a subtree异常
  10. php 获取新浪股票行情数据,从新浪获取股票历史数据