摘要:通用網絡爬蟲通用網絡爬蟲又稱全網爬蟲,爬取對象從一些種子擴充到整個。為提高工作效率,通用網絡爬蟲會采取一定的爬取策略。介紹是一個國人編寫的強大的網絡爬蟲系統并帶有強大的。
爬蟲
簡單的說網絡爬蟲(Web crawler)也叫做網絡鏟(Web scraper)、網絡蜘蛛(Web spider),其行為一般是先“爬”到對應的網頁上,再把需要的信息“鏟”下來。分類
網絡爬蟲按照系統結構和實現技術,大致可以分為以下幾種類型:通用網絡爬蟲(General Purpose Web Crawler)、聚焦網絡爬蟲(Focused Web Crawler)、增量式網絡爬蟲(Incremental Web Crawler)、深層網絡爬蟲(Deep Web Crawler)。實際的網絡爬蟲系統通常是幾種爬蟲技術相結合實現的。
通用網絡爬蟲通用網絡爬蟲又稱全網爬蟲(Scalable Web Crawler),爬取對象從一些種子 URL 擴充到整個 Web。主要為門戶站點搜索引擎和大型 Web 服務提供商采集數據。
通用網絡爬蟲的結構大致可以分為頁面爬取模塊 、頁面分析模塊、鏈接過濾模塊、頁面存儲模塊、URL 隊列、初始 URL 集合幾個部分。為提高工作效率,通用網絡爬蟲會采取一定的爬取策略。 常用的爬取策略有:深度優先策略、廣度優先策略。
1) 深度優先策略(DFS):其基本方法是按照深度由低到高的順序,依次訪問下一級網頁鏈接,直到不能再深入為止。
2) 廣度優先策略(BFS):此策略按照網頁內容目錄層次深淺來爬取頁面,處于較淺目錄層次的頁面首先被爬取。 當同一層次中的頁面爬取完畢后,爬蟲再深入下一層繼續爬取。
聚焦網絡爬蟲聚焦網絡爬蟲(Focused Crawler),又稱主題網絡爬蟲(Topical Crawler),是指選擇性地爬取那些與預先定義好的主題相關頁面的網絡爬蟲。 和通用網絡爬蟲相比,聚焦爬蟲只需要爬取與主題相關的頁面,極大地節省了硬件和網絡資源,保存的頁面也由于數量少而更新快,還可以很好地滿足一些特定人群對特定領域信息的需求。我們之前爬的歌單就屬于這一種。
增量式網絡爬蟲增量式網絡爬蟲(Incremental Web Crawler)是指對已下載網頁采取增 量式更新和只爬取新產生的或者已經發生變化網頁的爬蟲,它能夠在一定程度上保證所爬取的頁面是盡可能新的頁面。 和周期性爬取和刷新頁面的網絡爬蟲相比,增量式爬蟲只會在需要的時候爬取新產生或發生更新的頁面 ,并不重新下載沒有發生變化的頁面,可有效減少數據下載量,及時更新已爬取的網頁,減小時間和空間上的耗費,但是增加了爬取算法的復雜度和實現難度。現在比較火的輿情爬蟲一般都是增量式網絡爬蟲。
深網爬蟲Web 頁面按存在方式可以分為表層網頁(Surface Web)和深層網頁(Deep Web,也稱 Invisible Web Pages 或 Hidden Web)。 表層網頁是指傳統搜索引擎可以索引的頁面,以超鏈接可以到達的靜態網頁為主構成的 Web 頁面。Deep Web 是那些大部分內容不能通過靜態鏈接獲取的、隱藏在搜索表單后的,只有用戶提交一些關鍵詞才能獲得的 Web 頁面。例如那些用戶注冊后內容才可見的網頁就屬于 Deep Web。
開源框架Project | Language | Star | Watch | Fork |
---|---|---|---|---|
Nutch | Java | 1111 | 195 | 808 |
webmagic | Java | 4216 | 618 | 2306 |
WebCollector | Java | 1222 | 255 | 958 |
heritrix3 | Java | 773 | 141 | 428 |
crawler4j | Java | 1831 | 242 | 1136 |
Pyspider | Python | 8581 | 687 | 2273 |
Scrapy | Python | 19642 | 1405 | 5261 |
介紹:
Nutch是一個開源的Java實現的搜索引擎。它提供了我們運行自己的搜索引擎所需的全部工具,包括全文搜索和網絡爬蟲。
盡管搜索是上網的基本要求,但是現有的搜索引擎的數目卻在下降。并且這很有可能進一步演變成為一個公司壟斷了幾乎所有的網頁搜索為其謀取商業利益。這顯然不利于廣大Internet用戶。
Nutch為我們提供了這樣一個不同的選擇。相對于那些商用的搜索引擎,Nutch作為開放源代碼的搜索引擎將會更加透明,從而更值得大家信賴。現在所有主要的搜索引擎都采用私有的排序算法, 而不會解釋為什么一個網頁會排在一個特定的位置。除此之外, 有的搜索引擎依照網站所付的費用, 而不是根據它們本身的價值進行排序。與它們不同,Nutch沒有什么需要隱瞞,也沒有動機去扭曲搜索的結果。Nutch將盡自己最大的努力為用戶提供最好的搜索結果。
優點:
Nutch支持分布式抓取,并有Hadoop支持,可以進行多機分布抓取,存儲和索引。另外很吸引人的一點在于,它提供了一種插件框架,使得其對各種網頁內容的解析、各種數據的采集、查詢、集群、過濾等功能能夠方便的進行擴展。正是由于有此框架,使得 Nutch 的插件開發非常容易,第三方的插件也層出不窮,極大的增強了 Nutch 的功能和聲譽。
缺點:
對于大多數用戶來說,一般是想做一個精確數據爬取的爬蟲,就像第一篇里爬歌單那個“主題爬蟲”。而第二篇介紹的“通用爬蟲”適合做搜索引擎,這種需求就比較少。如果以此為標準,那么為搜索引擎而生的Nutch就有著天生缺點。Nutch的架構里大部分為搜索引擎而設計的,對精確爬取沒有特別的考慮。也就是說,用Nutch做主題爬蟲,會浪費很多的時間在不必要的計算上。而且如果你試圖通過對Nutch進行二次開發來擴展其定制能力,基本上就要破壞Nutch的框架,反而不如自己寫了。
Pyspider介紹:
Pyspider是一個國人編寫的強大的網絡爬蟲系統并帶有強大的WebUI。采用Python語言編寫,分布式架構,支持多種數據庫后端,強大的WebUI支持腳本編輯器,任務監視器,項目管理器以及結果查看器。
Pyspider的主要功能包括,抓取、更新調度多站點的特定的頁面;需要對頁面進行結構化信息提取;靈活可擴展,穩定可監控。滿足了絕大多數Python爬蟲的需求 —— 定向抓取,結構化化解析。但是面對結構迥異的各種網站,單一的抓取模式并不一定能滿足,靈活的抓取控制是必須的。為了達到這個目的,單純的配置文件往往不夠靈活,于是,通過腳本去控制抓取成為了最后的選擇。而去重調度,隊列,抓取,異常處理,監控等功能作為框架,提供給抓取腳本,并保證靈活性。最后加上web的編輯調試環境,以及web任務監控,即成為了最終的框架。
優點:
支持分布式部署。
完全可視化,對用戶非常友好:WEB 界面編寫調試腳本,起停腳本,監控執行狀態,查看活動歷史,獲取結果產出。
簡單,五分鐘就能上手。腳本規則簡單,開發效率高。
支持抓取JavaScript的頁面。
總之,Pyspider非常強大,強大到更像一個產品而不是一個框架。
缺點:
URL去重使用數據庫而不是布隆過濾器,億級存儲的db io將導致效率急劇降低。
使用上的人性化犧牲了靈活度,定制化能力降低。
Scrapy介紹:
Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。Scrapy 使用 Twisted這個異步網絡庫來處理網絡通訊,架構清晰,并且包含了各種中間件接口,可以靈活的完成各種需求。Scratch,是抓取的意思,這個Python的爬蟲框架叫Scrapy,大概也是這個意思吧。
優點:
極其靈活的定制化爬取。
社區人數多、文檔完善。
URL去重采用布隆過濾器方案。
可以處理不完整的HTML,Scrapy已經提供了selectors(一個在lxml的基礎上提供了更高級的接口),可以高效地處理不完整的HTML代碼。
缺點:
不支持分布式部署。
原生不支持抓取JavaScript的頁面。
全命令行操作,對用戶不友好,需要一定學習周期。
Scrapy入門 架構簡介組件
Engine: 引擎負責控制數據流在系統中所有組件中流動,并在相應動作發生時觸發事件。
Scheduler: 調度器從引擎接受Request并將他們入隊,以便之后引擎請求他們時提供給引擎。
Downloader: 下載器負責獲取頁面數據并提供給引擎,而后提供給Spider。
Spiders: Spider是Scrapy用戶編寫的用于分析Response并提取Item或提取更多需要下載的URL的類。 每個Spider負責處理特定網站。
Item Pipeline: 負責處理被Spider提取出來的Item。典型的功能有清洗、 驗證及持久化操作。
Downloader middlewares: 下載器中間件是在Engine及Downloader之間的特定鉤子(specific hooks),處理Downloader傳遞給Engine的Response。 其提供了一個簡便的機制,通過插入自定義代碼來擴展Scrapy功能。
Spider middlewares: 是在Engine及Spider之間的特定鉤子(specific hook),處理Spider的輸入(Response)和輸出(Items及Requests)。 其提供了一個簡便的機制,通過插入自定義代碼來擴展Scrapy功能。
數據流
Scrapy中的數據流由執行引擎控制,其過程如下:
Engine從Spider獲取第一個需要爬取URL(s)。
Engine用Scheduler調度Requests,并向Scheduler請求下一個要爬取的URL。
Scheduler返回下一個要爬取的URL給Engine。
Engine將URL通過Downloader middlewares轉發給Downloader。
一旦頁面下載完畢,下載器生成一個該頁面的Response,并將其通過Downloader middlewares發送給Engine。
引擎從Downloader中接收到Response并通過Spider middlewares發送給Spider處理。
Spider處理Response并返回爬取到的Item及新的Request給Engine。
Engine將爬取到的Item給Item Pipeline,然后將Request給Scheduler。
從第一步開始重復這個流程,直到Scheduler中沒有更多的URLs。
架構就是這樣,流程和我第二篇里介紹的迷你架構差不多,但擴展性非常強大。
入門 安裝scrapypip install scrapy創建項目
在開始爬取之前,您必須創建一個新的Scrapy項目。 進入您打算存儲代碼的目錄中,運行下列命令:
scrapy startproject tutorial
該命令將會創建包含下列內容的 tutorial 目錄:
tutorial/ scrapy.cfg # 項目的配置文件 tutorial/ # 該項目的python模塊。之后您將在此加入代碼 __init__.py items.py # 項目中的item文件 pipelines.py # 項目中的pipelines文件 settings.py # 項目的設置文件 spiders/ # 放置spider代碼的目錄 __init__.py編寫第一個爬蟲
Spider是用戶編寫用于從單個網站(或者一些網站)爬取數據的類。其包含了一個用于下載的初始URL,以及如何跟進網頁中的鏈接以及如何分析頁面中的內容的方法。
以下為我們的第一個Spider代碼,保存在 tutorial/spiders 目錄下的 quotes_spider.py文件中:
import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" def start_requests(self): urls = [ "http://quotes.toscrape.com/page/1/", "http://quotes.toscrape.com/page/2/", ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): page = response.url.split("/")[-2] filename = "quotes-%s.html" % page with open(filename, "wb") as f: f.write(response.body) self.log("Saved file %s" % filename)
為了創建一個Spider,你必須繼承 scrapy.Spider 類, 且定義以下三個屬性:
name: 用于區別Spider。 該名字必須是唯一的,您不可以為不同的Spider設定相同的名字。
start_urls: 包含了Spider在啟動時進行爬取的url列表。 因此,第一個被獲取到的頁面將是其中之一。 后續的URL則從初始的URL獲取到的數據中提取。
parse() 是spider的一個方法。 被調用時,每個初始URL完成下載后生成的Response 對象將會作為唯一的參數傳遞給該函數。 該方法負責解析返回的數據(response data),提取數據以及生成需要進一步處理的URL的 Request 對象。
進入項目的根目錄,執行下列命令啟動spider:
scrapy s crawl quotes
這個命令啟動用于爬取 quotes.toscrape.com 的spider,你將得到類似的輸出:
2017-05-10 20:36:17 [scrapy.core.engine] INFO: Spider opened 2017-05-10 20:36:17 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2017-05-10 20:36:17 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023 2017-05-10 20:36:17 [scrapy.core.engine] DEBUG: Crawled (404)提取數據(referer: None) 2017-05-10 20:36:17 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None) 2017-05-10 20:36:17 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None) 2017-05-10 20:36:17 [quotes] DEBUG: Saved file quotes-1.html 2017-05-10 20:36:17 [quotes] DEBUG: Saved file quotes-2.html 2017-05-10 20:36:17 [scrapy.core.engine] INFO: Closing spider (finished)
我們之前只是保存了HTML頁面,并沒有提取數據。現在升級一下代碼,把提取功能加進去。至于如何使用瀏覽器的開發者模式分析網頁,之前已經介紹過了。
import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" start_urls = [ "http://quotes.toscrape.com/page/1/", "http://quotes.toscrape.com/page/2/", ] def parse(self, response): for quote in response.css("div.quote"): yield { "text": quote.css("span.text::text").extract_first(), "author": quote.css("small.author::text").extract_first(), "tags": quote.css("div.tags a.tag::text").extract(), }
再次運行這個爬蟲,你將在日志里看到被提取出的數據:
2017-05-10 20:38:33 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/1/> {"tags": ["life", "love"], "author": "André Gide", "text": "“It is better to be hated for what you are than to be loved for what you are not.”"} 2017-05-10 20:38:33 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/1/> {"tags": ["edison", "failure", "inspirational", "paraphrased"], "author": "Thomas A. Edison", "text": "“I have not failed. I"ve just found 10,000 ways that won"t work.”"}保存爬取的數據
最簡單存儲爬取的數據的方式是使用 Feed exports:
scrapy crawl quotes -o quotes.json
該命令將采用 JSON 格式對爬取的數據進行序列化,生成quotes.json文件。
Pyspider 架構簡介pyspider的架構主要分為 scheduler(調度器), fetcher(抓取器), processor(腳本執行):
各個組件間使用消息隊列連接,除了scheduler是單點的,fetcher 和 processor 都是可以多實例分布式部署的。 scheduler 負責整體的調度控制
任務由 scheduler 發起調度,fetcher 抓取網頁內容, processor 執行預先編寫的python腳本,輸出結果或產生新的提鏈任務(發往 scheduler),形成閉環。
每個腳本可以靈活使用各種python庫對頁面進行解析,使用框架API控制下一步抓取動作,通過設置回調控制解析動作。
入門抓取電影的相關信息
安裝pip install pyspider啟動
pyspider
運行成功后用瀏覽器打開http://localhost:5000/訪問控制臺
選取url既然我們要爬所有的電影,首先我們需要抓一個電影列表,一個好的列表應該:
包含足夠多的電影的 URL
通過翻頁,可以遍歷到所有的電影
一個按照更新時間排序的列表,可以更快抓到最新更新的電影
我們在 http://movie.douban.com/ 掃了一遍,發現并沒有一個列表能包含所有電影,只能退而求其次,通過抓取分類下的所有的標簽列表頁,來遍歷所有的電影: http://movie.douban.com/tag/
創建項目在 pyspider 的 dashboard 的右下角,點擊 “Create” 按鈕
替換 on_start 函數的 self.crawl 的 URL:
@every(minutes=24 * 60) def on_start(self): self.crawl("http://movie.douban.com/tag/", callback=self.index_page)
self.crawl 告訴 pyspider 抓取指定頁面,然后使用 callback 函數對結果進行解析。
@every 修飾器,表示 on_start 每天會執行一次,這樣就能抓到最新的電影了。
點擊綠色的 run 執行,你會看到 follows 上面有一個紅色的 1,切換到 follows 面板,點擊綠色的播放按鈕:
Tag 列表頁在 tag 列表頁 中,我們需要提取出所有的 電影列表頁 的 URL。你可能已經發現了,sample handler 已經提取了非常多大的 URL,所有,一種可行的提取列表頁 URL 的方法就是用正則從中過濾出來:
import re ... @config(age=10 * 24 * 60 * 60) def index_page(self, response): for each in response.doc("a[href^="http"]").items(): if re.match("http://movie.douban.com/tag/w+", each.attr.href, re.U): self.crawl(each.attr.href, callback=self.list_page)
由于 電影列表頁和 tag列表頁長的并不一樣,在這里新建了一個 callback 為 self.list_page
@config(age=10 24 60 * 60) 在這表示我們認為 10 天內頁面有效,不會再次進行更新抓取
由于 pyspider 是純 Python 環境,你可以使用 Python 強大的內置庫,或者你熟悉的第三方庫對頁面進行解析。不過更推薦使用 CSS選擇器
電影列表頁再次點擊 run 讓我們進入一個電影列表頁(list_page)。在這個頁面中我們需要提取:
電影的鏈接,例如,http://movie.douban.com/subje...
下一頁的鏈接,用來翻頁
CSS Selector Helper在 pyspider 中,還內置了一個 CSS Selector Helper,當你點擊頁面上的元素的時候,可以幫你生成它的 CSS選擇器 表達式。你可以點擊 Enable CSS selector helper 按鈕,然后切換到 web 頁面:
開啟后,鼠標放在元素上,會被黃色高亮,點擊后,所有擁有相同 CSS選擇器 表達式的元素會被高亮。表達式會被插入到 python 代碼當前光標位置。創建下面的代碼,將光標停留在單引號中間:
def list_page(self, response): for each in response.doc("").items():
點擊一個電影的鏈接,CSS選擇器 表達式將會插入到你的代碼中,如此重復,插入翻頁的鏈接:
def list_page(self, response): for each in response.doc("HTML>BODY>DIV#wrapper>DIV#content>DIV.grid-16-8.clearfix>DIV.article>DIV>TABLE TR.item>TD>DIV.pl2>A").items(): self.crawl(each.attr.href, callback=self.detail_page) # 翻頁 for each in response.doc("HTML>BODY>DIV#wrapper>DIV#content>DIV.grid-16-8.clearfix>DIV.article>DIV.paginator>A").items(): self.crawl(each.attr.href, callback=self.list_page)
翻頁是一個到自己的 callback 回調電影詳情頁
再次點擊 run,follow 到詳情頁。使用 css selector helper 分別添加電影標題,打分和導演:
def detail_page(self, response): return { "url": response.url, "title": response.doc("HTML>BODY>DIV#wrapper>DIV#content>H1>SPAN").text(), "rating": response.doc("HTML>BODY>DIV#wrapper>DIV#content>DIV.grid-16-8.clearfix>DIV.article>DIV.indent.clearfix>DIV.subjectwrap.clearfix>DIV#interest_sectl>DIV.rating_wrap.clearbox>P.rating_self.clearfix>STRONG.ll.rating_num").text(), "導演": [x.text() for x in response.doc("a[rel="v:directedBy"]").items()], }開始抓取
使用 run 單步調試你的代碼,對于用一個 callback 最好使用多個頁面類型進行測試。然后保存。
回到 Dashboard,找到你的項目
將 status 修改為 DEBUG 或 RUNNING
按 run 按鈕
反反爬蟲技術越來越多的網站具有反爬蟲特性,有的用圖片隱藏關鍵數據,有的使用反人類的驗證碼等
爬蟲:
爬蟲的根本就是得到一個網頁的源代碼數據。更深入一些,就會出現和網頁進行POST交互從而獲取服務器接收POST請求后返回的數據!總結:爬蟲就是由計算機自動與服務器交互獲取數據的工具。(爬蟲請注意網站的Robot.txt文件!不要讓爬蟲違法!也不要讓爬蟲對網站造成傷害!)
反爬及反反爬概念:
基于服務器資源,保護數據等,很多網站是限制了爬蟲效果。那么由人來充當爬蟲的角色時,我們怎么獲取網頁源代碼?大部分都是右鍵源文件。那么有些網站屏蔽了右鍵,又該怎么辦?基本常識,當然是按我們的F12了
在把人當作爬蟲時,網頁屏蔽右鍵就是反爬取措施,F12就是我們反反爬取的方式!
網站: https://github.com/luyishisi/...
例子例子在
https://pan.baidu.com/disk/ho...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/116902.html
摘要:楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數據提供網站數據采集和爬蟲軟件定制開發服務,服務范圍涵蓋社交網絡電子商務分類信息學術研究等。 楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數據結構、語法...
摘要:開始爬蟲之旅本文章屬于爬蟲入門到精通系統教程第一講引言我經常會看到有人在知乎上提問如何入門爬蟲爬蟲進階利用爬蟲技術能做到哪些很酷很有趣很有用的事情等這一些問題,我寫這一系列的文章的目的就是把我的經驗告訴大家。 開始爬蟲之旅 本文章屬于爬蟲入門到精通系統教程第一講 引言 我經常會看到有人在知乎上提問如何入門 Python 爬蟲?、Python 爬蟲進階?、利用爬蟲技術能做到哪些很酷很有趣...
摘要:想辦法區分爬蟲程序和正常的用戶。爬蟲是工具性程序,對速度和效率要求較高。生態圈完善,是最大對手。最要命的是爬蟲需要經常修改部分代碼。爬蟲分類通用爬蟲也就是百度搜狐等搜索引擎。原本是為測試來測試網站的,后來成了爬蟲工程師最喜愛的工具。 一、爬蟲的基本知識: 1. 什么是爬蟲 爬蟲的英文翻譯為spider或者crawder,意為蜘蛛或者爬行者,從字面意思我們可以體會到:爬蟲就是把自己當做蜘...
摘要:目錄基于的爬蟲入門環境搭建基于的爬蟲入門頁面提取基于的爬蟲入門圖片處理下面創建一個爬蟲項目,以圖蟲網為例抓取圖片。 目錄 基于 Python 的 Scrapy 爬蟲入門:環境搭建 基于 Python 的 Scrapy 爬蟲入門:頁面提取 基于 Python 的 Scrapy 爬蟲入門:圖片處理 下面創建一個爬蟲項目,以圖蟲網為例抓取圖片。 一、內容分析 打開 圖蟲網,頂部菜單發現...
閱讀 1747·2023-04-25 16:28
閱讀 683·2021-11-23 09:51
閱讀 1467·2019-08-30 15:54
閱讀 1148·2019-08-30 15:53
閱讀 2815·2019-08-30 15:53
閱讀 3412·2019-08-30 15:43
閱讀 3249·2019-08-30 11:18
閱讀 3260·2019-08-26 10:25