<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 3230字,需瀏覽 7分鐘

           ·

          2021-11-04 19:13

          大家好,我是大堯。

          今天我們使用Java語言寫一個爬蟲,用來爬取csdn首頁推薦博客的博主,看看這些博主有多少人在寫微信公眾號。

          一、爬蟲原理

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

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

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

          2.1 找到CSDN首頁的博客鏈接

          • 在瀏覽器輸入csdn首頁鏈接https://www.csdn.net/

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

          • 使用f12查看目標(biāo)元素

          根據(jù)目標(biāo)元素,我們可以提取兩個關(guān)鍵元素,其一是目標(biāo)鏈接在中,其二是博客地址的格式為https://blog.csdn.net/+"用戶名"+/article/details/+"文章標(biāo)識"(記住這個博客地址,后面有用)。

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

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


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

          中。

          2.3 爬取思路

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

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

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

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

          三、編寫爬蟲

          根據(jù)上面的分析我們需要兩個工具包,一個是httpclient用于網(wǎng)絡(luò)請求,另一個是用來解析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,請求成功,進(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;
          ????//?首頁url
          ????HashSet?url?=?new?HashSet<>();
          ????//?文章urls
          ????HashSet?articleUrls?=?new?HashSet<>();
          ????url.add("https://www.csdn.net/");
          ????//?爬取csdn首頁
          ????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"+"寫公眾號的博主數(shù)量="+i);
          }

          控制臺輸出信息

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

          四、結(jié)尾

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

          1. csdn首頁推薦數(shù)據(jù)是分頁拉取的,爬蟲只能爬取到第一頁的數(shù)據(jù),也就是25條
          2. 有些博主雖然設(shè)置了自定義信息,但是并不是公眾號
          3. 有些博主雖然沒有設(shè)置自定義信息,但是在簡介或者其他地方留了公眾號名稱

          不過這些都沒關(guān)系,本文的重點(diǎn)是使用java語言寫個爬蟲程序,來爬取目標(biāo)數(shù)據(jù)

          —?【 THE END 】—
          本公眾號全部博文已整理成一個目錄,請在公眾號里回復(fù)「m」獲取!

          最近面試BAT,整理一份面試資料Java面試BATJ通關(guān)手冊,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。

          獲取方式:點(diǎn)“在看”,關(guān)注公眾號并回復(fù) PDF?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

          文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。謝謝支持喲 (*^__^*)

          瀏覽 89
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色五月在线视频 | 日韩人妻无码精品免费shipin | 日韩中文字幕免费在线观看 | 琪琪色影音 | 久久五月天天 |