《Learning Scrapy》(中文版)第1章 Scrapy介紹

看完書可以看看這兩則面試招聘:
面試:5萬字近百頁,數(shù)據(jù)科學面試終極指南
招聘·OPPO高級爬蟲架構(gòu)師


序言
第1章 Scrapy介紹
第2章 理解HTML和XPath
第3章 爬蟲基礎(chǔ)
第4章 從Scrapy到移動應(yīng)用
第5章 快速構(gòu)建爬蟲
第6章 Scrapinghub部署
第7章 配置和管理
第8章 Scrapy編程
第9章 使用Pipeline
第10章 理解Scrapy的性能
第11章(完) Scrapyd分布式抓取和實時分析


本書作者使用的Scrapy版本是1.0.3。感興趣的話,還可以看看Scrapy1.4最新官方文檔總結(jié)。



下載本書代碼:https://github.com/scalingexcellence/scrapybook。
下載本書PDF(英文版):http://file.allitebooks.com/20160330/Learning%20Scrapy.pdf


歡迎來到Scrapy之旅。通過這本書,我們希望你可以從只會一點或零基礎(chǔ)的初學者,達到熟練使用這個強大的框架海量抓取網(wǎng)絡(luò)和其他資源的水平。在本章里,我們會向你介紹Scrapy,以及Scrapy能做什么。

HelloScrapy

Scrapy是一個健壯的抓取網(wǎng)絡(luò)資源的框架。作為互聯(lián)網(wǎng)使用者,你可能經(jīng)常希望可以將網(wǎng)上的資源保存到Excel中(見第3章),以便離線時使用或進行計算。作為開發(fā)者,你可能經(jīng)常希望將不同網(wǎng)站的資源整合起來,但你清楚這么做的復(fù)雜性。Scrapy可以幫助你完成簡單和復(fù)雜的數(shù)據(jù)提取。

Scrapy是利用健壯高效的方式提取網(wǎng)絡(luò)資源的多年經(jīng)驗開發(fā)的。使用Scrapy,你只需進行一項設(shè)置,就可以抵過其它框架使用多個類、插件和配置??匆谎鄣?章,你就可以知道僅需幾行代碼就可以完成大量工作。

從開發(fā)者的角度,你會喜歡Scrapy的基于事件的架構(gòu)(見第8章和第9章)。它可以讓我們進行串聯(lián)操作,清洗、形成、豐富數(shù)據(jù),或存入數(shù)據(jù)庫等等,同時不會有太大的性能損耗。從技術(shù)上說,基于事件的機制,Scrapy可以讓吞吐量擺脫延遲,同時開放數(shù)千個連接。舉一個極端的例子,假設(shè)你要從一個網(wǎng)站提取列表,每頁有100個列表項。Scrapy可以輕松的同時處理16個請求,假設(shè)每個請求在一秒內(nèi)完成,每秒就可以抓取16個頁面。乘以每頁的列表數(shù),每秒就可以抓取1600個列表項。然后,你想將每個列表項寫入一個高并發(fā)的云存儲,每個要花3秒。為了支持每秒16個請求,必須要并行進行4800個寫入請求(第9章你會看到更多類似的計算)。對于傳統(tǒng)的多線程應(yīng)用,這需要4800個線程,對你和操作系統(tǒng)都是個挑戰(zhàn)。在Scrapy中,4800個并發(fā)請求很平常,只要操作系統(tǒng)支持就行。更進一步,Scrapy的內(nèi)存要求和你要抓取的列表項的數(shù)據(jù)量相關(guān),而對于多線程應(yīng)用,每個線程的大小都和一個列表的大小相當。

簡而言之,速度慢或不可預(yù)測的網(wǎng)站、數(shù)據(jù)庫或遠程API不會對Scrapy的性能造成影響,因為你可以進行并發(fā)請求,用單線程管理。相比于多線程應(yīng)用,使用更簡單的代碼反而可以同時運行幾個抓取器和其它應(yīng)用,這樣就可以降低費用。

