當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]大家好,我是大堯。今天我們使用Java語(yǔ)言寫(xiě)一個(gè)爬蟲(chóng),用來(lái)爬取csdn首頁(yè)推薦博客的博主,看看這些博主有多少人在寫(xiě)微信公眾號(hào)。一、爬蟲(chóng)原理爬蟲(chóng)就是去請(qǐng)求某個(gè)url,然后將響應(yīng)的頁(yè)面進(jìn)行解析,將解析到的數(shù)據(jù)保存,同時(shí)解析出當(dāng)前頁(yè)面的url,繼續(xù)進(jìn)行爬取,一直循環(huán)下去,爬取當(dāng)前網(wǎng)站的...

大家好,我是大堯。

今天我們使用Java語(yǔ)言寫(xiě)一個(gè)爬蟲(chóng),用來(lái)爬取csdn首頁(yè)推薦博客的博主,看看這些博主有多少人在寫(xiě)微信公眾號(hào)。

一、爬蟲(chóng)原理

爬蟲(chóng)就是去請(qǐng)求某個(gè)url,然后將響應(yīng)的頁(yè)面進(jìn)行解析,將解析到的數(shù)據(jù)保存,同時(shí)解析出當(dāng)前頁(yè)面的url,繼續(xù)進(jìn)行爬取,一直循環(huán)下去,爬取當(dāng)前網(wǎng)站的內(nèi)容。

我用java爬了一下CSDN,發(fā)現(xiàn)了這些秘密。。。

二、分析CSDN頁(yè)面數(shù)據(jù)

因?yàn)槲覀兊哪繕?biāo)很明確,就是去分析首頁(yè)推薦博客博主寫(xiě)微信公眾號(hào)的比例,因此我們只需要找到我們需要的數(shù)據(jù)進(jìn)行保存即可,不需要爬取網(wǎng)站的全部數(shù)據(jù)。

2.1 找到CSDN首頁(yè)的博客鏈接

  • 在瀏覽器輸入csdn首頁(yè)鏈接https://www.csdn.net/,

  • 找到我們爬取的目標(biāo),如下圖所示

我用java爬了一下CSDN,發(fā)現(xiàn)了這些秘密。。。
  • 使用f12查看目標(biāo)元素
我用java爬了一下CSDN,發(fā)現(xiàn)了這些秘密。。。
根據(jù)目標(biāo)元素,我們可以提取兩個(gè)關(guān)鍵元素,其一是目標(biāo)鏈接在中,其二是博客地址的格式為https://blog.csdn.net/ "用戶名" /article/details/ "文章標(biāo)識(shí)"(記住這個(gè)博客地址,后面有用)。

2.2 提取設(shè)置了公眾號(hào)信息的博主

在文章詳情頁(yè)面有博主相關(guān)的信息,csdn博客左側(cè)有一塊是博主用來(lái)自定義信息的,如下圖:

我用java爬了一下CSDN,發(fā)現(xiàn)了這些秘密。。。

還是一樣,f12來(lái)查看DOM元素,發(fā)這一塊內(nèi)容在id=asideCustom

中。

我用java爬了一下CSDN,發(fā)現(xiàn)了這些秘密。。。

2.3 爬取思路

  1. 通過(guò)爬取首頁(yè),解析出所有a標(biāo)簽

  2. 篩選a標(biāo)簽,根據(jù)博客地址格式,匹配到所有的博客地址

  3. 爬取博客地址,解析id=asideCustom

  4. 如果第3步可以解析出來(lái),則說(shuō)明該博主設(shè)置了自定義信息

三、編寫(xiě)爬蟲(chóng)

根據(jù)上面的分析我們需要兩個(gè)工具包,一個(gè)是httpclient用于網(wǎng)絡(luò)請(qǐng)求,另一個(gè)是用來(lái)解析DOM元素的jsoup。

<dependency>
????<groupId>org.apache.httpcomponentsgroupId>
????<artifactId>httpclientartifactId>
????<version>4.5.10version>
dependency>


