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.下载

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

  • 相关阅读:
    单例模式
    Curator Zookeeper分布式锁
    LruCache算法原理及实现
    lombok 简化java代码注解
    Oracle客户端工具出现“Cannot access NLS data files or invalid environment specified”错误的解决办法
    解决mysql Table ‘xxx’ is marked as crashed and should be repaired的问题。
    Redis 3.0 Cluster集群配置
    分布式锁的三种实现方式
    maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令
    How to Use Convolutional Neural Networks for Time Series Classification
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286772.html
Copyright © 2011-2022 走看看