喜愛Scrapy的其它理由

Scrapy出現(xiàn)已經(jīng)有五年多了,現(xiàn)在已經(jīng)成熟穩(wěn)定。除了前面提到的性能的優(yōu)點,以下是Scrapy其它讓人喜愛的理由:

  • Scrapy可以讀懂破損的HTML

你可以在Scrapy上直接使用BeautifulSoup或lxml,但Scrapy提供Selector,一個相比lxml更高級的XPath解析器。它可以有效的處理破損的HTML代碼和費解的編碼。

  • 社區(qū)

Scrapy有一個活躍的社區(qū)??梢圆榭碨crapy的郵件列表https://groups.google.com/forum/#!forum/scrapy-users和Stack Overflow上的數(shù)千個問題http://stackoverflow.com/questions/tagged/scrapy。多數(shù)問題在數(shù)分鐘之內(nèi)就會得到解答。http://scrapy.org/community/有更多的社區(qū)資源。

  • 由社區(qū)維護的組織清晰的代碼

Scrapy需要用標準的方式組織代碼。你用Python來寫爬蟲和pipelines,就可以自動使引擎的效率提高。如果你在網(wǎng)上搜索,你會發(fā)現(xiàn)許多人有使用Scrapy的經(jīng)驗。這意味著,可以方便地找人幫你維護或擴展代碼。無論是誰加入你的團隊,都不必經(jīng)過學習曲線理解你特別的爬蟲。

  • 注重質(zhì)量的更新

