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

来源:互联网 发布:广东客家话翻译软件 编辑:程序博客网 时间:2024/04/30 09:53

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条记录。用浏览器的审查元素,查看,可获得如下:

  1. 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标记开始读的每一块。[^<>]*这种类型的正则挺好用的。

0 0