1. 程式人生 > 實用技巧 >WebMagic入門嘗試 ——爬取部落格的標題

WebMagic入門嘗試 ——爬取部落格的標題

通過這兩天的學習,對WebMagic有了初步的掌握,這裡分享的這個小專案是用於爬取我個人部落格的所有標題,我儘量說的詳細些,希望可以幫到和我一樣的初學者。

思路:

首先確定爬取目標,那就是我的部落格https://www.cnblogs.com/liuleliu/中所有的標題。

通過觀察網頁程式碼可發現,標題存放於class="postTitle2 vertical-middle" 的<a>所包含的<span>中

因此就可以由此得出提取其中標題的語句:

page.getHtml().css("a.postTitle2.vertical-middle span","text").all()

其中page在WebMagic中是我們所爬取到的頁面,.getHtml().css("a.postTitle2.vertical-middle span","text")是利用css選擇器來提取元素 .all是獲取頁面中所有符合要求的元素

其實這就是核心功能了,但實際情況是我的部落格不只一頁,這樣處理只能爬取一頁的資料,因此之後我們要獲得其他的頁面

通過觀察可以看到,每一頁都可以通過‘下一頁’跳轉到下一頁,因此我們每爬取一個頁面的時候,把其中‘下一頁’的連線新增入處理佇列就可以了。

但是又發現第一頁和其他頁面的‘下一頁’不一樣,因此就需要在程式碼裡進行一下判斷,然後再分別處理,,這裡採取的判斷方式就是根據他們的網頁程式碼中‘下一頁’的所在位置所在類的不同進行區分:

  //判斷是否為首頁
      String next= page.getHtml().css("div#nav_next_page a").links().get();
      if(next!=null) page.addTargetRequest(next);//是首頁,將下一頁的url加入處理佇列
      else{
          //不是首頁,判斷是否有下一頁,有的話將下一頁放入處理佇列
            List<Selectable> pages=page.getHtml().css("div.pager a").nodes();
            //獲取跳轉連結的列表最後一位,即‘下一頁’的url
            next=pages.get(pages.size()-1).links().toString();
            if(next!=null) page.addTargetRequest(next);
      }

  當然,如果部落格這裡只有一頁的話便不會把任何url加入佇列,最終爬蟲只會對第一頁的資料進行提取。

下面是完整程式碼:

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.pipeline.FilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.scheduler.FileCacheQueueScheduler;
import us.codecraft.webmagic.selector.Selectable;

import java.util.List;

public class MyProcessor implements PageProcessor {
    //爬蟲初始化時的url
    static String url="https://www.cnblogs.com/liuleliu/default.html";
    //對爬蟲進行配置
    private Site site = Site.me().
            setRetryTimes(3). //設定重試間隔
            setSleepTime(100);//設定重試次數

    public Site getSite() {
        return site;
    }

    public void process(Page page) {

        //判斷是否為首頁
      String next= page.getHtml().css("div#nav_next_page a").links().get();
      if(next!=null) page.addTargetRequest(next);//是首頁,將下一頁的url加入處理佇列
      else{
          //不是首頁,判斷是否有下一頁,有的話將下一頁放入處理佇列
            List<Selectable> pages=page.getHtml().css("div.pager a").nodes();
            //獲取跳轉連結的列表最後一位,即‘下一頁’的url
            next=pages.get(pages.size()-1).links().toString();
            if(next!=null) page.addTargetRequest(next);
      }

        //獲取標題,並放入鍵對中
        page.putField("title",page.getHtml().css("a.postTitle2.vertical-middle span","text").all());

    }

    public static void main(String[] args) {
        Spider.create(new MyProcessor()).addUrl(url)
                //設定爬取結果儲存形式和位置,這裡將結果同時輸出到console頁面
                .addPipeline(new ConsolePipeline()).addPipeline(new FilePipeline("C:\\Users\\20514\\Desktop\\3"))
                //使用檔案儲存抓取的URL,可以在關閉程式並下次啟動時,從之前抓取的URL繼續抓取。需指定路徑,會建立.urls.txt和.cursor.txt兩個檔案。
                .setScheduler(new FileCacheQueueScheduler("C:\\Users\\20514\\Desktop\\3"))
                //啟用五個執行緒執行爬蟲
                .thread(5)
                //執行爬蟲
                .run();
    }



}

執行效果:

控制檯:

儲存的檔案: