Webmagic控制爬取深度

2021-10-03 03:08:01 字數 1778 閱讀 2670

最近搞畢業設計,使用到了webmagic,但是才開始學習,對各個元件都還不是很熟悉。相信初學者都會遇到乙個問題,那就是:必須要讓所有url都處理完,才能結束整個爬蟲過程嗎?

一開始,我用的是非常簡單的方法,如下:

int pagecnt = 0;

public static int limit = 10000; //最多爬取1e4個介面,雖然pagecnt不準確

@override

public void process(page page)

pagecnt++;

}

這樣看似可以,但是實際上有缺陷,就是pagecnt約束性不強,可能是多執行緒的原因,即使pagecnt大於limit了,還是會執行,我也不知道為啥,但是, 一般最終處理的頁面數是limit的10倍,所以,這個limit還是能限制爬蟲提前結束的,就是粗糙了一點,不到萬不得已,還是別用這個方法。

(後來看到了可以使用atomicinteger解決多執行緒下i++問題,但是我試了一下,還是不行,另外這個pagecnt每次訪問乙個網頁會+10,挺有規律的)

下面是換一種思路的解決方法:

這兩篇文章算是非常有啟發的

addtargetrequest是將乙個request加入了佇列裡面,這樣下次就能取到這個request,那麼我們只需要對request進行判斷,只有在一定條件才能push進去就行了,request物件是有乙個extra的,它可以設定資料,然後還可以取出來。

這裡我們找到原始碼中的最關鍵函式,它是將request加入佇列的地方(在queuescheduler.class  filecachequeuescheduler.class 這樣的類裡面):

protected void pushwhennoduplicate(request request, task task) 

this.queue.add(request);

this.fileurlwriter.println(request.geturl());

}

最後貼上我修改的**

int startdepth = 1; //這是自己新增的變數,表示層數

int levellimit = 4; //從最開始的網頁最大的深度

protected void pushwhennoduplicate(request request, task task)

else

int currentdepth = (int) request.getextra("depth"); //獲取當前的深度

if ( currentdepth > this.levellimit )

}this.queue.add(request);

this.fileurlwriter.println(request.geturl());

}

當然,在process方法裡面也要有修改,就是一開始獲取request的深度,加1就是子節點的深度

int newdepth = (int)page.getrequest().getextra("depth")+1;  //通過該介面的深度,推算出子介面的深度

mapnewmap = new hashmap();

newmap.put("depth",newdepth);

for ( selectable selectable:alist )

}

以上就是控制深度的方法,寫的很簡略。

使用webmagic爬取csdn使用者個性簽名

思路 首先爬取乙個使用者的個人資訊,然後根據該使用者的好友關係去爬取好友資訊,依次類推,爬取所有使用者。根據獲取的使用者id,訪問blog主頁獲取個簽名。package com.cuihs.myspider import org.jsoup.select.elements import us.cod...

CrawlSpider深度爬取

crawlspider 一種基於scrapy進行全站資料爬取的一種新的技術手段。crawlspider就是spider的乙個子類 連線提取器 linkextractor 規則解析器 rule 使用流程 新建乙個工程 cd 工程中 新建乙個爬蟲檔案 scrapy genspider t crawl s...

控制流程,爬取豆瓣電影資訊

if 條件判斷 if 條件成立,執行 1,條件不成立,執行 2 1else 2age 19 if age 18 print 你已經成年了!雙分支結構 age 19 if age 18 print 成年 else print 未成年 如果 成績 90,列印 優秀 如果 成績 80 並且 成績 90,列...