以搜索湖北师范大学
为例:
请求的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为当分页参数(直接搜索没有该参数,在点击下一页或者上一页后就有了)
这两个参数用作对搜索结果的控制。然后下一步进行链接提取。
这是搜索结果页面:
现在需要把每个标题对应的链接提取出来。
首先查看该页面的html源码,并找到标题所在的标签。
我们用win10自带浏览器Edge的检查元素功能,直接找到标题。
可以得到这样一个div标签:
其中a标签的href属性就是文章链接,h3中的文本内容为文章的标题,p标签内为文章内容截取,下一个div内有文章的发表时间和公众号名称等信息,这里只关注url,即href属性的值。
本次采用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 sougouWechartList = new ArrayList<>();
for (Element url : urls) {
sougouWechartList.add(new SougouWechart(url.text(), url.attr("href")));
}
这样就获取到了一个文章Url集合。
获取的url列表:
下一步进行对文章内容的提取。
首先还是分析页面元素。
我们以搜索到的第二条内容为例,这是文章内容的详情页:
我们要获取的就是红框里的内容。
同样的,用检查元素的方法找到标题:
< 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");
对于文章内容来说,如果想保留原来的排版样式,则获取html源码;如果只是想获取文本内容则用Jsoup的text()方法即可获取不包含标签元素的文本内容。
(注:在获取文章内容是发现,img标签内用的是data-src属性,不是src属性,所以会导致获取到的文章内容无法显示图片的问题,所以需要对文章内容中的data-src替换为src即可显示图片。
获取到的文章信息:
获取到的文章内容(源码)(放在了markdown中显示):
(注:获取到的内容大部分能正常显示,但有少部分会出现无法解析html的情况,比如这个)
下载地址:微信文章抓取工具