java爬虫之爬取博客园推荐文章列表

这几天学习了一下Java爬虫的知识,分享并记录一下;

写一个可以爬取博客园十天推荐排行的文章列表
通过浏览器查看下一页点击请求,可以发现

在点击下一页的时候是执行的
post请求,请求地址为
http://www.cnblogs.com/mvc/AggSite/PostList.aspx
请求参数为图片下部标红的部分;知道这些就可以调用httpclient的API接口来实现请求了,代码如下

    // SendPost,cnblog專用
    public static String SendPostCnBlog(String url, JSONObject jo) {
        CloseableHttpClient client = HttpClients.createDefault();
        String result = "查询失败";
        try {
            HttpPost httpPost = new HttpPost(url);
            StringEntity entity = new StringEntity(jo.toString(), "utf-8");// 解决中文乱码问题
            entity.setContentEncoding("UTF-8");
            entity.setContentType("application/json");
            httpPost.setEntity(entity);
            HttpResponse resp = client.execute(httpPost);

            if (resp.getStatusLine().getStatusCode() == 200) {
                HttpEntity he = resp.getEntity();
                result = EntityUtils.toString(he, "UTF-8");
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                client.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        return result;
    }
    //cnblog -post请求
    public static JSONObject jsonMaker(int i){
        JSONObject jo = new JSONObject();
        jo.put("CategoryType", "TopDiggs");
        jo.put("ParentCategoryId", 0);
        jo.put("CategoryId", 0);
        jo.put("PageIndex", i);
        jo.put("TotalPostCount", 0);
        jo.put("ItemListActionName", "PostList");

        return jo;

    }

通过上面的方法我们可以获取数据,但是这些数据需要进行格式化;

通过浏览器审查元素可以看到每一块文章都是在post_item_body这个div块中;里面包含了文章表体以及链接地址,知道了这些就可以利用Jsoup的API接口来帮我们完成解析了,代码如下

    // 获取cnblog详细内容
    public static ArrayList GetContens(String content) {
        ArrayList results = new ArrayList();
        Document doc = Jsoup.parse(content);
        Elements items = doc.getElementsByClass("post_item_body");
        for (Element item : items) {
            Element h2TagEle = item.getElementsByTag("h3").first(); // 推荐内容标题元素
            Element aTagEl = h2TagEle.getElementsByTag("a").first(); // 推荐内容的Url超链接元素
            String href = aTagEl.attr("href");
            System.out.println(aTagEl.text() + "  " + href);
        }
        return results;
    }

好了,这就是最后的运行结果;

参考资料:

使用爬虫来获取知乎的编辑推荐内容
httpclient模拟post请求json封装表单数据

重点就是要知道如何模拟请求,然后就是如何解析获取的返回数据

你可能感兴趣的:(java)