如果查看版本記錄(http://doc.scrapy.org/en/latest/news.html),你會看到有不斷的更新和穩(wěn)定性/錯誤修正。

關(guān)于此書:目標和用法

對于此書,我們會用例子和真實的數(shù)據(jù)教你使用Scrapy。大多數(shù)章節(jié),要抓取的都是一個房屋租賃網(wǎng)站。我們選擇它的原因是,它很有代表性,并可以進行一定的變化,同時也很簡單。使用這個例子,可以讓我們專注于Scrapy。

我們會從抓取幾百頁開始,然后擴展到抓取50000頁。在這個過程中,我們會教你如何用Scrapy連接MySQL、Redis和Elasticsearch,使用Google geocoding API找到給定地點的坐標,向Apach Spark傳入數(shù)據(jù),預(yù)測影響價格的關(guān)鍵詞。

你可能需要多讀幾遍本書。你可以粗略地瀏覽一遍,了解一下結(jié)構(gòu),然后仔細讀一兩章、進行學習和試驗,然后再繼續(xù)讀。如果你對哪章熟悉的話,可以跳過。如果你熟悉HTML和XPath的話,就沒必要在第2章浪費太多時間。某些章如第8章,既是示例也是參考,具有一定深度。它就需要你多讀幾遍,每章之間進行數(shù)周的練習。如果沒有完全搞懂第8章的話,也可以讀第9章的具體應(yīng)用。后者可以幫你進一步理解概念。

我們已經(jīng)嘗試調(diào)整本書的結(jié)構(gòu),以讓其既有趣也容易上手。但我們做不到用這本書教給你如何使用Python。Python的書有很多,但我建議你在學習的過程中盡量保持放松。Python流行的原因之一是,它很簡潔,可以像讀英語一樣讀代碼。對于Python初學者和專家,Scrapy都是一個高級框架。你可以稱它為“Scrapy語言”。因此,我建議你直接從實例學習,如果你覺得Python語法有困難的話,再進行補充學習,可以是在線的Python教程或Coursera的初級課程。放心,就算不是Python專家,你也可以成為一個優(yōu)秀的Scrapy開發(fā)者。

掌握自動抓取數(shù)據(jù)的重要性

對于許多人,對Scrapy這樣的新技術(shù)有好奇心和滿足感,就是學習的動力。學習這個框架的同時,我們可以從數(shù)據(jù)開發(fā)和社區(qū),而不是代碼,獲得額外的好處。

開發(fā)高可靠高質(zhì)量的應(yīng)用 提供真實的開發(fā)進度表

為了開發(fā)新穎高質(zhì)量的應(yīng)用,我們需要真實和大量的數(shù)據(jù),如果可能的話,最好在寫代碼之前就有數(shù)據(jù)?,F(xiàn)在的軟件開發(fā)都要實時處理海量的瑕疵數(shù)據(jù),以獲取知識和洞察力。當軟件應(yīng)用到海量數(shù)據(jù)時,錯誤和疏忽很難檢測出來,就會造成后果嚴重的決策。例如,在進行人口統(tǒng)計時,很容易忽略一整個州,僅僅是因為這個州的名字太長,它的數(shù)據(jù)被丟棄了。通過細心的抓取,有高質(zhì)量的、海量的真實數(shù)據(jù),在開發(fā)和設(shè)計的過程中,就可以找到并修復(fù)bug,然后才能做出正確的決策。

另一個例子,假設(shè)你想設(shè)計一個類似亞馬遜的“如果你喜歡這個,你可能也喜歡那個”的推薦系統(tǒng)。如果在開始之前,你就能抓取手機真實的數(shù)據(jù),你就可以快速知道一些問題,比如無效記錄、打折商品、重復(fù)、無效字符、因為分布導(dǎo)致的性能問題。數(shù)據(jù)會強制你設(shè)計健壯的算法以處理被數(shù)千人搶購或無人問津的商品。相比較于數(shù)周開發(fā)之后卻碰到現(xiàn)實問題,這兩種方法可能最終會一致,但是在一開始就能對整個進程有所掌握,意義肯定是不同的。從數(shù)據(jù)開始,可以讓軟件的開發(fā)過程更為愉悅和有預(yù)測性。

快速開發(fā)最小化可行產(chǎn)品

海量真實數(shù)據(jù)對初創(chuàng)企業(yè)更為重要。你可能聽說過“精益初創(chuàng)企業(yè)”,這是Eric Ries發(fā)明的詞,用來描述高度不確定的企業(yè)發(fā)展階段,尤其是技術(shù)初創(chuàng)企業(yè)。它的核心概念之一就是最小化可行產(chǎn)品(MVP),一個只包含有限功能的產(chǎn)品,快速開發(fā)并投放,以檢測市場反應(yīng)、驗證商業(yè)假設(shè)。根據(jù)市場反應(yīng),初創(chuàng)企業(yè)可以選擇追加投資,或選擇其他更有希望的項目。

很容易忽略這個過程中的某些方面,這些方面和數(shù)據(jù)問題密切相關(guān),用Scrapy可以解決數(shù)據(jù)問題。當我們讓潛在用戶嘗試移動App時,例如,作為開發(fā)者或企業(yè)家,我們讓用戶來判斷完成的App功能如何。這可能對非專家的用戶有點困難。一個應(yīng)用只展示“產(chǎn)品1”、“產(chǎn)品2”、“用戶433”,和另一個應(yīng)用展示“Samsung UN55J6200 55-Inch TV”,用戶“Richard S.”給它打了五星評價,并且有鏈接可以直接打開商品主頁,這兩個應(yīng)用的差距是非常大的。很難讓人們對MVP進行客觀的評價,除非它使用的數(shù)據(jù)是真實可信的。

一些初創(chuàng)企業(yè)事后才想到數(shù)據(jù),是因為考慮到采集數(shù)據(jù)很貴。事實上,我們通常都是打開表格、屏幕、手動輸入數(shù)據(jù),或者我們可以用Scrapy抓取幾個網(wǎng)站,然后再開始寫代碼。第4章中,你可以看到如何快速創(chuàng)建一個移動App以使用數(shù)據(jù)。

網(wǎng)絡(luò)抓取讓你的應(yīng)用快速成長 —— Google不能使用表格

讓我們來看看表格是如何影響一個產(chǎn)品的。假如谷歌的創(chuàng)始人創(chuàng)建了搜索引擎的第一個版本,但要求每個網(wǎng)站站長填入信息,并復(fù)制粘貼他們的每個網(wǎng)頁的鏈接。他們?nèi)缓蠼邮芄雀璧膮f(xié)議,讓谷歌處理、存儲、呈現(xiàn)內(nèi)容,并進行收費。可以想象整個過程工作量巨大。即使市場有搜索引擎的需求,這個引擎也成為不了谷歌,因為它的成長太慢了。即使是最復(fù)雜的算法也不能抵消缺失數(shù)據(jù)。谷歌使用網(wǎng)絡(luò)爬蟲逐頁抓取,填充數(shù)據(jù)庫。站長完全不必做任何事。實際上,想屏蔽谷歌,還需要做一番努力。

