您的位置:首页 > 移动开发 > 微信开发

【java】微信文章抓取

2017-10-14 16:47 120 查看

1.搜狗微信url解析

以搜索
湖北师范大学
为例:



请求的url为:

http://weixin.sogou.com/weixin?query=%E6%B9%96%E5%8C%97%E5%B8%88%E8%8C%83%E5%A4%A7%E5%AD%A6&sug_type=&sut=636&lkt=0%2C0%2C0&s_from=input&sug=y&type=2&sst0=1507963160393&page=1&ie=utf8&w=01019900&dr=1

其中有这样两个参数:

query=%E6%B9%96%E5%8C%97%E5%B8%88%E8%8C%83%E5%A4%A7%E5%AD%A6

page=1


query为请求的搜索内容(这里浏览器对中文做了编码转换);

page为当分页参数(直接搜索没有该参数,在点击下一页或者上一页后就有了)

这两个参数用作对搜索结果的控制。然后下一步进行链接提取。

2.微信文章链接提取

2.1 寻找文章url

这是搜索结果页面:



现在需要把每个标题对应的链接提取出来。

首先查看该页面的html源码,并找到标题所在的标签。

我们用win10自带浏览器Edge的检查元素功能,直接找到标题。

可以得到这样一个div标签:



其中a标签的href属性就是文章链接,h3中的文本内容为文章的标题,p标签内为文章内容截取,下一个div内有文章的发表时间和公众号名称等信息,这里只关注url,即href属性的值。

2.2 获取文章url

本次采用java获取url。

首先下载Jsoup包,该包提供了对html文档的解以及和jquery极为相似的语法选择器,用起来很方便。

下载地址http://jsoup.org

我们需要导入4个jar包:

jsoup-1.10.3.jar

commons-logging-1.2.jar

httpclient-4.5.3.jar

httpclient-4.4.6.jar

(注:后两个包的下载地址:http://hc.apache.org/httpclient-3.x/ 该包对http客户端工具包,比jdk自带的好用一点)

1.首先获取搜索结果的页面Html源码:(关键代码)

public String getHtml(String url) throws IOException {
String html = "";
CloseableHttpClient httpClient = HttpClients.createDefault();// 创建httpClient对象
HttpGet httpget = new HttpGet(url);
try {
HttpResponse responce = httpClient.execute(httpget);//
int resStatu = responce.getStatusLine().getStatusCode();
if (resStatu == HttpStatus.SC_OK) {

HttpEntity entity = responce.getEntity();
if (entity != null) {
html = EntityUtils.toString(entity);// 获得html源代码
}
}
} catch (Exception e) {
System.out.println("访问 " + url + " 出现异常!");
e.printStackTrace();
} finally {
// 释放连接
httpClient.close();
}
return html;
}


(注:可以不用该方法获取html内容,直接用jsoup内的Jsoup.parse(url)方法也能)

2.然后将获取到的源码转换为Jsoup的Document对象(关键代码)

String SougouWechatHtml = htmlUtil.getHtml(SougouWechatUrl);
Document SougouWechatDoc = Jsoup.parse(SougouWechatHtml);


3.利用css语法选择器select获取url

Elements urls = SougouWechatDoc.select(".txt-box h3 a");
List<SougouWechart> sougouWechartList = new ArrayList<>();
for (Element url : urls) {
sougouWechartList.add(new SougouWechart(url.text(), url.attr("href")));
}


这样就获取到了一个文章Url集合。

获取的url列表:



下一步进行对文章内容的提取。

3.微信文章内容提取

首先还是分析页面元素。

我们以搜索到的第二条内容为例,这是文章内容的详情页:



我们要获取的就是红框里的内容。

同样的,用检查元素的方法找到标题:



< div id = “img-content” >这个div里的内容就是要获取的内容啦。

和获取链接的方法一样,还是先或去该页面的html源码,然后利用选择器找出里边的内容或属性的值。

Document wechartArticlDoc = Jsoup.parse(wechartArticleHtml);
Elements tittle = wechartArticlDoc.select(".rich_media_title");
Element author = wechartArticlDoc.select(".rich_media_meta.rich_media_meta_text").get(1);
Elements time = wechartArticlDoc.select(".rich_media_meta.rich_media_meta_text#post-date");
Elements content = wechartArticlDoc.select(".rich_media_content#js_content");
String alterContent = content.html().replace("data-src", "src");// 将属性data-src替换为src,否则图片不能正常显示
Elements publicSign = wechartArticlDoc.select(".rich_media_meta.rich_media_meta_text.rich_media_meta_nickname");


对于文章内容来
4000
说,如果想保留原来的排版样式,则获取html源码;如果只是想获取文本内容则用Jsoup的text()方法即可获取不包含标签元素的文本内容。

(注:在获取文章内容是发现,img标签内用的是data-src属性,不是src属性,所以会导致获取到的文章内容无法显示图片的问题,所以需要对文章内容中的data-src替换为src即可显示图片。

获取到的文章信息:



获取到的文章内容(源码)(放在了markdown中显示):



(注:获取到的内容大部分能正常显示,但有少部分会出现无法解析html的情况,比如这个)

4.下载

下载地址:微信文章抓取工具
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java url 微信 抓取