WebMagic之爬虫监控
訪問我的博客
前言
年前閑著無聊,研究了一陣子爬蟲技術(shù),接觸到爬蟲框架 WebMagic,感覺很好用。
在之后的工作中,接手了新站與第三方接口對(duì)接的工作,主要的工作是去抓取對(duì)方接口的內(nèi)容;初始的時(shí)候,之前負(fù)責(zé)該工作的同事,是手動(dòng)使用多線程去抓取,在應(yīng)用的過程當(dāng)中暴露了不少問題。比如對(duì)于接口內(nèi)容超級(jí)多的時(shí)候,雖然使用了多線程,但是抓取的效率很低,而且也沒有實(shí)現(xiàn)增量抓取,每次都需要去全量抓取,跑一次基本需要好幾天-.-;小說是連載的情況下,這種問題是亟需解決的。
趁著熟悉了新兵器 WebMagic, 果斷在項(xiàng)目中進(jìn)行引入,解決以上問題。功能上線后,替換了原有的多線程抓取,目前已經(jīng)十分穩(wěn)定, 基本上配置好任務(wù)之后,就無需再人工干預(yù)了。
以下,正文是基于我學(xué)習(xí) WebMagic 時(shí)練手項(xiàng)目,功能和在公司開發(fā)的差不多,只不過我本地開發(fā)的是去抓取盜版網(wǎng)站的內(nèi)容。
項(xiàng)目預(yù)覽
爬蟲任務(wù)管理
實(shí)現(xiàn)了爬蟲的狀態(tài)監(jiān)控,以及可視化啟停
初入手兵器-基本使用
爬蟲套路分析
先看官方文檔的總體架構(gòu)圖
大部分模塊WebMagic已經(jīng)提供了默認(rèn)實(shí)現(xiàn)。
一般來說,對(duì)于編寫一個(gè)爬蟲,PageProcessor是需要編寫的部分,而Spider則是創(chuàng)建和控制爬蟲的入口。
得益于 WebMagic 框架的良好封裝,對(duì)于框架的使用者來說,所需要編寫的代碼幾乎只有爬蟲的邏輯代碼,而對(duì)于怎么爬,維護(hù)任務(wù)隊(duì)列的事情,WebMagic 都可以替我們做好。開始我們的爬蟲之旅吧!
引入依賴
本文中所使用到的項(xiàng)目是基于 Maven 的 SSM 項(xiàng)目,在 pom.xml 中引入 WebMagic 的依賴。
xml <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>0.7.3</version> </dependency> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-extension</artifactId> <version>0.7.3</version> </dependency>
基本類圖
先將對(duì)應(yīng)的處理類進(jìn)行抽象出來,方便統(tǒng)一處理。
每個(gè)爬蟲都有其對(duì)應(yīng)的配置信息
Site 是 抓取網(wǎng)站的相關(guān)配置,包括編碼、抓取間隔、重試次數(shù)
對(duì)應(yīng)的實(shí)現(xiàn)類重寫 process 方法,在方法中實(shí)現(xiàn)對(duì)應(yīng)的爬蟲邏輯處理
爬蟲的使用就簡單帶過,具體可以將本文與官方文檔結(jié)合使用,官方文檔的示例只是基于 main 方法。
爬蟲監(jiān)控
擴(kuò)展源碼
為了實(shí)現(xiàn)項(xiàng)目預(yù)覽的效果,實(shí)現(xiàn)爬蟲的狀態(tài)監(jiān)控,需要對(duì)爬蟲進(jìn)行擴(kuò)展。因?yàn)楣倬W(wǎng)提供的方式功能不足以達(dá)到在頁面展示的效果。
添加監(jiān)控非常簡單,獲取一個(gè) SpiderMonitor 的單例 SpiderMonitor.instance(),并將你想要監(jiān)控的 Spider 注冊(cè)進(jìn)去即可。你可以注冊(cè)多個(gè) Spider 到 SpiderMonitor 中。
查看 SpiderMonitor 源代碼后,如果調(diào)用的是 獲取一個(gè) SpiderMonitor 的單例 SpiderMonitor 的 注冊(cè)方法,發(fā)現(xiàn) WebMagic 將每只爬蟲的狀態(tài)對(duì)象 SpiderStatusMXBean 全部添加到一個(gè) List 集合當(dāng)中去,這樣就難以區(qū)分具體是哪一只爬蟲的狀態(tài),所以我們需要對(duì) SpiderMonitor 進(jìn)行擴(kuò)展。
將 SpiderMonitor 中的
private List<SpiderStatusMXBean> spiderStatuses = new ArrayList<SpiderStatusMXBean>();
修改為 Map 集合,key 選擇 Spider 的 UUID 作為唯一區(qū)分爬蟲的標(biāo)記。
需要注意的是,SpiderMonitor 中使用的 SpiderStatus 也需要進(jìn)行一同擴(kuò)展。
public class MySpiderStatus implements SpiderStatusMXBean {protected final Spider spider;protected Logger logger = LoggerFactory.getLogger(getClass());protected final MySpiderMonitor.MyMonitorSpiderListener monitorSpiderListener;public MySpiderStatus(Spider spider, MySpiderMonitor.MyMonitorSpiderListener monitorSpiderListener) {this.spider = spider;this.monitorSpiderListener = monitorSpiderListener;}public Spider getSpider(){return this.spider;}public String getName() {return spider.getUUID();}public int getLeftPageCount() {if (spider.getScheduler() instanceof MonitorableScheduler) {return ((MonitorableScheduler) spider.getScheduler()).getLeftRequestsCount(spider);}logger.warn("Get leftPageCount fail, try to use a Scheduler implement MonitorableScheduler for monitor count!");return -1;}public int getTotalPageCount() {if (spider.getScheduler() instanceof MonitorableScheduler) {return ((MonitorableScheduler) spider.getScheduler()).getTotalRequestsCount(spider);}logger.warn("Get totalPageCount fail, try to use a Scheduler implement MonitorableScheduler for monitor count!");return -1;}@Overridepublic int getSuccessPageCount() {return monitorSpiderListener.getSuccessCount().get();}@Overridepublic int getErrorPageCount() {return monitorSpiderListener.getErrorCount().get();}public List<String> getErrorPages() {return monitorSpiderListener.getErrorUrls();}@Overridepublic String getStatus() {return spider.getStatus().name();}@Overridepublic int getThread() {return spider.getThreadAlive();}public void start() {spider.start();}public void stop() {spider.stop();}@Overridepublic Date getStartTime() {return spider.getStartTime();}@Overridepublic int getPagePerSecond() {int runSeconds = (int) (System.currentTimeMillis() - getStartTime().getTime()) / 1000;return getSuccessPageCount() / runSeconds;}}重寫爬蟲啟動(dòng)處代碼
```java
@Service
public class WebMagicService {
}
```
創(chuàng)建爬蟲時(shí),將爬蟲注冊(cè)到 MySpiderMonitor 中,之后通過 getSpiderStatuses 方法即可獲取所有爬蟲的狀態(tài)了。
資源下載
- 點(diǎn)我下載源碼
轉(zhuǎn)載于:https://www.cnblogs.com/vcmq/p/9484404.html
總結(jié)
以上是生活随笔為你收集整理的WebMagic之爬虫监控的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mingw编译ffmpeg 错误:Unk
- 下一篇: 探索 YOLO v3 实现细节 - 第6