WebMagic入門嘗試 ——爬取部落格的標題
阿新 • • 發佈:2020-08-15
通過這兩天的學習,對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(); } }
執行效果:
控制檯:
儲存的檔案: