文档开发者中心
我的

Java 爬虫遇上数据异步加载,试试这两种办法!【后】

有几百条的请求,该如何查找到是哪条请求获取的要闻数据呢?你不嫌麻烦的话,可以一个一个的去点,肯定能够查找到的,另一种快捷的办法是利用 network 的搜索功能,如果你不知道搜索按钮,我在上图已经圈出来啦,我们在要闻中随便复制一个新闻标题,然后检索一下,就可以获取到结果,如下图所示:

这样我们就快速的获取到了要闻数据的请求链接,链接为:https://temp.163.com/special/00804KVA/cm_yaowen.js?callback=data_callback,访问该链接,查看该链接返回的数据,如下图所示:

从数据我们可以看出,我们需要的数据都在这里啦,所以我们只需要解析这段数据接可以啦,要从这段数据中解析出新闻标题和新闻链接,有两种方式,一种是正则表达式,另一种是将该数据转成 json 或者 list。这里我选择第二种方式,利用 fastjson 将返回的数据转换成 JSONArray 。所以我们是要引入 fastjson ,在 pom.xml 中引入 fastjson 依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.59</version></dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

除了引入 fastjson 依赖外,我们在转换前还需要对数据进行简单的处理,因为现在的数据并不符合 list 的格式,我们需要去掉 data_callback( 和最后面的 )。具体反向解析获取网易要闻的代码如下:

/**
 * 使用反向解析法 解决数据异步加载的问题
 *
 * @param url
 */public void httpclientMethod(String url) throws IOException {

    CloseableHttpClient httpclient = HttpClients.createDefault();
    HttpGet httpGet = new HttpGet(url);
    CloseableHttpResponse response = httpclient.execute(httpGet);
    if (response.getStatusLine().getStatusCode() == 200) {
        HttpEntity entity = response.getEntity();
        String body = EntityUtils.toString(entity, 'GBK');
        // 先替换掉最前面的 data_callback(
        body = body.replace('data_callback(', '');
        // 过滤掉最后面一个 )右括号
        body = body.substring(0, body.lastIndexOf(')'));
        // 将 body 转换成 JSONArray
        JSONArray jsonArray = JSON.parseArray(body);
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject data = jsonArray.getJSONObject(i);
            System.out.println('文章标题:' + data.getString('title') + ' ,文章链接:' + data.getString('docurl'));
        }
    } else {
        System.out.println('处理失败!!!返回状态码:' + response.getStatusLine().getStatusCode());
    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

编写 main 方法,执行上面的方法,需要注意的地方是:这时候传入的链接为https://temp.163.com/special/00804KVA/cm_yaowen.js?callback=data_callback 而不是 https://news.163.com/。得到如下结果:

两种方法都成功的获取到了网易要闻异步加载的新闻列表,对于这两种方法的选取,我个人的倾向是使用反向解析法,因为它的性能和稳定是都要比内置浏览器内核靠谱,但是对于一些使用 JavaScript 片段渲染的页面,内置浏览器又更加靠谱。所以根据具体情况选择吧。

希望这篇文章对你有所帮助,下一篇是关于 爬虫IP 被封的问题。如果你对爬虫感兴趣,不妨关注一波,相互学习,相互进步

源代码:源代码

文章不足之处,望大家多多指点,共同学习,共同进步

点赞
收藏
回复
分享
举报
浏览424 发布于2019-11-17 05:56未知归属地
全部评论
最多点赞
最新发布
最早发布
暂无评论
暂无评论
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。