最近搞畢業設計,使用到了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,列...