读取蚂蜂窝某分类下问答浏览数
2016-04-10 17:34
579 查看
http://www.upqq.net/java/189.html
1,向String surl = "http://www.mafengwo.cn/qa/ajax_pager.php?type=0&mddid=10184&tids=0&action=question_index&start="+start;发送连接请求。
2,获取到的输出流(如下,里面中文机标点符号之类会用/u表示),拼接成字符串(StringBuilder)。
{"payload":{"list_html":"\u003cli class=\"item clearfix _j_question_item\" data-qid=\"1826184\"\u003e\n \u003cdiv class=\"wen\"\u003e\n \u003cdiv class=\"label\"\u003e\n \u003cspan class=\"avatar avatar32\"\u003e\u003ca href=\"\/wenda\/u\/31175432.html\" class=\"_j_filter_click\"
target=\"_blank\"\u003e\n \u003cimg class=\"_j_filter_click\" src=\"http:\/\/file28.mafengwo.net\/M00\/F8\/23\/wKgB6lRMvDmAZG2JAADRVqH0XuY02.head.w48.jpeg\" height=\"32\" width=\"32\"\u003e\n \u003c\/a\u003e\u003c\/span\u003e\n \u003cspan class=\"icon icon-gl\"\u003e\u003c\/span\u003e\n
\u003c\/div\u003e\n \u003cdiv class=\"title\"\u003e\n \u003ca href=\"\/wenda\/detail-1826184.html\"(部分)
3,将这个Json字符串解析(要下jar包,可通过http://json.cn/,在线解析看到如下,此时/u已经被解析为可理解的字符了),获取"payload"里“list-item"的字符串,即为我们需要提取的数据源。
{
"payload":Object{...},
"resource":{
"css":[
],
"js":[
]
}
}
{
"payload":{
"list_html":"<li class="item clearfix _j_question_item" data-qid="1826184"> <div class="wen"> <div
class="label"> <span class="avatar avatar32"><a href="/wenda/u/31175432.html" class="_j_filter_click" target="_blank"> <img class="_j_filter_click" (部分)
java代码如下:
JSONObject dataJson=JSONObject.fromObject(sb.toString());
JSONObject response=dataJson.getJSONObject("payload");
String info=response.getString("list_html");
4,json返回的字符串包装成InputStreamReader,便于按行读取。java代码如下:
InputStreamReader isr=new InputStreamReader(new ByteArrayInputStream(info.getBytes(Charset.forName("utf8"))),
Charset.forName("utf8"));
5,写正则表达式,抓取数据源中的数据(问题,发布时间,浏览量)。java代码如下:
String pattern = "<li class=\"item clearfix _j_question_item\" data-qid=\"\\d+\">";
String regularQues = "<a href=\"/wenda/detail-\\d+.html\" class=\"_j_filter_click\" target=\"_blank\">[^<>]*</a>";
String regularDate = ">\\d{4}\\-\\d{1,2}\\-\\d{1,2} \\d{1,2}\\:\\d{1,2}";//日期
String regularViewNum = "<a>浏览[^<>]*</a>";
int index=0;
6,将结果写入excel中(要下jar包)。java代码如下:
static WritableWorkbook wwb;
static WritableSheet ws;
File fileWrite = new File("testWrite.xls");
fileWrite.createNewFile();
OutputStream os = new FileOutputStream(fileWrite);
wwb=Workbook.createWorkbook(os);
ws=wwb.createSheet("问答浏览数目统计",0);
ws.addCell(new Label(0,0,"问题"));
ws.addCell(new Label(1,0,"发布时间"));
ws.addCell(new Label(2,0,"浏览量"));
问题总结:
1,开始直接向http://www.mafengwo.cn/wenda/10184-0/hot.html发送请求,发现只能分析出不到20条记录。然后才发现,网页底端,有个“点击加载”,点击后新加载20条记录。用浏览器的审查元素,查看,可获得如下:
Request URL:
http://www.mafengwo.cn/qa/ajax_pager.php?type=0&mddid=10184&tids=0&app_link=&action=question_index&start=40
2,这个网址返回的是json数据(上面提到的,图中也有显示),刚开始一直傻傻的在想怎么把它编码成中文的。TT
3,当start大于400多时,返回的json为如下:
{"payload":{"list_html":"\u003cdiv class=\"qa-empty\"\u003e\n \u003ci class=\"icon-empty\"\u003e\u003c\/i\u003e\n \u003cp\u003e\u65e0\u76f8\u5173\u95ee\u9898\u003c\/p\u003e\n\u003c\/div\u003e\n","total":500,"page_html":"","ret":1},"resource":{"css":[],"js":[]}}
看来看不到网页列的2万多条记录,只能看到四百多条。
4,单个中文的匹配就是那个中字,程序中用index标记开始读的每一块。[^<>]*这种类型的正则挺好用的。
1,向String surl = "http://www.mafengwo.cn/qa/ajax_pager.php?type=0&mddid=10184&tids=0&action=question_index&start="+start;发送连接请求。
2,获取到的输出流(如下,里面中文机标点符号之类会用/u表示),拼接成字符串(StringBuilder)。
{"payload":{"list_html":"\u003cli class=\"item clearfix _j_question_item\" data-qid=\"1826184\"\u003e\n \u003cdiv class=\"wen\"\u003e\n \u003cdiv class=\"label\"\u003e\n \u003cspan class=\"avatar avatar32\"\u003e\u003ca href=\"\/wenda\/u\/31175432.html\" class=\"_j_filter_click\"
target=\"_blank\"\u003e\n \u003cimg class=\"_j_filter_click\" src=\"http:\/\/file28.mafengwo.net\/M00\/F8\/23\/wKgB6lRMvDmAZG2JAADRVqH0XuY02.head.w48.jpeg\" height=\"32\" width=\"32\"\u003e\n \u003c\/a\u003e\u003c\/span\u003e\n \u003cspan class=\"icon icon-gl\"\u003e\u003c\/span\u003e\n
\u003c\/div\u003e\n \u003cdiv class=\"title\"\u003e\n \u003ca href=\"\/wenda\/detail-1826184.html\"(部分)
3,将这个Json字符串解析(要下jar包,可通过http://json.cn/,在线解析看到如下,此时/u已经被解析为可理解的字符了),获取"payload"里“list-item"的字符串,即为我们需要提取的数据源。
{
"payload":Object{...},
"resource":{
"css":[
],
"js":[
]
}
}
{
"payload":{
"list_html":"<li class="item clearfix _j_question_item" data-qid="1826184"> <div class="wen"> <div
class="label"> <span class="avatar avatar32"><a href="/wenda/u/31175432.html" class="_j_filter_click" target="_blank"> <img class="_j_filter_click" (部分)
java代码如下:
JSONObject dataJson=JSONObject.fromObject(sb.toString());
JSONObject response=dataJson.getJSONObject("payload");
String info=response.getString("list_html");
4,json返回的字符串包装成InputStreamReader,便于按行读取。java代码如下:
InputStreamReader isr=new InputStreamReader(new ByteArrayInputStream(info.getBytes(Charset.forName("utf8"))),
Charset.forName("utf8"));
5,写正则表达式,抓取数据源中的数据(问题,发布时间,浏览量)。java代码如下:
String pattern = "<li class=\"item clearfix _j_question_item\" data-qid=\"\\d+\">";
String regularQues = "<a href=\"/wenda/detail-\\d+.html\" class=\"_j_filter_click\" target=\"_blank\">[^<>]*</a>";
String regularDate = ">\\d{4}\\-\\d{1,2}\\-\\d{1,2} \\d{1,2}\\:\\d{1,2}";//日期
String regularViewNum = "<a>浏览[^<>]*</a>";
int index=0;
6,将结果写入excel中(要下jar包)。java代码如下:
static WritableWorkbook wwb;
static WritableSheet ws;
File fileWrite = new File("testWrite.xls");
fileWrite.createNewFile();
OutputStream os = new FileOutputStream(fileWrite);
wwb=Workbook.createWorkbook(os);
ws=wwb.createSheet("问答浏览数目统计",0);
ws.addCell(new Label(0,0,"问题"));
ws.addCell(new Label(1,0,"发布时间"));
ws.addCell(new Label(2,0,"浏览量"));
问题总结:
1,开始直接向http://www.mafengwo.cn/wenda/10184-0/hot.html发送请求,发现只能分析出不到20条记录。然后才发现,网页底端,有个“点击加载”,点击后新加载20条记录。用浏览器的审查元素,查看,可获得如下:
Request URL:
http://www.mafengwo.cn/qa/ajax_pager.php?type=0&mddid=10184&tids=0&app_link=&action=question_index&start=40
2,这个网址返回的是json数据(上面提到的,图中也有显示),刚开始一直傻傻的在想怎么把它编码成中文的。TT
3,当start大于400多时,返回的json为如下:
{"payload":{"list_html":"\u003cdiv class=\"qa-empty\"\u003e\n \u003ci class=\"icon-empty\"\u003e\u003c\/i\u003e\n \u003cp\u003e\u65e0\u76f8\u5173\u95ee\u9898\u003c\/p\u003e\n\u003c\/div\u003e\n","total":500,"page_html":"","ret":1},"resource":{"css":[],"js":[]}}
看来看不到网页列的2万多条记录,只能看到四百多条。
4,单个中文的匹配就是那个中字,程序中用index标记开始读的每一块。[^<>]*这种类型的正则挺好用的。
相关文章推荐
- 《day12---异常》
- Linux硬链接与软连接
- 图文详解 IntelliJ IDEA 15 创建普通 Java Web 项目
- 汇编-逆置一个数组
- 拍A发B活动结合淘宝网红推广引流优化宝贝权重
- 小代码 栈的简单实现
- AFNetworking 详解
- Servlet入门(二)
- 结对汉堡
- nginx 日志分析,python 实现
- 日期
- app的国际化方案(待整理)
- 堆排序 和 堆的大数据应用
- 电梯演讲
- 多层循环的变量如何将值传出
- ASP.NET MVC4入门教程(七):给电影表和模型添加新字段
- C语言中整型与指针之间转换的注意点
- 有关输入输出流和头文件的问题(在vs中)
- Tomcat中 server.xml 的Context的配置
- 中文字符转数字(可能会很大)