java 爬虫实战

[toc]

为什么

到圣诞节了,总是要买礼物的,可是这个题目吸引了我,然后匿名答了一下就很气呀。剩下的就不多说了。让我们来爬一下然后分析一下

技术

httpclient + jsoup

原因:学过jQuery 选择器很不错

开始搞

首先看看一下题目2017 圣诞节有哪些适合送给女朋友的礼物?:https://www.zhihu.com/question/27082996

  1. 看f12 检查网络和页面格式
  2. 发现知乎的回答都是前端渲染class为 List-item的 而且内容是渲染class为RichText CopyrightRichText-richText
 Elements element1=document.getElementsByClass("List-item");
            for (int i = 0; i <element1.size() ; i++) {
                Element element=element1.get(i);//RichText CopyrightRichText-richText
                Elements elements=element.getElementsByClass("RichText CopyrightRichText-richText");
  1. 但是它是动态的 我开始以为后台渲染呢,然后找到了json请求

获取json

  1. 页面不行,通过看网络发现有一个AJAX请求是获取评论数据的,那我们就获取这个json数据就行了
  2. json数据格式如下

  3. 分析json格式 发现 paging里面有 next是指向下一个数据的,因为开始的请求只能获取20条数据,然后到底的时候再通过next获取下20条数据

  4. 还有is_start和is_end 判断开始和结束,那么我们只要知道第一个ajax请求,然后遍历next就可以获取全部了,结束靠is_end判断
  5. 先在分析一下data数据的格式吧 在后面一个

java 代码

@Test
  public void getJSONByZhiHu(){
       HttpClient httpClient=HttpClients.createDefault();
        HttpGet httpGet=new HttpGet(        "https://www.zhihu.com/api/v4/questions/27082996/answers?include);
        Header []headers=new Header[5];
        headers[0]=new BasicHeader("cookie","udid=\"");
        headers[1]=new BasicHeader("accept","application/json, text/plain, */*");
        headers[2]=new BasicHeader("authorization","");
        headers[3]=new BasicHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36");
        headers[4]=new BasicHeader("X-UDID","");

        JSONObject jsonObject=getJSONByURL(s,headers);

        while(true){
            String next=jsonObject.getString("next");
            jsonObject=getJSONByURL(next,headers);

            if (jsonObject.getBoolean("isEnd"))break;
        }

    }

循环里面被调的httpclient函数

public JSONObject getJSONByURL(String s,Header[] headers){
        HttpClient httpClient=HttpClients.createDefault();
        HttpGet httpGet=new HttpGet(s);
        httpGet.setHeaders(headers);

        HttpResponse response= null;

        JSONObject retu=new JSONObject();
        try {
            response = httpClient.execute(httpGet);
            HttpEntity httpEntity=response.getEntity();
            String content=EntityUtils.toString(httpEntity);
            JSONObject jsonObject=JSONObject.parseObject(content);

            JSONArray jsonArray=jsonObject.getJSONArray("data");
            JSONObject after=jsonObject.getJSONObject("paging");
            String next=after.getString("next");
            int total=after.getInteger("totals");

            retu.put("next",next);
            retu.put("totals",total);
            retu.put("size",jsonArray.size());
            retu.put("isEnd",after.getBooleanValue("is_end"));

            for (int i = 0; i <jsonArray.size() ; i++) {
                JSONObject jsonObject1=jsonArray.getJSONObject(i);
                System.out.println("--");
                //content 是有格式的 带图片
                // 这个只是简单的获取评论, 后面有对jsonArray的深入分析
                System.out.println(jsonObject1.get("excerpt"));
            }
            System.out.println("--------"+jsonArray.size());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return retu;
    }

知乎data数据格式分析


自己看吧


评论

《“java 爬虫实战”》 有 1 条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注