當前位置:編程學習大全網 - 編程語言 - Java多線程爬蟲實現?

Java多線程爬蟲實現?

壹、需求

1.定時抓取固定網站新聞標題、內容、發表時間和來源。

2.程序需要支持分布式、多線程

二、設計

1.網站是固定,但是未來也可能添加新的網站去抓取,每個網站內容節點設計都不壹樣,這樣就需要支持動態可配置來新增網站以方便未來的擴展,這樣就需要每次都需要開發介入。

2.網站html節點的結構可能發生變化,所以也要支持提取節點可配置。

3.怎樣支持分布式?暫時最簡單的想法就是:多機器部署程序,還有新搞壹臺或者部署程序其中壹臺制作壹個定時任務,定時開啟每臺機器應該抓取哪個網站,暫時不能支持同壹個網站同時可以支持被多臺機器同時抓取,這樣會比較麻煩,要用到分布式隊列。所以暫時壹個網站同時只會被單臺機器抓取。

4.多線程,怎樣多線程?多線程抓取我這邊有兩個實現:

(1)壹個線程抓取壹個網站,維護壹個自己的url隊列做廣度抓取,同時抓取多個網站。如圖:

(2)多個線程同時抓取不同的網站。如圖:

以上兩張辦法其實各有優點,也給有缺點,看我們怎麽取舍了。

方法1:每個線程創建壹個自己的隊列,圖中的queue可以不用concurrentQueue,優點:不涉及到控制並發,每個網站壹個線程抓取壹個網站,抓取完畢即自動回收銷毀線程。控制方便。缺點:線程數不可以擴展,例如當只有3個網站,妳最多只能開3個線程來抓取,不能開更多,有壹定的局限性。

方法2:N個線程同時抓取N個網站,線程數和網站數目不掛鉤,優點:線程數可以調整並且和和抓取網站數量無關。3個網站我們可以開4個5個或者10個這個可以根據您的硬件資源進行調整。缺點:需要控制並發,並且要控制什麽時候銷毀線程(thread1空閑,並且queue為空不代表任務可以結束,可能thread2結果還沒返回),當被抓取的網站響應較慢時,會拖慢整個爬蟲進度。

三、實現

抓取方式最終還是選擇了方法二,因為線程數可配置!

使用技術:

jfinal用了之後才發現這東西不適合,但是由於項目進度問題,還是使用了。

maven項目管理

jettyserver

mysql

eclipse開發

項目需要重點攻破的難點:

(1)合理的控制N個線程正常的抓取網站,並且當所有線程工作都完成了並且需要抓取的隊列為空時,N個線程同時退出銷毀。

(2)不同網站設計節點不壹樣,需要通過配置解決各個網站需要抓取的URL和抓取節點內容在html節點的位置。

(3)個性化內容處理,由於html結構設計問題,北大青鳥認為抓取的內容可能有些多余的html標簽,或者多余的內容該怎麽處理。

  • 上一篇:通信工程專業能力?
  • 下一篇:地底下真的有人類?斯諾登爆出的地下世界,真的存在嗎?
  • copyright 2024編程學習大全網