分享文章:呆錯文章管理系統一鍵API采集與綁定分類(lèi)的圖文教程-呆錯后臺管理框架
優(yōu)采云 發(fā)布時(shí)間: 2022-12-08 04:52分享文章:呆錯文章管理系統一鍵API采集與綁定分類(lèi)的圖文教程-呆錯后臺管理框架
采集功能介紹(文章管理系統的核心采集功能包括以下三個(gè)模塊)
API采集設置
了解文章管理系統的采集功能后,我們使用API??客戶(hù)端連接采集API服務(wù)器。我們只需要在后臺填寫(xiě)網(wǎng)址和密碼即可。點(diǎn)擊它(背景 > 文章 > 采集 管理)添加 采集。
API采集轉換分類(lèi)
當資源站的分類(lèi)不是我們想要的分類(lèi)名稱(chēng)或者分類(lèi)已經(jīng)在我們自己的文章系統中構建時(shí),這時(shí)候就需要使用“綁定分類(lèi)”的功能,設置會(huì )彈出點(diǎn)擊按鈕框后up,只需要將需要轉換或重命名的列類(lèi)別一一重命名即可,如下圖。
免費云采集 教程:步驟3:修改Xpath
前幾天寫(xiě)的關(guān)于“大數據”的文章得到了很多朋友的認可?!八鼜哪睦飦?lái)的?
我們可以簡(jiǎn)單列舉:
1、企業(yè)產(chǎn)生的用戶(hù)數據
比如BAT這樣的公司,擁有龐大的用戶(hù)群,用戶(hù)的任何行為都會(huì )成為他們數據源的一部分
2、數據平臺購買(mǎi)數據
比如從全國數據中心數據市場(chǎng)購買(mǎi)等。
3. 政府機構公開(kāi)數據
比如統計局和銀行的公開(kāi)數據。
4.數據管理公司
比如艾瑞咨詢(xún)等。
5.爬蟲(chóng)獲取網(wǎng)絡(luò )數據
利用網(wǎng)絡(luò )爬蟲(chóng)技術(shù)爬取網(wǎng)絡(luò )數據以供使用。
所以其實(shí)對于中小企業(yè)或者個(gè)人來(lái)說(shuō),想要獲取“大數據或者海量數據”,最劃算的方法就是利用“網(wǎng)絡(luò )爬蟲(chóng)技術(shù)”來(lái)獲取有效數據,所以“網(wǎng)絡(luò )爬蟲(chóng)技術(shù)”這幾年也很流行!
今天我就來(lái)給大家講解一下“網(wǎng)絡(luò )爬蟲(chóng)技術(shù)的原理與實(shí)現”!
1、什么是網(wǎng)絡(luò )爬蟲(chóng)?
網(wǎng)絡(luò )爬蟲(chóng)(也稱(chēng)為網(wǎng)絡(luò )蜘蛛、網(wǎng)絡(luò )機器人,在 FOAF 社區中更常被稱(chēng)為網(wǎng)絡(luò )追趕者)是一種按照一定規則自動(dòng)抓取萬(wàn)維網(wǎng)上信息的程序或腳本。簡(jiǎn)單地說(shuō),它是一個(gè)請求網(wǎng)站并提取數據的自動(dòng)化程序。
最著(zhù)名的網(wǎng)絡(luò )爬蟲(chóng)應用程序是谷歌和百度的應用程序。
這兩大搜索引擎每天都會(huì )從互聯(lián)網(wǎng)上抓取大量的數據,然后對數據進(jìn)行分析處理,最后通過(guò)搜索展現給我們??梢哉f(shuō)網(wǎng)絡(luò )爬蟲(chóng)是搜索引擎的基礎!
2. 網(wǎng)絡(luò )爬蟲(chóng)的工作流程和原理
網(wǎng)絡(luò )爬蟲(chóng)是搜索引擎爬蟲(chóng)系統的重要組成部分。爬蟲(chóng)的主要目的是將互聯(lián)網(wǎng)上的網(wǎng)頁(yè)下載到本地,形成鏡像備份或網(wǎng)絡(luò )內容。
(1) 網(wǎng)絡(luò )爬蟲(chóng)的基本結構和工作流程
一般網(wǎng)絡(luò )爬蟲(chóng)的框架如圖所示:
網(wǎng)絡(luò )爬蟲(chóng)的基本工作流程如下:
1.首先選擇一部分精挑細選的*敏*感*詞*網(wǎng)址;
2、將這些網(wǎng)址放入待抓取的網(wǎng)址隊列中;
3、從待抓網(wǎng)址隊列中取出待抓網(wǎng)址,解析DNS,獲取主機ip,下載該網(wǎng)址對應的網(wǎng)頁(yè),存入下載的網(wǎng)頁(yè)庫中。另外,將這些網(wǎng)址放入已抓取的網(wǎng)址隊列中。
4、分析已經(jīng)抓取的URL隊列中的URL,分析其中的其他URL,將URL放入待抓取的URL隊列中,進(jìn)入下一個(gè)循環(huán)。
(2) 從爬蟲(chóng)的角度劃分互聯(lián)網(wǎng)
相應地,互聯(lián)網(wǎng)上的所有頁(yè)面都可以分為五個(gè)部分:
1.下載過(guò)期的網(wǎng)頁(yè)
2、下載過(guò)期的網(wǎng)頁(yè):抓取的網(wǎng)頁(yè)實(shí)際上是互聯(lián)網(wǎng)內容的鏡像和備份?;ヂ?lián)網(wǎng)是動(dòng)態(tài)變化的,互聯(lián)網(wǎng)上的部分內容發(fā)生了變化。這時(shí),這部分抓取的網(wǎng)頁(yè)已經(jīng)過(guò)期了。
3.待下載網(wǎng)頁(yè):待抓取的URL隊列中的那些頁(yè)面
4、可知網(wǎng)頁(yè):尚未被抓取的URL,不在待抓取的URL隊列中,但可以通過(guò)分析已抓取的頁(yè)面或待抓取的URL對應的頁(yè)面得到,是被認為是已知網(wǎng)頁(yè)。
5、還有一些網(wǎng)頁(yè)是爬蟲(chóng)無(wú)法直接爬取下載的。稱(chēng)為不可知頁(yè)面。
(3) 爬取策略
在爬蟲(chóng)系統中,待爬取的URL隊列是一個(gè)非常重要的部分。URL隊列中待抓取的URL的排列順序也是一個(gè)很重要的問(wèn)題,因為這涉及到先抓取哪個(gè)頁(yè)面,后抓取哪個(gè)頁(yè)面。確定這些 URL 順序的方法稱(chēng)為抓取策略。下面重點(diǎn)介紹幾種常見(jiàn)的爬取策略:
1.深度優(yōu)先遍歷策略
深度優(yōu)先遍歷策略意味著(zhù)網(wǎng)絡(luò )爬蟲(chóng)將從起始頁(yè)開(kāi)始,逐個(gè)鏈接。處理完這一行后,它將轉到下一個(gè)起始頁(yè)并繼續跟蹤鏈接。我們以下圖為例:
遍歷路徑:AFG EHI BCD
2.廣度優(yōu)先遍歷策略
廣度優(yōu)先遍歷策略的基本思想是將新下載的網(wǎng)頁(yè)中找到的鏈接直接插入待抓取的URL隊列的尾部。也就是說(shuō),網(wǎng)絡(luò )爬蟲(chóng)會(huì )先爬取初始網(wǎng)頁(yè)中鏈接的所有網(wǎng)頁(yè),然后選擇其中一個(gè)鏈接的網(wǎng)頁(yè),繼續爬取該網(wǎng)頁(yè)中鏈接的所有網(wǎng)頁(yè)。還是以上圖為例:
遍歷路徑:ABCDEF GHI
3.反向鏈接計數策略
反向鏈接的數量是指一個(gè)網(wǎng)頁(yè)被其他網(wǎng)頁(yè)的鏈接指向的次數。反向鏈接數表示網(wǎng)頁(yè)內容被其他人推薦的程度。因此,在很多情況下,搜索引擎的抓取系統會(huì )使用這個(gè)指標來(lái)評估網(wǎng)頁(yè)的重要性,從而決定抓取不同網(wǎng)頁(yè)的順序。
在真實(shí)的網(wǎng)絡(luò )環(huán)境中,由于廣告鏈接和作弊鏈接的存在,反向鏈接的數量不可能完全等于其他鏈接的重要性。因此,搜索引擎傾向于考慮一些可靠數量的反向鏈接。
4.部分PageRank策略
Partial PageRank算法借鑒了PageRank算法的思想:對于下載的網(wǎng)頁(yè),連同要抓取的URL隊列中的URL,組成一個(gè)網(wǎng)頁(yè)集合,計算每個(gè)頁(yè)面的PageRank值。計算完成后,將要抓取的URL隊列中的URL進(jìn)行計算,URL按照PageRank值的高低排序,依次抓取頁(yè)面。
如果每次抓取一個(gè)頁(yè)面都重新計算PageRank值,折衷的做法是:每抓取K頁(yè)后,重新計算PageRank值。但是這種情況還有一個(gè)問(wèn)題:對于下載頁(yè)面中分析出來(lái)的鏈接,也就是我們前面提到的那部分未知網(wǎng)頁(yè),暫時(shí)沒(méi)有PageRank值。為了解決這個(gè)問(wèn)題,會(huì )給這些頁(yè)面一個(gè)臨時(shí)的PageRank值:從這個(gè)網(wǎng)頁(yè)的所有傳入鏈接傳入的PageRank值會(huì )被聚合,從而形成未知頁(yè)面的PageRank值,從而參與排行。以下示例說(shuō)明:
5. OPIC戰略策略
該算法實(shí)際上是頁(yè)面的重要性分數。在算法開(kāi)始之前,給所有頁(yè)面相同的初始*敏*感*詞*(cash)。某個(gè)頁(yè)面P被下載后,將P的*敏*感*詞*分配給從P分析出來(lái)的所有鏈接,P的*敏*感*詞*清空。待抓取的 URL 隊列中的所有頁(yè)面都按照*敏*感*詞*數量排序。
6、大站點(diǎn)優(yōu)先策略
對于所有待抓取的URL隊列中的網(wǎng)頁(yè),根據它們的網(wǎng)站進(jìn)行分類(lèi)。對于網(wǎng)站有大量需要下載的頁(yè)面,會(huì )優(yōu)先下載。因此該策略也稱(chēng)為大站優(yōu)先策略。
(4)更新策略
互聯(lián)網(wǎng)是實(shí)時(shí)變化的,而且是高度動(dòng)態(tài)的。網(wǎng)頁(yè)更新策略主要是決定什么時(shí)候更新之前下載過(guò)的頁(yè)面。常見(jiàn)的更新策略有以下三種:
1.歷史參考策略
顧名思義,就是根據過(guò)去頁(yè)面的歷史更新數據,預測未來(lái)頁(yè)面什么時(shí)候會(huì )發(fā)生變化。通常,預測是通過(guò)對泊松過(guò)程建模來(lái)進(jìn)行的。
2. 用戶(hù)體驗策略 雖然搜索引擎可以針對某個(gè)查詢(xún)條件返回數量龐大的結果,但用戶(hù)往往只關(guān)注結果的前幾頁(yè)。因此,爬蟲(chóng)系統可以?xún)?yōu)先更新那些出現在查詢(xún)結果前幾頁(yè)的頁(yè)面,然后再更新后面的那些頁(yè)面。此更新策略還需要使用歷史信息。用戶(hù)體驗策略保留了網(wǎng)頁(yè)的多個(gè)歷史版本,根據過(guò)去每次內容變化對搜索質(zhì)量的影響,得到一個(gè)平均值,以此值作為決定何時(shí)重新抓取的依據。3.整群抽樣策略
上述兩種更新策略都有一個(gè)前提:都需要網(wǎng)頁(yè)的歷史信息。這種方式存在兩個(gè)問(wèn)題:第一,如果系統為每個(gè)系統保存多個(gè)版本的歷史信息,無(wú)疑會(huì )增加很多系統負擔;第二,如果新網(wǎng)頁(yè)根本沒(méi)有歷史信息,則無(wú)法確定更新策略。
該策略認為網(wǎng)頁(yè)有很多屬性,具有相似屬性的網(wǎng)頁(yè)可以認為具有相似的更新頻率。計算某類(lèi)網(wǎng)頁(yè)的更新頻率,只需要對該類(lèi)網(wǎng)頁(yè)進(jìn)行采樣,將其更新周期作為整個(gè)類(lèi)的更新周期即可?;舅悸啡缦拢?/p>
(5) 分布式爬蟲(chóng)系統結構 一般來(lái)說(shuō),爬蟲(chóng)系統需要面對整個(gè)互聯(lián)網(wǎng)上億級的網(wǎng)頁(yè)。單個(gè)爬蟲(chóng)無(wú)法完成這樣的任務(wù)。通常需要多個(gè)抓取器一起處理。一般來(lái)說(shuō),爬蟲(chóng)系統往往是分布式的三層結構。如圖所示:
底層是分布在不同地理位置的數據中心。每個(gè)數據中心都有若干個(gè)爬蟲(chóng)服務(wù)器,每個(gè)爬蟲(chóng)服務(wù)器上可能會(huì )部署幾套爬蟲(chóng)程序。這樣就構成了一個(gè)基本的分布式爬蟲(chóng)系統。
對于一個(gè)數據中心的不同服務(wù)器,有幾種協(xié)同工作的方式:
1.主從
主從基本結構如圖所示:
對于主從模式,有一個(gè)專(zhuān)門(mén)的Master服務(wù)器來(lái)維護要抓取的URL隊列,負責將每次抓取的URL分發(fā)給不同的Slave服務(wù)器,Slave服務(wù)器負責實(shí)際的網(wǎng)頁(yè)下載工作. Master服務(wù)器除了維護要抓取的URL隊列和分發(fā)URL外,還負責調解各個(gè)Slave服務(wù)器的負載。為了防止一些Slave服務(wù)器太閑或者太累。
在這種模式下,Master容易成為系統的瓶頸。
2.點(diǎn)對點(diǎn)
點(diǎn)對點(diǎn)方程的基本結構如圖所示:
在這種模式下,所有的爬蟲(chóng)服務(wù)器都沒(méi)有分工差異。每個(gè)爬取服務(wù)器可以從需要爬取的URL隊列中獲取URL,然后計算該URL主域名的哈希值H,然后計算H mod m(其中m為服務(wù)器數量,上圖為例如,m 為 3),計算出的數量就是處理該 URL 的主機的數量。
示例:假設對于URL,計算器哈希值H=8,m=3,則H mod m=2,所以編號為2的服務(wù)器爬取該鏈接。假設此時(shí)server 0拿到了url,就會(huì )把url傳給server 2,由server 2抓取。
這種模型的一個(gè)問(wèn)題是,當一臺服務(wù)器掛掉或添加一臺新服務(wù)器時(shí),所有 URL 的哈希余數的結果都會(huì )發(fā)生變化。也就是說(shuō),這種方法的可擴展性不好。針對這種情況,提出了另一種改進(jìn)方案。這種改進(jìn)方案是通過(guò)一致性哈希來(lái)確定服務(wù)器分工。
其基本結構如圖所示:
Consistent Hashing對URL的主域名進(jìn)行哈希運算,映射為0-232之間的數字。這個(gè)范圍平均分配給m臺服務(wù)器,根據url主域名哈希運算的取值范圍來(lái)判斷爬取哪個(gè)服務(wù)器。
如果某臺服務(wù)器出現問(wèn)題,本該由該服務(wù)器負責的網(wǎng)頁(yè)就會(huì )被順時(shí)針順時(shí)針抓取到下一臺服務(wù)器。這樣即使某臺服務(wù)器出現問(wèn)題,也不會(huì )影響其他工作。
3. 常見(jiàn)網(wǎng)絡(luò )爬蟲(chóng)的種類(lèi)
1. 通用網(wǎng)絡(luò )爬蟲(chóng)
爬取目標資源 在整個(gè)互聯(lián)網(wǎng)中,爬取的目標數據是巨大的。爬取性能要求非常高。應用于大型搜索引擎,具有很高的應用價(jià)值。
一般網(wǎng)絡(luò )爬蟲(chóng)的基本組成:初始URL采集、URL隊列、頁(yè)面爬取模塊、頁(yè)面分析模塊、頁(yè)面數據庫、鏈接過(guò)濾模塊等。
一般網(wǎng)絡(luò )爬蟲(chóng)的爬取策略:主要有深度優(yōu)先爬取策略和廣度優(yōu)先爬取策略。
2. 專(zhuān)注爬蟲(chóng)
在與主題相關(guān)的頁(yè)面中定位抓取目標
主要用于特定信息的爬取,主要為特定人群提供服務(wù)
重點(diǎn)介紹網(wǎng)絡(luò )爬蟲(chóng)的基本組成:初始URL、URL隊列、頁(yè)面爬取模塊、頁(yè)面分析模塊、頁(yè)面數據庫、連接過(guò)濾模塊、內容評估模塊、鏈接評估模塊等。
專(zhuān)注于網(wǎng)絡(luò )爬蟲(chóng)的爬取策略:
1)基于內容評價(jià)的爬蟲(chóng)策略
2)基于鏈接評價(jià)的爬蟲(chóng)策略
3)基于強化學(xué)習的爬蟲(chóng)策略
4)基于上下文圖的爬蟲(chóng)策略
3.增量網(wǎng)絡(luò )爬蟲(chóng)
增量更新是指更新時(shí)只更新變化的部分,不更新未變化的部分。只抓取內容發(fā)生變化的網(wǎng)頁(yè)或新生成的網(wǎng)頁(yè),可以在一定程度上保證抓取到的網(wǎng)頁(yè)。, 如果可能的話(huà),一個(gè)新的頁(yè)面
4.深網(wǎng)爬蟲(chóng)
Surface網(wǎng)頁(yè):無(wú)需提交表單,使用靜態(tài)鏈接即可到達的靜態(tài)網(wǎng)頁(yè)
Deep Web:隱藏在表單后面,無(wú)法通過(guò)靜態(tài)鏈接直接獲取。是提交某個(gè)關(guān)鍵詞后才能獲得的網(wǎng)頁(yè)。
深網(wǎng)爬蟲(chóng)最重要的部分是填表部分
深網(wǎng)爬蟲(chóng)的基本組成:URL列表、LVS列表(LVS是指標簽/值集合,即填寫(xiě)表單的數據源)爬取控制器、解析器、LVS控制器、表單分析器、表單處理器、響應分析裝置等
深網(wǎng)爬蟲(chóng)填表分為兩種:
基于領(lǐng)域知識的表單填寫(xiě)(構建一個(gè)關(guān)鍵詞庫來(lái)填寫(xiě)表單,需要的時(shí)候根據語(yǔ)義分析選擇對應的關(guān)鍵詞進(jìn)行填寫(xiě))
基于網(wǎng)頁(yè)結構分析的表單填寫(xiě)(一般在字段有限的情況下使用,該方法會(huì )根據網(wǎng)頁(yè)結構進(jìn)行分析,自動(dòng)填寫(xiě)表單)
四、教你實(shí)現一個(gè)簡(jiǎn)單的網(wǎng)絡(luò )爬蟲(chóng)
(1)、爬蟲(chóng)流程
在構建程序之前,我們首先需要了解一下爬蟲(chóng)的具體過(guò)程。
一個(gè)簡(jiǎn)單的爬蟲(chóng)程序有以下過(guò)程:
用文字表達,就是:
1、從任務(wù)庫(可以是MySQL等關(guān)系型數據庫)中選擇*敏*感*詞*URL;
2.在程序中初始化一個(gè)URL隊列,將*敏*感*詞*URL加入到隊列中;
3、如果URL隊列不為空,則將隊列頭部的URL出隊;如果 URL 隊列為空,程序將退出;
4、程序根據出隊的URL反映對應的解析類(lèi),同時(shí)創(chuàng )建一個(gè)新的線(xiàn)程開(kāi)始解析任務(wù);
5、程序會(huì )下載該URL指向的網(wǎng)頁(yè),判斷該頁(yè)面是詳情頁(yè)還是列表頁(yè)(如博客中的博客詳情、博文列表)。如果是詳情頁(yè),它會(huì )解析出頁(yè)面內容存入數據庫。如果是列表頁(yè),則提取頁(yè)面鏈接加入URL隊列;
6.解析任務(wù)完成后,重復步驟3。
?。ǘ┏绦蚪Y構
我們已經(jīng)知道了爬蟲(chóng)的具體流程,現在我們需要一個(gè)合理的程序結構來(lái)實(shí)現它。
首先介紹一下這個(gè)簡(jiǎn)單的爬蟲(chóng)程序的主要結構組件:
然后,看看程序中的工具類(lèi)和實(shí)體類(lèi)。
最后,根據類(lèi)的作用,我們將其放置在上面流程圖中的相應位置。具體*敏*感*詞*如下:
我們現在已經(jīng)完成了實(shí)際流程到程序邏輯的翻譯。接下來(lái),我們將通過(guò)源碼的介紹,深入到程序的細節。
(3)、任務(wù)調度、初始化隊列
在簡(jiǎn)單的爬蟲(chóng)程序中,任務(wù)調度和初始化隊列都是在SpiderApplication類(lèi)中完成的。
(4)、插件工廠(chǎng)
在URL循環(huán)調度中,有一個(gè)語(yǔ)句需要我們注意:
AbstractPlugin plugin = PluginFactory.getInstance().getPlugin(task);
其中,AbstractPlugin是繼承自Thread的抽象插件類(lèi)。
這個(gè)語(yǔ)句的意思是插件工廠(chǎng)根據url實(shí)例化繼承自AbstractPlugin的指定插件。
插件工廠(chǎng)也可以理解為解析類(lèi)工廠(chǎng)。
在這個(gè)程序中,插件工廠(chǎng)的實(shí)現主要依賴(lài)三個(gè)方面:
1.插件
包插件;
導入 java.lang.annotation.*;
/**
* 插件說(shuō)明
*
* @作者熊貓
* @日期 2017/12/01
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
公共@interface插件{
String value() 默認"";
}
Plugin其實(shí)是一個(gè)注解接口,在Plugin的支持下,我們可以通過(guò)注解@Plugin讓程序識別插件類(lèi)。這就好比在SpringMVC中,我們通過(guò)@[emailprotected]等來(lái)標識每一個(gè)Bean。
2.Xmu插件
@Plugin(值="")
公共類(lèi) XmuPlugin 擴展 AbstractPlugin {
}
XmuPlugin是眾多插件(解析類(lèi))中的一種,作用由注解@Plugin標注,其具體標識(即對應于哪個(gè)url)由注解中的值標注。
3.插件工廠(chǎng)
包裝廠(chǎng);
*敏*感*詞*實(shí)體。任務(wù);
導入 org.slf4j.Logger;
導入 org.slf4j.LoggerFactory;
導入插件.AbstractPlugin;
導入插件。插件;
導入 util.CommonUtil;
導入java.io.文件;
導入 java.lang.annotation.Annotation;
導入 java.lang.reflect.Constructor;
導入 java.util.ArrayList;
導入 java.util.HashMap;
導入java.util.List;
導入 java.util.Map;
/**
* 插件工廠(chǎng)
*
* @作者熊貓
* @日期 2017/12/01
*/
公共類(lèi) PluginFactory {
私有靜態(tài)最終記錄器記錄器 = LoggerFactory。getLogger(PluginFactory.class);
private static final PluginFactory factory = new PluginFactory();
私有列表> classList = new ArrayList>();
private Map pluginMapping = new HashMap();
私人插件工廠(chǎng)(){
掃描包(“插件”);
如果 (classList.size() > 0) {
初始化插件映射();
}
}
公共靜態(tài) PluginFactory getInstance() {
返廠(chǎng);
}
/**
* 掃描包、分包
*
* @param 包名
*/
私人無(wú)效掃描包(字符串包名){
嘗試 {
字符串路徑 = getSrcPath() + 文件。分隔符 + changePackageNameToPath(packageName);
文件目錄=新文件(路徑);
文件 [] 文件 = 目錄。列表文件();
如果(文件==空){
logger.warn("包名不存在!");
返回;
}
對于(文件文件:文件){
如果(文件。isDirectory()){
scanPackage(packageName + "."+ file.getName());
} 別的 {
Class clazz = Class.forName(packageName + "."+ file.getName().split("\\.")[0]);
classList.add(clazz);
}
}
} 趕上(異常 e){
logger.error("掃描包異常:", e);
}
}
/**
* 獲取根路徑
*
* @返回
*/
私有字符串 getSrcPath() {
返回系統。getProperty("用戶(hù)目錄") +
文件分隔符+"src"+
文件分隔符+"main"+
文件分隔符 + "java";
}
/**
* 將包名轉換為路徑格式
*
* @param 包名
* @返回
*/
私有字符串 changePackageNameToPath(String packageName) {
返回 packageName.replaceAll("\\.", File.separator);
}
/**
* 初始化插件容器
*/
私有無(wú)效 initPluginMapping() {
對于(類(lèi)克拉茲:類(lèi)列表){
注釋 annotation = clazz. getAnnotation(插件。類(lèi));
如果(注釋?zhuān)? null){
pluginMapping.put(((插件)注解).value(), clazz.getName());
}
}
}
/**
* 通過(guò)反射實(shí)例化插件對象
* @param 任務(wù)
* @返回
*/
public AbstractPlugin getPlugin(任務(wù)任務(wù)){
if (task == null || task.getUrl() == null) {
logger.warn("非法任務(wù)!");
返回空值;
}
如果 (pluginMapping.size() == 0) {
logger.warn("當前包中沒(méi)有插件!");
返回空值;
}
對象對象=空;
字符串插件名稱(chēng) = CommonUtil。getHost(task.getUrl());
字符串 pluginClass = pluginMapping。得到(插件名稱(chēng));
如果(pluginClass == null){
logger.warn("沒(méi)有名為"+ pluginName +"的插件");
返回空值;
}
嘗試 {
("找到解析插件:"+ pluginClass);
階級克拉茲=階級。名稱(chēng)(插件類(lèi));
構造函數構造函數= clazz。getConstructor(任務(wù)。類(lèi));
對象 = 構造函數。新實(shí)例(任務(wù));
} 趕上(異常 e){
logger.error("反射異常:", e);
}
返回(抽象插件)對象;
}
}
PluginFactory 有兩個(gè)主要功能:
掃描插件包下@Plugin注解的插件類(lèi);
根據 url 反射指定插件類(lèi)。
(5)、分析插件
正如我們上面所說(shuō),分析插件其實(shí)對應于每一個(gè)網(wǎng)站分析類(lèi)。
在實(shí)際的爬蟲(chóng)分析中,總會(huì )有很多類(lèi)似甚至相同的分析任務(wù),比如鏈接提取。因此,在分析插件中,我們首先要實(shí)現一個(gè)父接口來(lái)提供這些公共方法。
在這個(gè)程序中,插件父接口就是上面提到的AbstractPlugin類(lèi):
包插件;
*敏*感*詞*實(shí)體。任務(wù);
*敏*感*詞*過(guò)濾器。和過(guò)濾器;
*敏*感*詞*過(guò)濾器。文件擴展過(guò)濾器;
*敏*感*詞*過(guò)濾器。鏈接提取器;
*敏*感*詞*過(guò)濾器。鏈接過(guò)濾器;
導入 mons.lang3.StringUtils;
導入 org.slf4j.Logger;
導入 org.slf4j.LoggerFactory;
導入服務(wù).DownloadService;
導入 util.CommonUtil;
導入 java.util.ArrayList;
導入java.util.List;
/**
* 插件抽象類(lèi)
*
* @作者熊貓
* @日期 2017/12/01
*/
公共抽象類(lèi) AbstractPlugin 擴展線(xiàn)程 {
私有靜態(tài)最終記錄器記錄器 = LoggerFactory。getLogger(AbstractPlugin.class);
受保護的任務(wù)任務(wù);
protected DownloadService downloadService = new DownloadService();
私有列表 urlList = new ArrayList();
公共抽象插件(任務(wù)任務(wù)){
this.task = 任務(wù);
}
@覆蓋
公共無(wú)效運行(){
("{} 開(kāi)始運行...", task.getUrl());
字符串主體 = 下載服務(wù)。getResponseBody(任務(wù));
如果 (StringUtils.isNotEmpty(body)) {
如果 (isDetailPage(task.getUrl())) {
("開(kāi)始解析詳情頁(yè)...");
解析內容(正文);
} 別的 {
("開(kāi)始解析列表頁(yè)...");
提取頁(yè)面鏈接(正文);
}
}
}
public void extractPageLinks(String body) {
LinkFilter hostFilter = new LinkFilter() {
字符串 urlHost = CommonUtil。getUrlPrefix(task.getUrl());
公共布爾接受(字符串鏈接){
返回鏈接。收錄(urlHost);
}
};
String[] fileExtensions = (".xls,.xml,.txt,.pdf,.jpg,.mp3,.mp4,.doc,.mpg,.mpeg,.jpeg,.gif,.png,.js,.郵編,"+
".rar,.exe,.swf,.rm,.ra,.asf,.css,.bmp,.pdf,.z,.gz,.tar,.cpio,.class").split("," );
LinkFilter fileExtensionFilter = new FileExtensionFilter(fileExtensions);
AndFilter filter = new AndFilter(new LinkFilter[]{hostFilter, fileExtensionFilter});
urlList = 鏈接提取器。extractLinks(task.getUrl(), body, filter);
}
公共列表 getUrlList() {
返回網(wǎng)址列表;
}
public abstract void parseContent(String body);
public abstract boolean isDetailPage(String url);
}
父接口定義了兩條規則:
解析規則,即何時(shí)解析文本,何時(shí)提取列表鏈接;
提取鏈接規則,即過(guò)濾掉哪些不需要的鏈接。
但是我們注意到父接口中用來(lái)解析網(wǎng)站 body內容的parseContent(String body)是一個(gè)抽象方法。而這正是實(shí)際的插件類(lèi)應該做的。這里,我們以 XmuPlugin 為例:
包插件;
*敏*感*詞*實(shí)體。任務(wù);
導入 org.jsoup.nodes.Document;
導入 org.jsoup.nodes.Element;
導入 org.jsoup.select.Elements;
導入 org.slf4j.Logger;
導入 org.slf4j.LoggerFactory;
導入 util.CommonUtil;
導入 util.FileUtils;
導入 java.text.SimpleDateFormat;
導入java.util.Date;
/**
* xmu插件
*
* @作者熊貓
* @日期 2017/12/01
*/
@Plugin(值="")
公共類(lèi) XmuPlugin 擴展 AbstractPlugin {
私有靜態(tài)最終記錄器記錄器 = LoggerFactory。getLogger(XmuPlugin.class);
公共 XmuPlugin(任務(wù)任務(wù)){
超級(任務(wù));
}
@覆蓋
public void parseContent(String body) {
文檔 doc = CommonUtil. 獲取文檔(正文);
嘗試 {
String title = doc.select("p.h1").first().text();
String publishTimeStr = doc.select("p.right-content").first().text();
publishTimeStr = CommonUtil.match(publishTimeStr,"(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2} )")[1];
日期發(fā)布時(shí)間 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(publishTimeStr);
字符串內容=””;
元素元素 = 文檔。選擇(“p.MsoNormal”);
對于(元素元素:元素){
內容 +="\n"+ 元素。文本();
}
("標題:"+標題);
("發(fā)布時(shí)間:"+ 發(fā)布時(shí)間);
?。ā皟热荩骸?內容);
FileUtils.writeFile(title + ".txt", 內容);
} 趕上(異常 e){
logger.error("解析內容異常:"+ task.getUrl(), e);
}
}
@覆蓋
public boolean isDetailPage(String url) {
返回 CommonUtil.isMatch(url,"&a=show&catid=\\d+&id=\\d+");
}
}
在 XmuPlugin 中,我們做了兩件事:
定義詳情頁(yè)的具體規則;
解析出具體的文本內容。
(6)、采集例子
至此,我們就成功完成了Java簡(jiǎn)單爬蟲(chóng)程序。接下來(lái),讓我們看看采集的實(shí)際情況。
5.分享幾個(gè)好用的網(wǎng)絡(luò )爬蟲(chóng)工具和教程
很多人看了文章,會(huì )說(shuō)寫(xiě)的文章太深奧,需要編程才能實(shí)現數據爬取。有什么簡(jiǎn)單的方法或工具可以實(shí)現嗎?解決后給大家分享幾個(gè)好用的網(wǎng)絡(luò )爬蟲(chóng)工具,使用起來(lái)非常簡(jiǎn)單,也可以達到相應的效果。
1. 優(yōu)采云云爬蟲(chóng)
官方網(wǎng)站:
簡(jiǎn)介:優(yōu)采云Cloud是一個(gè)大數據應用開(kāi)發(fā)平臺,為開(kāi)發(fā)者提供一整套數據采集、數據分析和機器學(xué)習開(kāi)發(fā)工具,為企業(yè)提供專(zhuān)業(yè)的數據抓取和實(shí)時(shí)監控。數據監控和數據分析服務(wù)。
優(yōu)勢:功能強大,涉及云爬蟲(chóng)、API、機器學(xué)習、數據清洗、數據售賣(mài)、數據定制和私有化部署等;
純云端操作,跨系統操作無(wú)壓力,隱私保護,可隱藏用戶(hù)IP。
提供云爬蟲(chóng)市場(chǎng),零基礎用戶(hù)可直接調用開(kāi)發(fā)的爬蟲(chóng),開(kāi)發(fā)者基于官方云開(kāi)發(fā)環(huán)境開(kāi)發(fā)上傳自己的爬蟲(chóng)程序;
領(lǐng)先的防爬技術(shù),如直接獲取代理IP、自動(dòng)識別登錄驗證碼等,全程自動(dòng)化,無(wú)需人工參與;
豐富的發(fā)布接口,采集結果以豐富的表格形式展示;
缺點(diǎn):它的優(yōu)點(diǎn)在一定程度上也成為了它的缺點(diǎn),因為它是一個(gè)面向開(kāi)發(fā)者的爬蟲(chóng)開(kāi)發(fā)系統,提供了豐富的開(kāi)發(fā)功能。網(wǎng)站看起來(lái)很技術(shù)很專(zhuān)業(yè),雖然官網(wǎng)也提供了云爬蟲(chóng)市場(chǎng)等現成的爬蟲(chóng)產(chǎn)品,面向廣大爬蟲(chóng)開(kāi)發(fā)者開(kāi)放,豐富爬蟲(chóng)市場(chǎng)的內容,零技術(shù)基礎的用戶(hù)不太容易看懂,所以有一定的使用門(mén)檻。
是否免費:免費用戶(hù)沒(méi)有采集功能和出口限制,不需要積分。
有開(kāi)發(fā)能力的用戶(hù)可以自行開(kāi)發(fā)爬蟲(chóng)實(shí)現免費效果,沒(méi)有開(kāi)發(fā)能力的用戶(hù)需要到爬蟲(chóng)市場(chǎng)尋找免費的爬蟲(chóng)。
2. 優(yōu)采云采集器
官方網(wǎng)站:
簡(jiǎn)介:優(yōu)采云采集器是一個(gè)可視化的采集器,內置采集模板,支持各種網(wǎng)頁(yè)數據采集。
優(yōu)點(diǎn):支持自定義模式,可視采集操作,簡(jiǎn)單易用;
支持簡(jiǎn)單采集模式,提供官方采集模板,支持云端采集操作;
支持代理IP切換、驗證碼服務(wù)等反屏蔽措施;
支持多種數據格式導出。
缺點(diǎn):功能使用門(mén)檻比較高,很*敏*感*詞*在本地采集有限制,云端采集收費較高;
采集速度比較慢,很多操作都要卡。云采集說(shuō)快了10倍但是不明顯;
僅支持 Windows 版本,不支持其他操作系統。
是否免費:號稱(chēng)免費,但實(shí)際上導出數據需要積分,可以做任務(wù)積累積分,但一般情況下基本需要購買(mǎi)積分。
3. 優(yōu)采云采集器
官方網(wǎng)站:
簡(jiǎn)介: 優(yōu)采云采集器是前谷歌搜索技術(shù)團隊基于人工智能技術(shù)開(kāi)發(fā)的新一代網(wǎng)頁(yè)采集軟件。該軟件功能強大,操作極其簡(jiǎn)單。
優(yōu)點(diǎn):支持智能采集模式,輸入URL即可智能識別采集對象,無(wú)需配置采集規則,操作非常簡(jiǎn)單;
支持流程圖模式,可視化操作流程,可以通過(guò)簡(jiǎn)單的操作生成各種復雜的采集規則;
支持反屏蔽措施,如代理IP切換等;
支持多種數據格式導出;
支持定時(shí)采集和自動(dòng)發(fā)布,豐富的發(fā)布接口;
支持 Windows、Mac 和 Linux 版本。
缺點(diǎn):軟件發(fā)布時(shí)間不長(cháng),部分功能還在完善中,暫時(shí)不支持云端采集功能
是否免費:完全免費,采集數據和手動(dòng)導出采集結果沒(méi)有限制,不需要積分
4.使用“優(yōu)采云采集器”來(lái)爬取數據實(shí)例
使用優(yōu)采云采集瀑布網(wǎng)站圖片(百度圖片采集
例如)方法。
采集網(wǎng)站:
%E5%A4%8F%E7%9B%AE%E5%8F%8B%E4%BA%BA%E5%B8%90
第 1 步:創(chuàng )建一個(gè) 采集 任務(wù)
1)進(jìn)入主界面,選擇自定義模式
2)將上述網(wǎng)址的網(wǎng)址復制粘貼到網(wǎng)站輸入框中,點(diǎn)擊“保存網(wǎng)址”
3) 系統自動(dòng)打開(kāi)網(wǎng)頁(yè)。我們發(fā)現百度圖片網(wǎng)是一個(gè)瀑布網(wǎng)頁(yè),每次下拉加載都會(huì )出現新的數據。當圖片足夠多的時(shí)候,可以加載無(wú)數次。所以本網(wǎng)頁(yè)涉及到AJAX技術(shù),需要設置AJAX超時(shí)時(shí)間,保證采集時(shí)不會(huì )遺漏數據。
選擇“打開(kāi)網(wǎng)頁(yè)”步驟,打開(kāi)“高級選項”,勾選“頁(yè)面加載后向下滾動(dòng)”,設置滾動(dòng)次數為“5次”(根據自己需要設置),時(shí)間為“2秒”,以及“向下滾動(dòng)一屏”的滾動(dòng)方法;最后點(diǎn)擊“確定”
注:例如網(wǎng)站,沒(méi)有翻頁(yè)按鈕,滾動(dòng)次數和滾動(dòng)方式會(huì )影響數據量采集,可根據需要設置
第 2 步:采集 圖片網(wǎng)址
1) 選擇頁(yè)面第一張圖片,系統會(huì )自動(dòng)識別相似圖片。在操作提示框中,選擇“全選”
2)選擇“采集以下圖片地址”
第 3 步:修改 XPath
1) 選擇“循環(huán)”步驟并打開(kāi)“高級選項”??梢钥吹絻?yōu)采云系統自動(dòng)使用“不固定元素列表”循環(huán),Xpath為: //DIV[@id='imgid']/DIV[1]/UL[1]/LI
2)復制這個(gè)Xpath://DIV[@id='imgid']/DIV[1]/UL[1]/LI到火狐瀏覽器中觀(guān)察——只能定位到網(wǎng)頁(yè)中的22張圖片
3)我們需要一個(gè)能夠在網(wǎng)頁(yè)中定位所有需要的圖片的XPath。觀(guān)察網(wǎng)頁(yè)源碼,修改Xpath為://DIV[@id='imgid']/DIV/UL[1]/LI,網(wǎng)頁(yè)中所有需要的圖片都位于
4)將修改后的Xpath://DIV[@id='imgid']/DIV/UL[1]/LI復制粘貼到優(yōu)采云中相應位置,完成后點(diǎn)擊“確定”
5) 點(diǎn)擊“保存”,然后點(diǎn)擊“啟動(dòng)采集”,這里選擇“啟動(dòng)本地采集”
第 4 步:數據 采集 和導出
1)采集完成后,會(huì )彈出提示,選擇導出數據
2)選擇合適的導出方式導出采集好的數據
第 5 步:將圖像 URL 批量轉換為圖像
經(jīng)過(guò)上面的操作,我們就得到了我們要采集的圖片的url。接下來(lái),使用優(yōu)采云專(zhuān)用圖片批量下載工具,將采集圖片URL中的圖片下載并保存到本地電腦。
圖片批量下載工具:
1)下載優(yōu)采云圖片批量下載工具,雙擊文件中的MyDownloader.app.exe文件打開(kāi)軟件
2)打開(kāi)文件菜單,選擇從EXCEL導入(目前只支持EXCEL格式文件)
3)進(jìn)行相關(guān)設置,設置完成后點(diǎn)擊確定導入文件
選擇EXCEL文件:導入你需要的EXCEL文件下載圖片地址
EXCEL表名:對應數據表的名稱(chēng)
文件URL列名:表中URL對應的列名
保存文件夾名稱(chēng):EXCEL中需要單獨一欄列出圖片要保存到文件夾的路徑,可以設置不同的圖片保存在不同的文件夾中
如果要將文件保存到文件夾中,路徑需要以“\”結尾,例如:“D:\Sync\”,如果下載后要按照指定的文件名保存文件,則需要收錄特定文件名,例如“D :\Sync\1.jpg”
如果下載的文件路徑和文件名完全相同,則刪除現有文件