CSDN爬蟲(四)——博客專家(所有)爬取+數據分析
說明
- 開發環境:jdk1.7+myeclipse10.7+win74bit+mysql5.5+webmagic0.5.2+jsoup1.7.2
- 爬蟲框架:webMagic
- 建議:建議首先閱讀webMagic的文檔,再查看此係列文章,便於理解,快速學習:http://webmagic.io/
- 開發所需jar下載(不包括數據庫操作相關jar包):點我下載
- 該系列文章會省略webMagic文檔已經講解過的相關知識。
概述
- 我們會從博客專家首頁http://blog.csdn.net/experts.html#list分析頁面,從中到找到所有專家所在的“接口”(需要分析網頁源碼),從中爬取所用專家用戶,保存到本地數據庫。
- 根據專家id也即用戶id去爬取他們的博客列表(第二篇文章已經講解過該部分)。
- 因爲,博客專家是CSDN的核心用戶,文章相對而言質量也比較高,優先考慮爬取這一部分用戶即其文章。
- 根據博客專家的文章總瀏覽量、關注數、博文單的閱讀數、評論數進行排序,找出“最有價值”的文章以及博客專家。
博客專家爬蟲代碼預覽
package com.wgyscsf.spider;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import com.wgyscsf.utils.MyStringUtils;
/**
* @author wgy</n> 編寫日期 2016-9-24下午7:25:36</n> 郵箱 [email protected]</n> 博客
* http://blog.csdn.net/wgyscsf</n> TODO</n>
*/
public class CsdnExpertListSpider implements PageProcessor {
// 這個是列表頁
public static final String EXPERTS_LIST = "http://blog\\.csdn\\.net/peoplelist\\.html\\?channelid=0\\&page="
+ "\\w+";
private static final String TAG = "CsdnExpertListSpider";
// 博客詳情頁
// public static final String EXPERTS_DETAILS =
// "http://blog.csdn.net/\\w+";// \\w+是一個匹配符,可以匹配任意字段
private Site site = Site
.me()
.setDomain("blog.csdn.net")
.setSleepTime(300)
.setUserAgent(
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31");
@Override
public void process(Page page) {
// 列表頁: 這裏進行匹配,匹配出列表頁進行相關處理。
if ((page.getUrl()).regex(EXPERTS_LIST).match()) {
// 遍歷出div[@class=\"page_nav\"]節點下的所有超鏈接,這裏的超鏈接是分頁的超鏈接,可以進行分頁。
page.addTargetRequests(page.getHtml()
.xpath("//div[@class=\"page_nav\"]").links()
.regex(EXPERTS_LIST).all());// 是一個正則規則,校驗使用,可以省略。
// 獲取專家列表元素
Elements expertList_elements = page.getHtml().getDocument()
.getElementsByClass("experts_list");
for (Element element : expertList_elements) {
// 兩個根節點
Element tag_dt = element.getElementsByTag("dt").get(0);
Element tag_dd = element.getElementsByTag("dd").get(0);
// 獲取用戶id
String id_expert = MyStringUtils.getLastSlantContent(tag_dt
.getElementsByTag("a").get(0).attributes().get("href"));
// 獲取用戶頭像
String headImg = tag_dt.getElementsByTag("a").get(0)
.getElementsByClass("expert_head").get(0).attributes()
.get("src");
// 獲取用戶名
String name = tag_dd.getElementsByTag("a").get(0).text();
String address_job = tag_dd.getElementsByTag("div").get(0)
.text();
// 獲取地址
String localtion = MyStringUtils
.getBeforeVercitalLine(address_job);
// 獲取職位
String job = MyStringUtils.getAfterVercitalLine(address_job);
// 獲取文章數
String articleNums = tag_dd.getElementsByTag("div").get(1)
.getElementsByTag("div").get(1).getElementsByTag("b")
.get(0).text();
// 獲取閱讀數
// TODO:這裏邏輯不太對呀,但是結果正確
String readNums = tag_dd.getElementsByTag("div").get(1)
.getElementsByTag("div").get(2).getElementsByTag("b")
.get(0).text();
// 開始組裝數據
System.out.println(TAG + ":" + "專家id:" + id_expert + ",專家名字:"
+ name + ",地區:" + localtion + ",職業:" + job + ",文章總閱讀數:"
+ readNums + ",文章數:" + articleNums);
}
}
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider.create(new CsdnExpertListSpider())
.addUrl("http://blog.csdn.net/peoplelist.html?channelid=0&page=1")
.addPipeline(null).thread(5).run();
}
}
關鍵代碼解釋
- 以上代碼涉及分頁爬蟲、jsoup方式解析爬蟲、正則匹配,具體請參考前三篇文章。
- 涉及到一個“接口”
"http://blog.csdn.net/peoplelist.html?channelid=0&page=1"
,這個接口是分析博客專家首頁http://blog.csdn.net/experts.html#list網頁源碼後得到的,極大的方便了博客專家的爬取過程。正是由於有了這個“接口”,才使得爬取博客專家特別方便。
爬取結果預覽
數據分析
注: 博客專家(全部專家):1255人,博客總量(部分數據): 298057,統計時間:10/7/2016 6:28:34 PM
- 博客專家按博文瀏覽量排名前十名
總瀏覽量排名 | 專家Id | 專家名稱 | 地址 | 職位 | 文章量 | 總閱讀量 | 博客地址 | 個人中心 |
1 | v_JULY_v | 周磊 | 158 | 11651669 | http://blog.csdn.net/v_JULY_v | http://my.csdn.net/v_JULY_v | ||
2 | luopingfeng | 羅平峯 | 廣東省深圳市 | 驅動工程師 | 48 | 11335406 | http://blog.csdn.net/luopingfeng | http://my.csdn.net/luopingfeng |
3 | tianlesoftware | 戴明明 | 杭州 | DBA | 1092 | 10306025 | http://blog.csdn.net/tianlesoftware | http://my.csdn.net/tianlesoftware |
4 | lmj623565791 | 張鴻洋 | 陝西西安 | 研究生 | 195 | 10204783 | http://blog.csdn.net/lmj623565791 | http://my.csdn.net/lmj623565791 |
5 | sunboy_2050 | 楊剛 | 北京 | 高級工程師 | 864 | 9437469 | http://blog.csdn.net/sunboy_2050 | http://my.csdn.net/sunboy_2050 |
6 | 21aspnet | 黃鳴 | 1680 | 8816125 | http://blog.csdn.net/21aspnet | http://my.csdn.net/21aspnet | ||
7 | Luoshengyang | 羅昇陽 | 上海 | 客戶端開發 | 177 | 8643601 | http://blog.csdn.net/Luoshengyang | http://my.csdn.net/Luoshengyang |
8 | luozhuang | 羅莊 | 1091 | 7857322 | http://blog.csdn.net/luozhuang | http://my.csdn.net/luozhuang | ||
9 | david_lv | 呂建偉 | 北京 | 北京 | 514 | 7665707 | http://blog.csdn.net/david_lv | http://my.csdn.net/david_lv |
10 | Augusdi | 高慶地 | 南京 | 研發工程師 | 4082 | 7327363 | http://blog.csdn.net/Augusdi | http://my.csdn.net/Augusdi |
* 博客專家按博文創作量排名前十名
總博文量排名 | 專家Id | 專家名稱 | 地址 | 職位 | 文章量 | 總閱讀量 | 博客地址 | 個人中心 |
1 | yuanmeng001 | 袁萌 | 4095 | 7117504 | http://blog.csdn.net/yuanmeng001 | http://my.csdn.net/yuanmeng001 | ||
2 | Augusdi | 高慶地 | 南京 | 研發工程師 | 4082 | 7327363 | http://blog.csdn.net/Augusdi | http://my.csdn.net/Augusdi |
3 | SmartTony | 鄧斌 | 中國上海市 | 執行董事 | 2792 | 3619000 | http://blog.csdn.net/SmartTony | http://my.csdn.net/SmartTony |
4 | jdsjlzx | 李治現 | 北京 | Android開發工程師 | 2314 | 6496619 | http://blog.csdn.net/jdsjlzx | http://my.csdn.net/jdsjlzx |
5 | jackyrongvip | 廖煜嶸 | 廣州 | IT開發工程師 | 2254 | 1287146 | http://blog.csdn.net/jackyrongvip | http://my.csdn.net/jackyrongvip |
6 | shanyou | 張善友 | 2172 | 1324942 | http://blog.csdn.net/shanyou | http://my.csdn.net/shanyou | ||
7 | metababy | 花純春 | 成都 | 成都 | 2058 | 4456469 | http://blog.csdn.net/metababy | http://my.csdn.net/metababy |
8 | hu_zhenghui | 胡爭輝 | 2024 | 2492625 | http://blog.csdn.net/hu_zhenghui | http://my.csdn.net/hu_zhenghui | ||
9 | sxhelijian | 賀利堅 | 煙臺 | 教師 | 1978 | 4459980 | http://blog.csdn.net/sxhelijian | http://my.csdn.net/sxhelijian |
10 | matrix67 | 顧森 | 1899 | 814777 | http://blog.csdn.net/matrix67 | http://my.csdn.net/matrix67 | ||
* 博文評論量最多前十名
評論數排名 | 博主id | 評論數 | 瀏覽量 | 博文標題 | 博客詳情地址 | 發表日期 | 置頂與否 |
1 | xiaominghimi | 984 | 107300 | Himi淺談遊戲開發de自學歷程!(僅供參考) | http://blog.csdn.net/xiaominghimi/article/details/6249005 | 2011/3/14 10:18 | 1 |
2 | zhmxy555 | 974 | 180921 | 【Visual C++】遊戲開發筆記之一——API函數、DirectX的關鍵系統 | http://blog.csdn.net/poem_qianmo/article/details/7318264 | 2012/3/4 8:59 | 1 |
3 | yincheng01 | 810 | 19303 | 年少癡狂,懷戀曾經的創業歲月,語音識別的應用遠遠未到高潮,本人的軟件源碼開源,需要的留下Email,我給大家發 | http://blog.csdn.net/itcastcpp/article/details/4146494 | 2009/5/3 21:57 | 0 |
4 | chgaowei | 785 | 62174 | 給部分培訓學生的建議 | http://blog.csdn.net/chgaowei/article/details/6013554 | 2010/11/16 22:49 | 0 |
5 | wdaming1986 | 784 | 91414 | Android鬧鐘最終版【android源碼鬧鐘解析】 | http://blog.csdn.net/wdaming1986/article/details/7461043 | 2012/4/14 18:14 | 0 |
6 | jirigala | 780 | 43372 | 技術水平的確很高,正規公司爲什麼還是不錄用這些人(技術水平不高的更不可能) | http://blog.csdn.net/jirigala/article/details/5565158 | 2010/5/6 11:02 | 0 |
7 | 21aspnet | 749 | 510256 | C#精髓 第四講 GridView 72般絕技 | http://blog.csdn.net/21aspnet/article/details/1540301 | 2007/3/25 4:36 | 1 |
8 | shimiso | 745 | 39352 | Android精品開源項目整理_V20140221(持續更新中..) | http://blog.csdn.net/shimiso/article/details/19771915 | 2014/2/23 22:06 | 0 |
9 | sinyu890807 | 676 | 94932 | 歷時一年,我的著作《第一行代碼——Android》已出版! | http://blog.csdn.net/sinyu890807/article/details/26365913 | 2014/7/17 9:13 | 1 |
10 | sxhelijian | 635 | 8933 | 寫給菜鳥:發CSDN博文常見問題處理 | http://blog.csdn.net/sxhelijian/article/details/8042507 | 2012/10/6 8:08 | 0 |
* 博文瀏覽量最多前十名
瀏覽數排名 | 博主id | 評論數 | 瀏覽量 | 博文標題 | 博客詳情地址 | 發表日期 | 置頂與否 |
1 | lmj623565791 | 161 | 1528773 | Android Https相關完全解析 當OkHttp遇到Https | http://blog.csdn.net/lmj623565791/article/details/48129405 | 2015/9/12 11:25 | 0 |
2 | tingsking18 | 1 | 1228563 | 簡單即時貼:python輸出A到Z | http://blog.csdn.net/tingsking18/article/details/4330414 | 2009/7/8 10:59 | 0 |
3 | sunboy_2050 | 504 | 831516 | Android APK反編譯詳解(附圖) | http://blog.csdn.net/sunboy_2050/article/details/6727581 | 2011/8/28 22:42 | 0 |
4 | luopingfeng | 1 | 777893 | 《Linux Device Drivers》第十五章 內存映射和DMA——note | http://blog.csdn.net/luopingfeng/article/details/24173985 | 2014/10/9 8:41 | 0 |
5 | luopingfeng | 1 | 777855 | 《Linux Device Drivers》第十六章 塊設備驅動程序——note | http://blog.csdn.net/luopingfeng/article/details/24174045 | 2014/10/11 16:53 | 0 |
6 | luopingfeng | 2 | 777674 | 《Linux Device Drivers》第八章 分配內存——note | http://blog.csdn.net/luopingfeng/article/details/24173595 | 2014/9/28 9:26 | 0 |
7 | luozhuang | 28 | 656975 | RapeLay(電車之狼R)的結局介紹 (隱藏結局攻略) | http://blog.csdn.net/luozhuang/article/details/2595816 | 2008/6/29 14:48 | 0 |
8 | metababy | 0 | 630052 | 時更新 在線觀察紙黃金價格 24小時黃金走勢圖使用現貨買入價格 黃金價格歷史走勢圖 全天顯示黃金,銀,鈀 和 鉑以及原油期貨,美元指數的最新價格 | http://blog.csdn.net/metababy/article/details/1488797 | 2007/1/20 21:34 | 0 |
9 | alex197963 | 38 | 611795 | 歷年奧斯卡獲獎影片(1927—2015) | http://blog.csdn.net/oracle_microsoft/article/details/4436974 | 2009/8/12 9:04 | 1 |
10 | t12x3456 | 67 | 534164 | Android 網絡通信框架Volley簡介(Google IO 2013) | http://blog.csdn.net/t12x3456/article/details/9221611 | 2013/7/2 9:15 | 0 |