讓谷歌使用表格的主意有點搞笑,但是一個普通網(wǎng)站要用戶填多少表呢?登錄表單、列表表單、勾選表單等等。這些表單會如何遏制應(yīng)用的市場擴張?如果你足夠了解用戶,你會知道他們還會使用其它什么網(wǎng)站,或許已經(jīng)有了賬戶。例如,開發(fā)者可能有Stack Overflow和GitHub賬戶。經(jīng)過用戶同意,你能不能直接用這些賬戶就自動填入照片、介紹和最近的帖子呢?你能否對這些帖子做文本分析,根據(jù)結(jié)果設(shè)置網(wǎng)站的導(dǎo)航結(jié)構(gòu)、推薦商品或服務(wù)呢?我希望你能看到將表格換為自動數(shù)據(jù)抓取可以更好的為用戶服務(wù),使網(wǎng)站快速成長。

發(fā)現(xiàn)并實踐

抓取數(shù)據(jù)自然而然會讓你發(fā)現(xiàn)和思考你和被抓取目標的關(guān)系。當你抓取一個數(shù)據(jù)源時,自然會有一些問題:我相信他們的數(shù)據(jù)嗎?我相信提供數(shù)據(jù)的公司嗎?我應(yīng)該和它們正式商談合作嗎?我和他們有競爭嗎?從其他渠道獲得數(shù)據(jù)花費是多少?這些商業(yè)風險是必然存在的,但是抓取數(shù)據(jù)可以讓我們更早的知道,進行應(yīng)對。

你還想知道如何反饋給這些網(wǎng)站或社區(qū)?給他們免費流量,他們肯定很高興。另一方面,如果你的應(yīng)用不能提供價值,繼續(xù)合作的可能就會變小,除非找到另外合作的方式。通過從各種渠道獲得數(shù)據(jù),你可以開發(fā)對現(xiàn)有生態(tài)更友好的產(chǎn)品,甚至打敗舊產(chǎn)品?;蛘?,老產(chǎn)品能幫助你擴張,例如,你的應(yīng)用數(shù)據(jù)來自兩個或三個不同的生態(tài)圈,每個生態(tài)圈都有十萬名用戶,結(jié)合起來,你的應(yīng)用或許就能惠及三十萬人。假如你的初創(chuàng)企業(yè)結(jié)合了搖滾樂和T恤印刷行業(yè),就將兩個生態(tài)圈結(jié)合了起來,你和這兩個社區(qū)都可以得到擴張。

在充滿爬蟲的網(wǎng)絡(luò)世界做守法公民

開發(fā)爬蟲還有一些注意事項。不負責任的網(wǎng)絡(luò)抓取讓人不悅,有時甚至是犯罪。兩個最重要的要避免的就是拒絕訪問攻擊(DoS)和侵犯著作權(quán)。

對于第一個,普通訪問者每隔幾秒才訪問一個新頁面。爬蟲的話,每秒可能下載幾十個頁面。流量超過普通用戶的十倍。這會讓網(wǎng)站的擁有者不安。使用阻塞器降低流量,模仿普通用戶。檢測響應(yīng)時間,如果看到響應(yīng)時間增加,則降低抓取的強度。好消息是Scrapy提供了兩個現(xiàn)成的方法(見第7章)。

