您的位置:首页 > 其它

读取蚂蜂窝某分类下问答浏览数

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标记开始读的每一块。[^<>]*这种类型的正则挺好用的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: