標籤:
1、1個主線程+1個列表線程+N個明細線程
對要爬取的網站資料,基本是採用分頁的形式展現,通過遍曆列表解析明細URL,進而爬取明細頁面內容;
每個網站一個處理線程,爬取列表和爬取明細採用單獨的子線程,列表爬取線程相當於產生者,分頁一般在幾十條,有些網站可在請求中指定分頁大小參數可達百條一頁,生產速度足夠消費,單線程爬取解析列表,往無界阻塞隊列存待爬的明細url,根據頻寬(避免IO逾時)和伺服器效能(500響應碼)配置N個明細爬取線程作為消費者,對爬取內容進行解析,緩衝解析後實體物件,達到一定量時批量持久化。列表單線程生產速度可控,看過幾個開源架構列表和明細的url是在同一個隊列,那就會有優先順序問題,隊列中同時有列表和明細時需要明細先爬,未區分列表和明細,每個線程既處理列表又處理明細,何時停止爬取是個麻煩問題,隊列中沒有可用url並不代表爬完,可能有某個線程還在爬一個列表呢。
2、爬完一個網站需要記錄爬取情況日誌資訊,比如新增記錄數、修改記錄數、服務端異常次數(異常太多可減少明細線程數)、IO異常次數(異常太多可減少明細線程數)、開始時間、結束時間、異常資訊等;
3、多個網站同時爬取時在外面套一層,3層線程結構,第一層裡啟動各源線程,第二層裡啟動列表和明細;
run(){ for(int i=0;i<x;i++)new Thread(new PullXXX()).start();}AbstractPull implements Runnable{ PullList implements Runnable{}; PullDetail implements Runnable{}; run() { new Thread(new PullList()).start(); for(int i=0;i<N;i++) { new Thread(new PullDetail()).start(); } CountDownLatch.await(); log(); }}
分頁爬蟲執行緒模式