對于著作權(quán),可以查看網(wǎng)站的著作權(quán)信息,以確認什么可以抓取什么不能抓取。大多數(shù)站點允許你處理網(wǎng)站的信息,只要不復(fù)制并宣稱是你的。一個好的方法是在你請求中使用一個User-Agent字段,告訴網(wǎng)站你是誰,你想用他們的數(shù)據(jù)做什么。Scrapy請求默認使用你的BOT_NAME作為User-Agent。如果這是一個URL或名字,可以直接指向你的應(yīng)用,那么源網(wǎng)站的站長就可以訪問你的站點,并知道你用他的數(shù)據(jù)做什么。另一個重要的地方,允許站長可以禁止爬蟲訪問網(wǎng)站的某個區(qū)域。Scrapy提供了功能(RobotsTxtMiddleware),以尊重源網(wǎng)站列在robots.txt文件的意見(在http://www.google.com/robots.txt可以看到一個例子)。最后,最好提供可以讓站長提出拒絕抓取的方法。至少,可以讓他們很容易地找到你,并提出交涉。

每個國家的法律不同,我無意給出法律上的建議。如果你覺得需要的話,請尋求專業(yè)的法律建議。這適用于整本書的內(nèi)容。

Scrapy不是什么

最后,因為數(shù)據(jù)抓取和相關(guān)的名詞定義很模糊,或相互使用,很容易誤解Scrapy。我這里解釋一下,避免發(fā)生誤解。

Scrapy不是Apache Nutch,即它不是一個原生的網(wǎng)絡(luò)爬蟲。如果Scrapy訪問一個網(wǎng)站,它對網(wǎng)站一無所知,就不能抓取任何東西。Scrapy是用來抓取結(jié)構(gòu)化的信息,并需要手動設(shè)置XPath和CSS表達式。Apache Nutch會取得一個原生網(wǎng)頁并提取信息,例如關(guān)鍵詞。它更適合某些應(yīng)用,而不適合其它應(yīng)用。

Scrapy不是Apache Solr、Elasticsearch或Lucene;換句話說,它和搜索引擎無關(guān)。Scrapy不是用來給包含“愛因斯坦”的文檔尋找參考。你可以使用Scrapy抓取的數(shù)據(jù),并將它們插入到Solr或Elasticsearch,如第9章所示,但這只是使用Scrapy的一種途徑,而不是嵌入Scrapy的功能。

最后,Scrapy不是類似MySQL、MongoDB、Redis的數(shù)據(jù)庫。它不存儲和索引數(shù)據(jù)。它只是提取數(shù)據(jù)。也就是說,你需要將Scrapy提取的數(shù)據(jù)插入到數(shù)據(jù)庫中,可行的數(shù)據(jù)庫有多種。雖然Scrapy不是數(shù)據(jù)庫,它的結(jié)果可以方便地輸出為文件,或不進行輸出。

總結(jié)

在本章中,我們向你介紹了Scrapy以及它的作用,還有使用這本書的最優(yōu)方法。通過開發(fā)與市場完美結(jié)合的高質(zhì)量應(yīng)用,我們還介紹了幾種自動抓取數(shù)據(jù)能使你獲益的方法。下一章會介紹兩個極為重要的網(wǎng)絡(luò)語言,HTML和XPath,我們在每個Scrapy項目中都會用到。


序言
第1章 Scrapy介紹
第2章 理解HTML和XPath
第3章 爬蟲基礎(chǔ)
第4章 從Scrapy到移動應(yīng)用
第5章 快速構(gòu)建爬蟲
第6章 Scrapinghub部署
第7章 配置和管理
第8章 Scrapy編程
第9章 使用Pipeline
第10章 理解Scrapy的性能
第11章(完) Scrapyd分布式抓取和實時分析


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容