zoukankan      html  css  js  c++  java
  • 【java】微信文章抓取

    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");

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

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

    获取到的文章信息:

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

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

    4.下载

    下载地址:微信文章抓取工具

  • 相关阅读:
    IE6,IE7 DIV高度技巧(div高度兼容问题)
    QQ在线咨询插件
    Singleton单件 (创建型模式)
    SQL Server ErrorLog 错误日志(如果数据库所占空间变大)
    IE6 div标签height的Bug
    c# 中 Volatile关键字理解
    翻译:SWFObject 2.0官方文档(用来做flash的js)
    已连接到空闲例程的问题解决办法
    Oracle 的一个非常好的触发器例子
    Oracle中表的非常全面的操作
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286772.html
Copyright © 2011-2022 走看看