这几天学习了一下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<Cnblog> GetContens(String content) {
ArrayList<Cnblog> results = new ArrayList<Cnblog>();
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封装表单数据
重点就是要知道如何模拟请求,然后就是如何解析获取的返回数据