1. 程式人生 > >讀取螞蜂窩某分類下問答瀏覽數

讀取螞蜂窩某分類下問答瀏覽數

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標記開始讀的每一塊。[^<>]*這種型別的正則挺好用的。

相關推薦

讀取螞蜂分類問答瀏覽

http://www.upqq.net/java/189.html 1,向String surl = "http://www.mafengwo.cn/qa/ajax_pager.php?type=0&mddid=10184&tids=0&acti

java使用jsoup,多執行緒批量爬取天極網分類的圖片

 小Demo轉自csdn某作者, 本例子只作為測試,頁面個數直接設定了100個,可以可能會少或者多,容易報錯,更優化的一種方式是獲取“下一頁”按鈕的地址,然後再訪問,當訪問不到“下一頁”的內容時跳出 多執行緒只體現在檔案提取,也可以在elements迴圈中再加一個多執行緒

java使用jsoup,多執行緒批量爬取天極網分類的美女圖片

本例子只作為測試,頁面個數直接設定了100個,可以可能會少或者多,容易報錯,更優化的一種方式是獲取“下一頁”按鈕的地址,然後再訪問,當訪問不到“下一頁”的內容時跳出 多執行緒只體現在檔案提取,也可以在elements迴圈中再加一個多執行緒訪問頁面的 本案例需要jsoup包的

java將文件夾md5為名的圖片與據庫查詢對應md5後導入相應圖片到分類

getc selectall height user save etc jpg span filter public class FolderUtil {   /** * @param path * @return * 得到目錄下的文件

ecshop呼叫指定商品分類固定條的商品品牌列表

通過二次開發可以實現ECSHOP首頁呼叫指定分類下的品牌列表。 第一步: 開啟根目錄下的index.php 在最後面 ?> 前面加入以下程式碼: /** * 獲得某個分類下的品

Python3原生爬蟲獲取熊貓直播分類的主播人氣並儲存到Excel

import re import openpyxl from urllib import request # 斷點除錯 class Spider: url = 'https://www.panda.tv/cate/lol' root_pattern = '<di

用shell查找目錄的最大文件(轉)

log 異常 nbsp 過濾 exe -type 信息 int div 這是一個很有趣的問題,因為作為一個shell菜鳥,我第一時間是沒有任何想法的。心裏納悶為什麽這樣的操作Linux居然沒有直接的命令實現這樣的查詢。 很自然地,第一感覺就是用awk去實現,因為菜鳥我看aw

Android開發系列(十七):讀取assets文件夾據庫文件

pack 取數 code ada tracking 編寫 數據庫 sdn where 在做Android應用的時候,不可避免要用到數據庫。可是當我們把應用的apk部署到真機上的時候,已經創建好的數據庫及其裏邊的數據是不能隨著apk一起安裝到真機上的。 (PS:這篇

掃描目錄的所有文件的MD5碼並導出文件【可執行jar】

output clean mvn clean hot sts balance tid eat .get pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.

讀取某個文件夾的所有文件

tab stat ioe message delete catch dex 文件 exce import java.io.FileNotFoundException;import java.io.IOException;import java.io.File;public

SQL SERVER :1、遞歸查詢父分類的各個子分類。 2、查詢每個商品分類中最貴的前兩個商品SQL

nio span clas 適用於 商品 一行 class com 分享圖片 1、遞歸查詢父分類下的各個子分類。表設計: SQL: --CTE 語句(適用於MSSQL2005以後版本) with cte_testNavi(Id,Name,Pid ) as ( --這是查

3.3.5 高效讀取:不變模式的CopyOnWriteArrayList

true ray 新的 nts ont image public bool write 源碼分析:讀寫(get,add) 一:get 方法 private E get(Object[] a, int index) { return (E) a[index];}可

Python讀取指定文件夾的文件

for 指定 append color return Coding user 一個 元組 1 # -*- coding: utf-8 -*- 2 import csv 3 import os 4 import pandas as pd 5 #提取文件夾下的地址+

全路徑無限分類拉列表的實現

rom fun rep 最終 [] 深度 color -- echo 最終效果圖: 代碼詳情: include(‘db.inc.php‘); function likecate($path=‘‘){ sql = "select id,catename,path

Linux 查找目錄包含關鍵詞的所有文件

code 大小 fin int lin django mys bash string 比如, 需要找到Django框架的配置文件, 修改取消debug模式:awk cd mysite awk -F: ‘/DEBUG/{print FILENAME NR $0 }‘ *.

如何通過簡單的java代碼讀取本地磁盤目錄的所有文件或者文件夾?

宋體 files test out sys nbsp 得到 ring 輸出 public class FileTest { public static void main(String[] args) { //註意:File導 import java.io.File

Spring boot 讀取jar包中resources的檔案

package com.jiankunking.elasticsearch.extension.util; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core

判斷檔案是否存在路徑

if (System.IO.File.Exists(Server.MapPath("/images/qrcode/vpopc_qrcode/GZ/") + zhbh + ".jpg")) { gzewm.Attributes.Add("src", "/images/qrcode/vpopc_qrcode/GZ

python3-對目錄的文字檔案分詞

from pathlib import Path import os import re pathName='./' fnLst=list(filter(lambda x:not x.is_dir(),Path(pathName).glob('**/*.txt'))) print(fnLst) for fn

python3-對目錄的文本文件分詞

dynamic rom help any end eal txt orm script from pathlib import Path import os import re pathName=‘./‘ fnLst=list(filter(lambda x:not x.i