go語言網路內容爬蟲如何寫?
可以參考Python的Scrapy的架構,把它翻譯成Golang。
一般的方法是,定義一個入口頁面,然後一般一個頁面會有其他頁面的URL,於是從當前頁面獲取到這些URL加入到爬蟲的抓取隊列中,然後進入到新新頁面後再遞歸的進行上述的操作,其實說來就跟深度遍歷或廣度遍歷一樣。
上面介紹的只是爬蟲的一些概念而非搜索引擎,實際上搜索引擎的話其系統是相當複雜的,爬蟲只是搜索引擎的一個子系統而已。下面介紹一個開源的爬蟲框架Scrapy。
一、概述
Scrapy是一個用 Python 寫的 Crawler Framework ,簡單輕巧,並且非常方便,並且官網上說已經在實際生產中在使用了,不過現在還沒有 Release 版本,可以直接使用他們的 Mercurial 倉庫里抓取源碼進行安裝。
Scrapy 使用 Twisted 這個非同步網路庫來處理網路通訊,架構清晰,並且包含了各種中間件介面,可以靈活的完成各種需求。整體架構如下圖所示:
綠線是數據流向,首先從初始 URL 開始,Scheduler 會將其交給 Downloader 進行下載,下載之後會交給 Spider 進行分析,Spider 分析出來的結果有兩種:一種是需要進一步抓取的鏈接,例如之前分析的「下一頁」的鏈接,這些東西會被傳回 Scheduler ;另一種是需要保存的數據,它們則被送到 Item Pipeline 那裡,那是對數據進行後期處理(詳細分析、過濾、存儲等)的地方。另外,在數據流動的通道里還可以安裝各種中間件,進行必要的處理。
二、組件
1、Scrapy Engine(Scrapy引擎)
Scrapy引擎是用來控制整個系統的數據處理流程,並進行事務處理的觸發。更多的詳細內容可以看下面的數據處理流程。
2、Scheduler(調度)
調度程序從Scrapy引擎接受請求並排序列入隊列,並在Scrapy引擎發出請求後返還給他們。
3、Downloader(下載器)
下載器的主要職責是抓取網頁並將網頁內容返還給蜘蛛( Spiders)。
4、Spiders(蜘蛛)
蜘蛛是有Scrapy用戶自己定義用來解析網頁並抓取制定URL返回的內容的類,每個蜘蛛都能處理一個域名或一組域名。換句話說就是用來定義特定網站的抓取和解析規則。
蜘蛛的整個抓取流程(周期)是這樣的:
首先獲取第一個URL的初始請求,當請求返回後調取一個回調函數。第一個請求是通過調用start_requests()方法。該方法默認從start_urls中的Url中生成請求,並執行解析來調用回調函數。
在回調函數中,你可以解析網頁響應並返回項目對象和請求對象或兩者的迭代。這些請求也將包含一個回調,然後被Scrapy下載,然後有指定的回調處理。
在回調函數中,你解析網站的內容,同程使用的是Xpath選擇器(但是你也可以使用BeautifuSoup, lxml或其他任何你喜歡的程序),並生成解析的數據項。
最後,從蜘蛛返回的項目通常會進駐到項目管道。
5、Item Pipeline(項目管道)
項目管道的主要責任是負責處理有蜘蛛從網頁中抽取的項目,他的主要任務是清晰、驗證和存儲數據。當頁面被蜘蛛解析後,將被發送到項目管道,並經過幾個特定的次序處理數據。每個項目管道的組件都是有一個簡單的方法組成的Python類。他們獲取了項目並執行他們的方法,同時他們還需要確定的是是否需要在項目管道中繼續執行下一步或是直接丟棄掉不處理。
項目管道通常執行的過程有:
清洗HTML數據
驗證解析到的數據(檢查項目是否包含必要的欄位)
檢查是否是重複數據(如果重複就刪除)
將解析到的數據存儲到資料庫中
6、Downloader middlewares(下載器中間件)
下載中間件是位於Scrapy引擎和下載器之間的鉤子框架,主要是處理Scrapy引擎與下載器之間的請求及響應。它提供了一個自定義的代碼的方式來拓展Scrapy的功能。下載中間器是一個處理請求和響應的鉤子框架。他是輕量級的,對Scrapy盡享全局控制的底層的系統。
7、Spider middlewares(蜘蛛中間件)
蜘蛛中間件是介於Scrapy引擎和蜘蛛之間的鉤子框架,主要工作是處理蜘蛛的響應輸入和請求輸出。它提供一個自定義代碼的方式來拓展Scrapy的功能。蛛中間件是一個掛接到Scrapy的蜘蛛處理機制的框架,你可以插入自定義的代碼來處理髮送給蜘蛛的請求和返回蜘蛛獲取的響應內容和項目。
8、Scheduler middlewares(調度中間件)
調度中間件是介於Scrapy引擎和調度之間的中間件,主要工作是處從Scrapy引擎發送到調度的請求和響應。他提供了一個自定義的代碼來拓展Scrapy的功能。
三、數據處理流程Scrapy的整個數據處理流程有Scrapy引擎進行控制,其主要的運行方式為:
引擎打開一個域名,時蜘蛛處理這個域名,並讓蜘蛛獲取第一個爬取的URL。
引擎從蜘蛛那獲取第一個需要爬取的URL,然後作為請求在調度中進行調度。
引擎從調度那獲取接下來進行爬取的頁面。
調度將下一個爬取的URL返回給引擎,引擎將他們通過下載中間件發送到下載器。
當網頁被下載器下載完成以後,響應內容通過下載中間件被發送到引擎。
引擎收到下載器的響應並將它通過蜘蛛中間件發送到蜘蛛進行處理。
蜘蛛處理響應並返回爬取到的項目,然後給引擎發送新的請求。
引擎將抓取到的項目項目管道,並向調度發送請求。
系統重複第二部後面的操作,直到調度中沒有請求,然後斷開引擎與域之間的聯繫。
Pholcus(幽靈蛛)是一款純Go語言編寫的高並發、分散式、重量級爬蟲軟體,支持單機、服務端、客戶端三種運行模式,擁有Web、GUI、命令行三種操作界面;規則簡單靈活、批量任務並發、輸出方式豐富(mysql、mongodb、csv、excel等)、有大量Demo共享;同時她還支持橫縱向兩種抓取模式,支持模擬登錄和任務暫停、取消等一系列高級功能。
- 源碼地址:https://github.com/henrylee2cn/pholcus
框架特點
Pholcus(幽靈蛛)以高效率,高靈活性和人性化設計為開發的指導思想;
支持單機、服務端、客戶端三種運行模式,即支持分散式布局,適用於各種業務需要;
支持Web、GUI、命令行三種操作界面,適用於各種運行環境;
支持mysql/mongodb/csv/excel等多種輸出方式,且可以輕鬆添加更多輸出方式;
採用surfer高並發下載器,支持 GET/POST/HEAD 方法及 http/https 協議,同時支持固定UserAgent自動保存cookie與隨機大量UserAgent禁用cookie兩種模式,高度模擬瀏覽器行為,可實現模擬登錄等功能;
伺服器/客戶端模式採用teleport高並發socketAPI框架,全雙工長連接通信,內部數據傳輸格式為JSON;
對採集規則進行了精心設計,支持靜態編譯與動態JS兩種規則,靈活簡單且有大量Demo,寫規則就是這麼輕鬆;
支持橫縱向兩種抓取模式,並且支持任務暫停、取消等操作。
推薦 一個不是網路爬蟲, 但是一個簡單的網站模板爬蟲, 輕鬆將一個網站的html, css, images, js爬下來學習. lealife/leacrawler 路 GitHub
https://github.com/hu17889/go_spider我寫的一個,可以交流一下哈
Antch的爬蟲框架。antchfx/antch
推薦閱讀:
※golang 想要持久的火起來,該怎麼做?
※Go 1.7.6 和 1.8.2 雙版本發布,GO語言開發團隊為什麼要維護一個較低的歷史版?
※如何看待Go進入tiobe top 20?
※有哪些可以在500-1000行以內實現的Go語言項目?
※有哪些不錯的golang開源項目?
TAG:Go語言 |