<dependency>
????<groupId>org.jsoupgroupId>
????<artifactId>jsoupartifactId>
????<version>1.10.1version>
dependency>
網(wǎng)絡(luò)調(diào)用偽代碼

public?static?ArrayList?HttpUtil(HashSet?urls){
????CloseableHttpClient?httpClient?=?HttpClients.createDefault();
????CloseableHttpResponse?response?=?null;
????ArrayList?list?=?new?ArrayList<>();
????try?{
????????for(String?url?:?urls){
????????????HttpGet?request?=?new?HttpGet(url);
????????????response?=?httpClient.execute(request);

????????????//判斷響應(yīng)狀態(tài)為200,請(qǐng)求成功,進(jìn)行處理
????????????if(response.getStatusLine().getStatusCode()?==?200)?{
????????????????HttpEntity?httpEntity?=?response.getEntity();
????????????????String?html?=?EntityUtils.toString(httpEntity,?"utf-8");
????????????????Document?document?=?Jsoup.parse(html);
????????????????list.add(document);
????????????}?else?{
????????????????System.out.println("返回狀態(tài)不是200");
????????????}
????????}
????}?catch?(ClientProtocolException?e)?{
????????e.printStackTrace();
????}?catch?(IOException?e)?{
????????e.printStackTrace();
????}?finally?{
????????HttpClientUtils.closeQuietly(response);
????????HttpClientUtils.closeQuietly(httpClient);
????}
????return?list;
}
調(diào)用及解析偽代碼

public?static?void?main(String[]?args)?{

????//?標(biāo)記有多少博主設(shè)置了自定義信息
????int?i?=?0;
????//?首頁(yè)url
????HashSet?url?=?new?HashSet<>();
????//?文章urls
????HashSet?articleUrls?=?new?HashSet<>();
????url.add("https://www.csdn.net/");
????//?爬取csdn首頁(yè)
????ArrayList?list?=?HttpUtil(url);
????//?選擇a標(biāo)簽
????for(Document?document?:?list){
????????Elements?a?=?document.select("a");
????????for(Element?element?:?a){
????????????//?獲取a中的url
????????????//??
????????????String?href?=?element.attr("href");
????????????//?篩選博客地址
????????????if(href.contains("article/details")){
????????????????articleUrls.add(href);
????????????}
????????}
????}
????ArrayList?list2?=?HttpUtil(articleUrls);
????for(Document?document?:?list2){
????????Element?asideCustom?=?document.getElementById("asideCustom");
????????if(asideCustom?!=?null){
????????????i ;
????????}
????}
????//?輸出爬取的文章數(shù)量?和?設(shè)置了自定義信息的博主數(shù)量
????System.out.println("爬取的文章數(shù)量=" articleUrls.size() "\n" "寫(xiě)公眾號(hào)的博主數(shù)量=" i);
}
控制臺(tái)輸出信息

爬取的文章數(shù)量=25
寫(xiě)公眾號(hào)的博主數(shù)量=5

四、結(jié)尾

從上面的結(jié)果中可以看出,在25篇博客中,就有五個(gè)博主在寫(xiě)公眾號(hào)。但是,這個(gè)數(shù)據(jù)并不能說(shuō)明csdn的1/5博主就在更新自己的公眾號(hào)。

  1. csdn首頁(yè)推薦數(shù)據(jù)是分頁(yè)拉取的,爬蟲(chóng)只能爬取到第一頁(yè)的數(shù)據(jù),也就是25條
  2. 有些博主雖然設(shè)置了自定義信息,但是并不是公眾號(hào)
  3. 有些博主雖然沒(méi)有設(shè)置自定義信息,但是在簡(jiǎn)介或者其他地方留了公眾號(hào)名稱
不過(guò)這些都沒(méi)關(guān)系,本文的重點(diǎn)是使用java語(yǔ)言寫(xiě)個(gè)爬蟲(chóng)程序,來(lái)爬取目標(biāo)數(shù)據(jù)。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