




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
LearningScrapy等己
瞬陶
?第1章Scrapy介紹
。HelloScrapy
。喜愛Scrapy的其它理由
。關(guān)于此書:目標和用法
。掌握自動抓取數(shù)據(jù)的重要性
。開發(fā)高可靠高質(zhì)量的應(yīng)用提供真實的開發(fā)進度表
。快速開發(fā)最小化可行產(chǎn)品
。網(wǎng)絡(luò)抓取讓你的應(yīng)用快速成長一一Google不能使用表格
。發(fā)現(xiàn)并實踐
。在充滿爬蟲的網(wǎng)絡(luò)世界做守法公民
。Scrapy不是什么
??偨Y(jié)
?第2章理解HTML和XPath
。HTML、DOM樹結(jié)構(gòu)和XPath
。HTML文檔
。樹結(jié)構(gòu)
。瀏覽器中的頁面
。使用Chrome瀏覽器獲得XPath表達式
。常見工作
。提前應(yīng)對網(wǎng)頁發(fā)生改變
??偨Y(jié)
?第3章爬蟲基礎(chǔ)
°安裝Scrapy
。UR2IM一一基礎(chǔ)抓取過程
。編寫爬蟲
?第4章從Scrapy到移動應(yīng)用
。選擇移動應(yīng)用框架
。創(chuàng)建數(shù)據(jù)庫和集合
。用Scrapy導(dǎo)入數(shù)據(jù)
。創(chuàng)建移動應(yīng)用
。創(chuàng)建數(shù)據(jù)庫接入服務(wù)
。將數(shù)據(jù)映射到用戶界面
。映射數(shù)據(jù)字段和用戶組件
。測試、分享、生成app
??偨Y(jié)
?第5章快速構(gòu)建爬蟲
。一個具有登錄功能的爬蟲
。使用JSONAPIs和AJAX頁面的爬蟲
。在響應(yīng)間傳遞參數(shù)
。一個加速30?的項目爬蟲
??梢宰トxcel文件的爬蟲
??偨Y(jié)
?第6章Scrapinghub部署
。注冊、登錄、創(chuàng)建項目
。部署爬蟲并制定計劃
。訪問文件
。制定周期抓取
??偨Y(jié)
?第7章配置和管理
°使用Scrapy設(shè)置
?;驹O(shè)置
。案例1一一使用遠程登錄
。性能
。HTTP緩存和脫機工作
。案例2一—用緩存離線工作
。抓取方式
。案例3—-下載圖片
。亞馬遜網(wǎng)絡(luò)服務(wù)
。案例4一一使用代理和Crawlera的智慧代理
。更多的設(shè)置
。和項目相關(guān)的設(shè)定
。擴展Scrapy設(shè)置
。微調(diào)下載
。自動限定擴展設(shè)置
。內(nèi)存使用擴展設(shè)置
。登錄和調(diào)試
??偨Y(jié)
?第8章Scrapy編程
。Scrapy是一個Twisted應(yīng)用
。延遲項和延遲鏈
。理解Twisted和非阻塞I/OPython的故事
。Scrapy架構(gòu)概要
。案例1一個簡單的pipeline
。信號
。案例2一—一個可以測量吞吐量和延遲的擴展
。進一步擴展中間件
??偨Y(jié)
?第9章使用Pipelines
。使用RESTAPIs
。使用treq
。一個寫入日asticsearch的pipeline
。pipeline使用GoogleGeocodingAPI進行地理編碼
。在Elasticsearch進行地理索引
。連接數(shù)據(jù)庫與Python客戶端
。用pipeline寫入MySQL
。使用R/isted特定客戶端連接服務(wù)
。用pipeline讀寫Redis
。連接CPU密集型、阻塞或舊方法
。pipeline進行CPU密集型和阻塞操作
。pipeline使用二進制和腳本
??偨Y(jié)
?第10章理解Scrapy的性能
。Scrapy的引擎一一一個直觀的方法
。串聯(lián)排隊系統(tǒng)
。確認瓶頸
。Scrapy的性能模型
。使用遠程登錄控制組件
。評分系統(tǒng)
。標準性能模型
。解決性能問題
。實例1一一CPU滿負荷
。實例2?阻塞代碼
。實例3-下裁器中有“垃圾”
。實例4-大量響應(yīng)造成溢出
。實例5?item并發(fā)受限/過量造成溢出
。實例6-下載器沒有充分運行
。解決問題的流程
??偨Y(jié)
?第11章Scrapyd分布式抓取和實時分析
。房子的標題如何影響價格?
。Scrapyd
。分布式系統(tǒng)概述
。修改爬蟲和中間件
。抓取共享首頁
。批次抓取URL
。從settings啟動URL
。將項目部署到scrapyd服務(wù)器
。創(chuàng)建自定義監(jiān)視命令
。用ApacheSparkstreaming計算偏移值
。進行分布式抓取
。系統(tǒng)性能
。要點
第1章Scrapy介紹
歡迎來到Scrapy之旅。通過這本書,我們希望你可以從只會一點或零基礎(chǔ)的初學(xué)者,達到熟練使
用這個強大的框架海量抓取網(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不會對Scmpy的性能造成影響,因為你
可以進行并發(fā)請求,用單線程管理。相比于多線程應(yīng)用,使用更簡單的代碼反而可以同時運行幾
個抓取器和其它應(yīng)用,這樣就可以降低費用。
喜愛Scrapy的其它理由
Scrapy出現(xiàn)已經(jīng)有五年多了,現(xiàn)在已經(jīng)成熟穩(wěn)定。除了前面提到的性能的優(yōu)點,以下是Scrapy其
它讓人喜愛的理由:
?Scrapy可以讀懂破損的HTML
你可以在Scrapy上直接使用BeautifulSoup或Ixml,但Scrapy提供Selector,一個相比Ixml更高級
的XPath解析器。它可以有效的處理破損的HTML代碼和費解的編碼。
?社區(qū)
Scrapy有一個活躍的社區(qū)。可以查看Scrapy的郵件列表https:〃/forum/#!foru
m/scrapy-users?OStackOverflow上的數(shù)千個I句題http://stackoverflow.eom/questions/tagged/s
crapyo多數(shù)問題在數(shù)分鐘之內(nèi)就會得到解答。http:〃/community/有更多的社區(qū)資
源。
?由社區(qū)維護的組織清晰的代碼
Scrapy需要用標準的方式組織代碼。你用Python來寫爬蟲和pipelines,就可以自動使引擎的效率
提高。如果你在網(wǎng)上搜索,你會發(fā)現(xiàn)許多人有使用Scrapy的經(jīng)驗。這意味著,可以方便地找人幫
你維護或擴展代碼。無論是誰加入你的團隊,都不必經(jīng)過學(xué)習(xí)曲線理解你特別的爬蟲。
?注重質(zhì)量的更新
如果查看版本記錄(http:〃/en/latest/news.html),你會看到有不斷的更新和穩(wěn)
定性/錯誤修正。
關(guān)于此書:目標和用法
對于此書,我們會用例子和真實的數(shù)據(jù)教你使用Scrapy。大多數(shù)章節(jié),要抓取的都是一個房屋租
賃網(wǎng)站。我們選擇它的原因是,它很有代表性,并可以進行一定的變化,同時也很簡單。使用這
個例子,可以讓我們專注于Scrapy。
我們會從抓取幾百頁開始,然后擴展到抓取50000頁。在這個過程中,我們會教你如何用Scrapy
連接MySQL、Redis和Elasticsearch,使用GooglegeocodingAPI找到給定地點的坐標,向
ApachSpark傳入數(shù)據(jù),預(yù)測膨響價格的關(guān)鍵詞。
你可能需要多讀幾遍本書。你可以粗略地瀏覽一遍,了解一下結(jié)構(gòu),然后仔細讀一兩章、進行學(xué)
習(xí)和試驗,然后再繼續(xù)讀。如果你對哪章熟悉的話,可以跳過。如果你熟悉HTML和XPath的
話,就沒必要在第2章浪費太多時間。某些章如第8章,既是示例也是參考,具有一定深度。它就
需要你多讀幾遍,每章之間進行數(shù)周的練習(xí)。如果沒有完全搞懂第8章的話,也可以讀第9章的具
體應(yīng)用。后者可以幫你進一步理解概念。
我們已經(jīng)嘗試調(diào)整本書的結(jié)構(gòu),以讓其既有趣也容易上手。但我們做不到用這本書教給你如何使
用Python。Python的書有很多,但我建議你在學(xué)習(xí)的過程中盡量保持放松。Python流行的原因
之一是,它很簡潔,可以像讀英語一樣讀代碼。對于Python初學(xué)者和專家,Scrapy都是一個高級
框架。你可以稱它為“Scrapy語言”.因此,我建議你直接從實例學(xué)習(xí),如果你覺得Python語法有
困難的話,再進行補充學(xué)習(xí),可以是在線的Python教程或Coursera的初級課程。放心,就算不是
Python專家,你也可以成為一個優(yōu)秀的Scrapy開發(fā)者。
掌握自動抓取數(shù)據(jù)的重要性
對于許多人,對Scrapy這樣的新技術(shù)有好奇心和滿足感,就是學(xué)習(xí)的動力。學(xué)習(xí)這個框架的同
時,我們可以從數(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è)”,這是EricRies發(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)用展示“SamsungUN55J620055-lnchTV",用戶"RichardS.”給它打了五星
評價,并且有鏈接可以直接打開商品主頁,這兩個應(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ā)者可能有StackOverflow和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.Agente如果這是一個URL或名字,可以直接指向你的應(yīng)用,那么源網(wǎng)站的站長就可以訪問
你的站點,并知道你用他的數(shù)據(jù)做什么。另一個重要的地方,允許站長可以禁止爬蟲訪問網(wǎng)站的
某個區(qū)域。Scrapy提供了功能(RobotsTxtMiddleware),以尊重源網(wǎng)站列在robots.txt文件的意
見(在http:〃/robots.txt可以看到一個例子)。最后,最好提供可以讓站長提出
拒絕抓取的方法。至少,可以讓他們很容易地找到你,并提出交涉。
每個國家的法律不同,我無意給出法律上的建議。如果你覺得需要的話,請尋求專業(yè)的法律建
議。這適用于整本書的內(nèi)容。
Scrapy不是什么
最后,因為數(shù)據(jù)抓取和相關(guān)的名詞定義很模糊,或相互使用,很容易誤解Scrapy。我這里解釋一
下,避免發(fā)生誤解。
Scrapy不是ApacheNutch,即它不是一個原生的網(wǎng)絡(luò)爬蟲。如果Scrapy訪問一個網(wǎng)站,它對網(wǎng)
站一無所知,就不能抓取任何東西。Scrapy是用來抓取結(jié)構(gòu)化的信息,并需要手動設(shè)置XPath和
CSS表達式。ApacheNutch會取得一個原生網(wǎng)頁并提取信息,例如關(guān)鍵詞。它更適合某些應(yīng)
用,而不適合其它應(yīng)用。
Scrapy不是ApacheSolr、Elasticsearch或Lucene;換句話說,它和搜索引擎無關(guān)。Scrapy不是
用來給包含“浸因斯坦”的文檔尋找參考。你可以使用Scrapy抓取的數(shù)據(jù),并將它們插入到Solr或
日asticsearch,如第9章所示,但這只是使用Scrapy的一種途徑,而不是嵌入Scrapy的功能。
最后,Scrapy不是類似MySQL、MongoDB.Redis的數(shù)據(jù)庫。它不存儲和索引數(shù)據(jù)。它只是提
取數(shù)據(jù)。也就是說,你需要將Scrapy提取的數(shù)據(jù)插入到數(shù)據(jù)庫中,可行的數(shù)據(jù)庫有多種。雖然
Scrapy不是數(shù)據(jù)庫,它的結(jié)果可以方便地輸出為文件,或不進行輸出。
在本章中,我們向你介紹了Scrapy以及它的作用,還有使用這本書的最優(yōu)方法。通過開發(fā)與市場
完美結(jié)合的高質(zhì)量應(yīng)用,我們還介紹了幾種自動抓取數(shù)據(jù)能使你獲益的方法。下一章會介紹兩個
極為重要的網(wǎng)絡(luò)語言,HTML和XPath,我們在每個Scrapy項目中都會用到。
第2章理解HTML和XPath
為了從網(wǎng)頁提取信息,了解網(wǎng)頁的結(jié)構(gòu)是非常必要的。我們會快速學(xué)習(xí)HTML、HTML的樹結(jié)構(gòu)
和用來篩選網(wǎng)頁信息的XPath。
HTML、DOM樹結(jié)構(gòu)和XPath
從這本書的角度,鍵入網(wǎng)址到看見網(wǎng)頁的整個過程可以分成四步:
?在瀏覽器中輸入網(wǎng)址URL。URL的第一部分也即域名(例如),用來搜尋網(wǎng)絡(luò)
上的服務(wù)器。URL和其他像cookies等數(shù)據(jù)形成了一個發(fā)送到服務(wù)器的請求request。
?服務(wù)器向瀏覽器發(fā)送HTML。服務(wù)器也可能發(fā)送XML或JSON等其他格式,目前我們只關(guān)注
HTML。
?HTML在瀏覽器內(nèi)部轉(zhuǎn)化成樹結(jié)構(gòu):文檔對象模型(DOM)o
?根據(jù)布局規(guī)范,樹結(jié)構(gòu)轉(zhuǎn)化成屏幕上的真實頁面.
1.AURL:
4.whatweseeinthescreen
3.Atreerepresentation
insideabrowseronchrome...
2.AnHTMLdocument
ExamoleDomain
-Example?2.*de*1c?bro"?r--
OoMfn
iana.or^Z
inforMtiOfl..
41v??
研究下這四個步驟和樹結(jié)構(gòu),可以幫助定位要抓取的文本和編寫爬蟲。
URL
URL包括兩部分:第一部分通過DNS定位服務(wù)器,例如當你在瀏覽器輸入https:〃mail.google.co
m/mail/u/0/#inbox這個地址時,產(chǎn)生了一個的DNS請求,后者為你解析了一臺
服務(wù)器的IP地址,例如3。也就是說,https:〃mail.google.eom/mail/u/0/#inbox轉(zhuǎn)換
0cT3/mail/u/0/#inboxo
URL其余的部分告訴服務(wù)器這個請求具體是關(guān)于什么的,可能是一張圖片、一份文檔或是觸發(fā)一
個動作,例如在服務(wù)器上發(fā)送一封郵件。
HTML文檔
服務(wù)器讀取URL,了解用戶請求,然后回復(fù)一個HTML文檔。HTML本質(zhì)是一個文本文件,可以
用IbxtMate、Notepadxvi或Emacs等軟件打開。與大多數(shù)文本文件不同,HTML嚴格遵循萬維
網(wǎng)聯(lián)盟(WorldWideWebConsortium)的規(guī)定格式。這個格式超出了本書的范崎,這里只看一
個簡單的HTML頁面。如果你打開http:〃,點擊查看源代碼,就可以看到HTML代
碼,如下所示:
<Idoctypehtml>
<html>
<head>
<title>ExampleDomain</title>
<metacharset?"utf-8"/>
<metahttp-equiv?"Content-typeM
contenta^text/html;charset=utf-8M/>
<metanames"viewport"content=Mwidth=device-width,
initial-scale=l*/>
<styletype=Mtext/css">body{background-color:…
}</style>
<body>
<div>
<hl>ExampleDo<nain</hl>
<p>Thisdomainisestablishedtobeusedfor
illustrativeexamplesexamplesindocuments.
Youmayusethisdomaininexampleswithout
priorcoordinationoraskingforpermission.</p>
<pxahref=Mhttp://www./domains/example">
Moreinformation...</ax/p>
</div>
</body>
</html>
為了便于閱讀,我美化了這個HTML文檔。你也可以把整篇文檔放在一行里。對于HTML,大多
數(shù)情況下,空格和換行符不會造成什么影響。
尖括號里的字符稱作標簽,例如或。是起始標簽,是結(jié)束標簽。標簽總是成對出現(xiàn)。某些網(wǎng)頁沒
有結(jié)束標簽,例如只用標簽分隔段落,瀏覽器對這種行為是容許的,會智能判斷哪里該有結(jié)束標
簽。
與之間的內(nèi)容稱作HTML的元素。元素之間可以嵌套元素,比如例子中的標簽,和第二個標簽,
后者包含了一個標簽。
有些標簽稍顯復(fù)雜,例如,帶有URL的href部分稱作屬性。
最后,許多標簽元素包含有文本,例如標簽中的ExampleDomain。對我們而言,標簽之間的可
見內(nèi)容更為重要。頭部標簽中指明了編碼字符,由Scrapy對其處理,就不用我們浪費精力了。
樹結(jié)構(gòu)
不同的瀏覽器有不同的借以呈現(xiàn)網(wǎng)頁的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。但DOM樹是跨平臺且不依賴語言的,可以
被幾乎所有瀏覽器支持。
只需右鍵點擊,選擇查看元素,就可以在瀏覽器中查看網(wǎng)頁的樹結(jié)構(gòu)。如果這項功能被禁止了,
可以在選項的開發(fā)者工具中修改。
你看到的樹結(jié)構(gòu)和HTML很像,但不完全相同。無論原始HTML文件使用了多少空格和換行符,
樹結(jié)構(gòu)看起來都會是一樣的。你可以點擊任意元素,或是改變屬性,這樣可以實時看到對HTML
網(wǎng)頁產(chǎn)生了什么變化。例如,如果你雙擊了一段文字,并修改了它,然后點擊回車,屏幕上這段
文字就會根據(jù)新的設(shè)置發(fā)生改變。在右邊的方框中,在屬性標簽下面,你可以看到這個樹結(jié)構(gòu)的
屬性列表。在頁面底部,你可以看到一個面包屑路徑,指示著選中元素的所在位置。
*ElemennResourcesNetworkSourcesTWnefentProfilesAuditsConsole
?ComputedStyleShowinherited
?<ht?l>?Styles+/??
<title>EM?apleDoaain</titl??
??etahttp-?quiv?*Cottteftt-type"content*
"text/htal;ch?rset?utf-f>
<?etatwoe**viewport"contefit"?ccessKey:??
Mwidth?device-width?initlal-sc?le?l"??llQft:??
><styletyp??"text/csf>-</?tyle??attributes:N?aedNo<leM?p
</head>MseUAI:wtittp://eM??pU.ian?.org/w
chiItfEIcoentCouAt:3
<div>?childNotfes:Notf?List(7)
ItDOMlft?/lll>?children:HTMCoUcctlonOJ
?<p>-</p>?classList:OOMTokenList
▼<p>classNw:—
<?href>"http://MM./doaaiits/clientHeight:2M
exMpleM?Moreinforaation...</?>cllcntLeft:?
</p>cllefltTo0:?
</dtw?cUtntwitfth:657
</body>contentEtfit?Ole:?inherit"
</htal>?OCRStr
dir:—
*
重要的是記住,HTML是文本,而樹結(jié)構(gòu)是瀏覽器內(nèi)存中的一個對象,你可以通過程序查看、操
作這個對象。在Chrome瀏覽器中,就是通過開發(fā)者工具查看。
瀏覽器中的頁面
HTML文本和樹結(jié)構(gòu)和我們平時在瀏覽器中看到的頁面截然不同。這恰恰是HTML的成功之處。
HTML文件就是要具有可讀性,可以區(qū)分網(wǎng)頁的內(nèi)容,但不是按照呈現(xiàn)在屏幕上的方式。這意味
著,呈現(xiàn)HTML文檔、進行美化都是瀏覽器的職責,無論是對于功能齊備的Chrome、移動端瀏覽
器、還是Lynx這樣的文本瀏覽器。
也就是說,網(wǎng)頁的發(fā)展對網(wǎng)頁開發(fā)者和用戶都提出了極大的開發(fā)網(wǎng)頁方面的需求。CSS就是這樣
被發(fā)明出來,用以服務(wù)HTML元素。對于Scrapy,我們不涉及CSS。
既然如此,樹結(jié)構(gòu)對呈現(xiàn)出來的網(wǎng)頁有什么作用呢?答案就是盒模型。正如DOM樹可以包含其它
元素或是文字,同樣的,盒模型里面也可以內(nèi)嵌其它內(nèi)容。所以,我們在屏幕上看到的網(wǎng)頁是原
始HTML的二維呈現(xiàn)。樹結(jié)構(gòu)是其中的一維,但它是隱藏的。例如,在下圖中,我們看到三個
DOM元素,一個和兩個內(nèi)嵌的和,出現(xiàn)在瀏覽器和DOM中:
用XPath選擇HTML元素
如果你以前接觸過傳統(tǒng)的軟件工程,并不知道XPath,你可能會擔心,在HTML文檔中查詢某個
信息,要進行復(fù)雜的字符串匹配、搜索標簽、處理特殊字符、解析整個樹結(jié)構(gòu)等繁瑣工作。對于
XPath,所有的這些都不是問題,你可以輕松提取元素、屬性或是文字。
在Chrome中使用XPath,在開發(fā)者工具中點擊控制臺標簽,使用
c功能。例如,在網(wǎng)頁[力聞://example.com/](https://link.jianshu.cornet=http:/
x(7/h1,),就可以移動到元素,如截圖所示:
你在控制臺中看到的是一個包含所選元素的JavaScript數(shù)組。如果你將光標移動到這個數(shù)組上,
你可以看到被選擇的元素被高亮顯示。這個功能很有用。
XPath表達式
HTML文檔的層級結(jié)構(gòu)的最高級是標簽,你可以使用元素名和斜杠線選擇任意元素。例如,下面
的表達式返回了http:〃/上對應(yīng)的內(nèi)容:
$x('/html,)
(<html>...</html>]
JxC/html/body')
[<body>...</body>]
$x('/html/body/div*)
[<div>...</div>]
$x(*/html/body/div/hl,)
[<hl>ExampleDomain</hl>]
$x('/html/body/div/p*)
[<p>...</p>,<p>...</p>]
$x('/html/body/div/p[l]')
[<p>...</p>]
$x('/html/body/div/p[2]')
[<p>...</p>]
注意,標簽在標簽內(nèi)有兩個,所以會返回兩個。你可以用p[1]和p[2]分別返回兩個元素。
從抓取的角度,文檔的標題或許是唯一讓人感興趣的,它位于文檔的頭部,可以用下面的額表達
式找到:
[<title>ExampleDomain</title>]
對于大文檔,你可能要寫很長的XPath表達式,以獲取所要的內(nèi)容。為了避免這點,兩個斜杠線〃
可以讓你訪問到所有的同名元素。例如,〃p可以選擇所有的p元素,〃a可以選擇所有的鏈接。
$x(V/p')
[<p>..,</p>,<p>...</p>]
$x('//a')
[<ahref?"http://www.iana.org/domains/example,'>Moreinformation...</a>]
〃2可以用在更多的地方。例如,如果要找到所有標簽的鏈接,你可以使用〃div//a。如果a前面只
有一個斜杠,〃div/a會返回空,因為在上面的例子中標簽下面沒有。
$x(7/div//a')
[<ahref?"/domains/exampleM>Moreinformation...</a>]
$x(*//div/a*)
(]
你也可以選擇屬性。http:〃/上唯一的屬性是鏈接href,可以通過下面的方式找至!J:
$xC//a/^href')
[]
你也可以只通過text()函數(shù)選擇文字:
$x('//a/text(),)
["Moreinformation..
可以使用?標志選擇某層下所有的元素,例如:
$x(V/div/*J
[<hl>ExampleDomain</hl>,<p>...</p>,<p>...</p>]
尋找特定屬性,例如@class、或?qū)傩杂刑囟ㄖ禃r,你會發(fā)現(xiàn)XPath非常好用。例如,〃a陶href]可
以找到所有鏈接,〃a[@href="http:〃/domains/example。則進行了指定的選擇。
當屬性值中包含特定字符串時,XPath會極為方便。例如,
[<a>Moreinformation...</a>]
〃Q[Vrefm"http:/domains/exQmpLe"]')
[<ahref?"http://www.iana.org/domains/example">Moreinformation...</a>]
$x(1//a[contoins(^href,"iana")]')
[<ahref='*http://www.iana.org/domains/example">Moreinformation...</a>]
〃a[starts-with《靜ref,nhttp://www.")]f)
[<a>Moreinformation__</a>]
$x(*//a[not(contains(^nref,"abc"))]')
[<ahrefa"http://www.iana.org/domains/example">Moreinformation...</a>]
在http:〃/xsl/xsl_functions.asp在線文檔中你可以找到更多類似的函數(shù),但
并非都常用。
在Scrapy終端中可以使用同樣的命令,在命令行中輸入
scrapyshell"http://example.com"
終端會向你展示許多寫爬蟲時碰到的變量。其中最重要的是響應(yīng),在HTML中是HtmIResponse,
這個類可以讓你在Chrome使用xpath()方法$x。下面是一些例子:
response.xpath('/html').extract()
[u^htmlxheadxtitle)...</bodyx/html>*]
response.xpath('/html/body/div/hl').extract()
[u*<hl>ExampleDomain</hl>']
response.xpath('/html/body/div/p*),extract()
[u*<p>Thisdomain…permission.</p>',u'<pxahref="http:///domains
/example">Moreinformation...</ax/p>']
response.xpath('//html/head/title').extract()
[u'<title>ExampleDomain</title>']
response.xpath('//a*).extract()
[u*<ahref="http:///domains/example">Moreinformation...</a>*]
response.xpath('//a/0href').extract()
[u'http:〃www./domains/example']
response.xpath('//a/text()").extract。
[u'Moreinformation...']
response.xpath('//a[starts-with(^href,"http://www.")]").extract()
[u'<ahref="/domains/example*'>Moreinformation..,</a>*]
這意味著,你可用Chrome瀏覽器生成XPath表達式,以便在Scrapy爬蟲中使用。
使用Chrome瀏覽器獲得XPath表達式
Chrome瀏覽器可以幫助我們獲取XPath表達式這點確實對開發(fā)者非常友好。像之前演示的那樣檢
查一個元素:右鍵選擇一個元素,選擇檢查元素。開發(fā)者工具被打開,該元素在HTML的樹結(jié)構(gòu)
中被高亮顯示,可以在右鍵打開的菜單中選擇CopyXPath,表達式就復(fù)制到粘貼板中了。
你可以在控制臺中檢測表達式:
$x('/html/body/div/plZj/a')
[<ahref="http://www./domains/example">Moreinformation...</a>]
常見工作
下面展示一些XPath表達式的常見使用。先來看看在維基百科上是怎么使用的。維基百科的頁面
非常穩(wěn)定,不會在短時間內(nèi)改變排版。
?取得id為firstHeading的div下的span的text:
//hl[^id=',firstHeading"]/span/text()
?取得id為toe的div下的ul內(nèi)的URL:
//div[^id?"toc',]/ul//a/0href
?在任意class包含Itr和class包含skin?vector的元素之內(nèi),取得hi的text,這兩個字符串可能在
同一class內(nèi),或不在。
//?[contains(@class,"Itr")andcontains(^classj"skin-vector")]//hl//text()
實際應(yīng)用中,你會在XPath中頻繁地使用class。在這幾個例子中,你需要記住,因為CSS的板式
原因,你會看到HTML的元素總會包含許多特定的class屬性。這意味著,有的的class是link,其
他導(dǎo)航欄的的class就是linkactive。后者是當前生效的鏈接,因此是可見或是用CSS特殊色高亮
顯示的。當抓取的時候,你通常是對含有某個屬性的元素感興趣的,就像之前的link和link
activeoXPath的contains()函數(shù)就可以幫你選擇包含某一class的所有元素。
?選擇class屬性是infobox的table的第一張圖片的URL:
//table[^class?"infoboxM]//img[l]/^src
?選擇class屬性是reflist開頭的div下面的所有URL鏈接:
//div[starts-with(^class,Mreflist**)]//a/^href
?選擇div下面的所有URL鏈接,并且這個div的下一個相鄰元素的子元素包含文字
References:
//?[text()aHReferences"]/../following-sibling::div//a
?取得所有圖片的URL:
//img/0src
提前應(yīng)對網(wǎng)頁發(fā)生改變
爬取的目標常常位于遠程服務(wù)器。這意味著,如果它的HTML發(fā)生了改變,XPath表達式就無效
了,我們就不得不回過頭修改爬蟲的程序。因為網(wǎng)頁的改變一般就很少,爬蟲的改動往往不會很
大。然而,我們還是寧肯不要回頭修改。一些基本原則可以幫助我們降低表達式失效的概率:
?避免使用數(shù)組序號Chrome常常會在表達式中加入許多常數(shù)
//?[^id=Mmyid,,]/div/div/div[l]/div[2]/div/div[l]/div[l]/a/img
如果HTML上有一個廣告窗的話,就會改變文檔的結(jié)構(gòu),這個表達式就會失效。解決的方法是,
盡量找到離img標簽近的元素,根據(jù)該元素的id或class屬性,進行抓取,例如:
//div[0class=',thumbnail"]/a/img
?用class抓取效果不一定好使用class屬性可以方便的定位要抓取的元素,但是因為CSS也要
通過class修改頁面的外觀,所以class屬性可能會發(fā)生改變,例如下面用到的class:
//div[§class?HthumbnailN]/a/img
過一段時間之后,可能會變成:
//div[0class="previewgreenH]/a/img
?數(shù)據(jù)指向的class優(yōu)于排版指向的class
在上一個例子中,使用thumbnail和green兩個class都不好。thumbnail比green好,但這兩個
都不如departure-time。前面兩個是用來排版的,departure-time是有語義的,和div中的內(nèi)
容有關(guān)。所以,在排版發(fā)生改變的情況下,departure-time發(fā)生改變的可能性會比較小。應(yīng)
該說,網(wǎng)站作者在開發(fā)中十分清楚,為內(nèi)容設(shè)置有意義的、一致的標記,可以讓開發(fā)過程收
益。
?id通常是最可靠的
只要id具有語義并且數(shù)據(jù)相關(guān),id通常是抓取時最好的選擇。部分原因是,JavaScript和外鏈
錨點總是使用id獲取文檔中特定的部分。例如,下面的XPath非常可靠:
//?[^id="more_info"]//text()
相反的例子是,指向唯一參考的id,對抓取沒什么幫助,因為抓取總是希望能夠獲取具有某個特
點的所有信息。例如:
//[0id="order-F4982322-]
這是一個非常差的XPath表達式。還要記住,盡管id最好要有某種特點,但在許多HTML文檔中,
id都很雜亂無章。
總結(jié)
編程語言的不斷進化,使得創(chuàng)建可靠的XPath表達式從HTML抓取信息變得越來越容易。在本章
中,你學(xué)到了HTML和XPath的基本知識、如何利用Chrome自動獲取XPath表達式。你還學(xué)會了
如何手工寫XPath表達式,并區(qū)分可靠和不夠可靠的XPath表達式。第3章中,我們會用這些知識
來寫幾個爬蟲。
第3章爬蟲基礎(chǔ)
本章非常重要,你可能需要讀幾遍,或是從中查找解決問題的方法。我們會從如何安裝Scrap,并
起,然后在案例中講解如何編寫爬蟲。開始之前,說幾個注意事項。
因為我們馬上要進入有趣的編程部分,使用本書中的代碼段會十分重要。當你看到:
$echohelloworld
helloworld
是要讓你在終端中輸入echohelloworld(忽略$),第二行是看到結(jié)果。
當你看到:
?>print'hi'
hi
是讓你在Python或Scrapy界面進行輸入(忽略>>>)。同樣的,第二行是輸出結(jié)果。
你還需要對文件進行編輯。編輯工具取決于你的電腦環(huán)境。如果你使用Vagrant(強烈推薦),
你可以是用Notepad、Notepad++、SublimeText.TextMate,Eclipses或PyCharm等文本編輯
器。如果你更熟悉Linux/Unix,你可以用控制臺自帶的vim或emacs。這兩個編輯器功能強大,但
是有一定的學(xué)習(xí)曲線。如果你是初學(xué)者,可以選擇適合初學(xué)者的nano編輯器。
安裝Scrapy
Scrapy的安裝相對簡單,但這還取決于讀者的電腦環(huán)境。為了支持更多的人,本書安裝和使用
Scrapy的方法是用Vagrant,它可以讓你在Linux盒中使用所有的工具,而無關(guān)于操作系統(tǒng)。下面
提供了Vagrant和一些常見操作系統(tǒng)的指導(dǎo)。
MacOS
為了輕松跟隨本書學(xué)習(xí),請參照后面的Vagrant說明。如果你想在MacOS中安裝Scrapy,只需控
制臺中輸入:
$easy_installscrapy
然后,所有事就可以交給電腦了。安裝過程中,可能會向你詢問密碼或是否安裝Xcode,只需同
意即可。
Windows
在Windows中安裝Scrapy要麻煩些。另外,在Windows安裝本書中所有的軟件也很麻煩。我們
都為你想到了可能的問題。有Virtualbox的Vagrant可以在所有64位電腦上順利運行。翻閱相關(guān)章
節(jié),只需幾分鐘就可以安裝好。如果真要在Windows中安裝,請參考本書網(wǎng)站http:〃scrapybook
.com/上面的資料。
Linux
你可能會在多種Linux服務(wù)器上安裝Scrapy,步驟如下:
提示:確切的安裝依賴變化很快。寫作本書時,Scrapy的版本是1.0.3(翻譯此書時是
1.4).下面只是對不同服務(wù)器的建議方法。
Ubuntu或DebianLinux
為了在Ubuntu(測試機是Ubuntu14.04TrustyShr-64bit)或是其它使用apt的服務(wù)器上安裝
Scrapy,可以使用下面三條命令:
$sudoapt-getupdate
$sudoapt-getinstallpython-pippython-lxmlpython-cryptopython"
cssselectpython-opensslpython-w31ibpython-twistedpython-devlibxml2-
devlibxsltl-devzliblg-devlibffi-devlibssl-dev
$sudopipinstallscrapy
這個方法需要進行編譯,可能隨時中斷,但可以安裝PyPI上最新版本的Scrapy。如果想避開編
譯,安裝不是最新版本的話,可以搜索“installScrapyUbuntupackages”,按照官方文檔安裝。
RedHat或CentOSLinux
在使用yum的Linux上安裝Scrapyiil很簡單(測試機是Ubuntu14.04TrustyTahr?64bit)。只需
三條命令:
sudoyumupdate
sudoyum-yinstalllibxslt-develpyOpenSSLpython-Ixmlpython-develgcc
sudoeasy_installscrapy
從GitHub安裝
按照前面的指導(dǎo),就可以安裝好Scrapy的依賴了。Scrapy是純Python寫成的,如果你想編輯源
代碼或是測試最新版,可以從https:〃/scrapy/scrapy克隆最新版,只需命令行輸入:
$gitclone/scrapy/scrapy.git
$cdscrapy
$pythonsetup.pyinstall
我猾如果你是這類用戶,就不需要我提醒安裝virtualenv了。
升級Scrapy
Scrapy升級相當頻繁。如果你需要升級Scrapy,可以使用pip、easy_install或aptitude:
$sudopipinstalljpgradeScrapy
$sudoeasy_installupgradescrapy
如果你想降級或安裝指定版本的Scrapy,可以:
$sudopipinstallScrapy??1.0.0
或
$sudoeasy_installscrapy==1.0.0
Vagrant:本書案例的運行方法
本書有的例子比較復(fù)雜,有的例子使用了許多東西。無論你是什么水平,都可以嘗試運行所有例
子。只需一句命令,就可以用Vagrant搭建操作環(huán)境。
本書使用的系統(tǒng)
在Vagrant中,你的電腦被稱作“主機工Vagrant在主機中創(chuàng)建一個虛擬機。這樣就可以讓我們忽
略主機的軟硬件,來運行案例了。
本書大多數(shù)章節(jié)使用了兩個服務(wù)一一開發(fā)機和網(wǎng)絡(luò)機。我們在開發(fā)機中登錄運行Scrapy,在網(wǎng)絡(luò)
機中進行抓取。后面的章節(jié)會使用更多的服務(wù),包括數(shù)據(jù)庫和大數(shù)據(jù)處理引擎。
根據(jù)附錄A安裝必備,安裝Vagrant,直到安裝好git和Vagrant。打開命令行,輸入以下命令獲取
本書的代碼:
$gitclone/scalingexcellence/scrapybook.git
$cdscrapybook
打開Vagrant:
$vagrantup--no-parallel
第一次打開Vagrant會需要些時間,這取決于你的網(wǎng)絡(luò)。第二次打開就會比較快。打開之后,登
錄你的虛擬機,通過:
$vagrantssh
代碼已經(jīng)從主機中復(fù)制到了開發(fā)機,現(xiàn)在可以在book的目錄中看到:
$cdbook
$Is
$ch03ch04ch05ch07ch08ch09chl0chll...
可以打開幾個窗口輸入vagrantssh,這樣就可以打開幾個終端。輸入vagranthalt可以關(guān)閉系
統(tǒng),vagrantstatus可以檢查狀態(tài)。vagranthalt不能關(guān)閉虛擬機。如果在Virtua舊ox中碰到問題,
可以手動關(guān)閉,或是使用vagrantglobal-status查找id,用vagranthalt暫停。大多數(shù)例子可以離
線運行,這是Vagrant的一大優(yōu)點。
安裝好環(huán)境之后,就可以開始學(xué)習(xí)Scrapy了。
UR2IM一一基礎(chǔ)抓取過程
每個網(wǎng)站都是不同的,對每個網(wǎng)站進行額外的研究不可避免,碰到特別生僻的問題,也許還要用
Scrapy的郵件列表咨詢。尋求解答,去哪里找、怎么找,前提是要熟悉整個過程和相關(guān)術(shù)語。
Scrapy的基本過程,可以寫成字母縮略語UR2IM,見下圖。
TheBasicScrapingEquation:UR2IM
?URL
,Request
,Response
ditibase
?MoreURLs
TheURL
一切都從URL開始。你需要目標網(wǎng)站的URL。我的例子是https:〃/,Gumtree
分類網(wǎng)站。
例如,訪問倫敦房地產(chǎn)首頁http:〃/flats-houses/london,你就可以找到許多房
子的URL。右鍵復(fù)制鏈接地址,就可以復(fù)制URL。其中一個URL可能是這樣的:https:〃www.gu
/p/studios-bedsits-rent/split-level,但是,Gumtree的網(wǎng)站變動之后,URL的XPath表
達式會失效。不添加用戶頭的話,Gumtree也不會響應(yīng)。這個留給以后再說,現(xiàn)在如果你想加載
一個網(wǎng)頁,你可以使用Scrapy終端,如下所示:
scrapyshell-sUSER_AGENT=,,Mozilla/5.0,,<yoururlheree.g.http:gumtree,co
m/p/studios-bedsits-rent/...>
要進行調(diào)試,可以在Scrapy語句后面添加-pdb,例如:
scrapyshell--pdb
我們不想讓大家如此頻繁的點擊Gumtree網(wǎng)站,并且Gumtree網(wǎng)站上URL失效很快,不適合做例
子。我們還希望大家能在離線的情況下,多多練習(xí)書中的例子。這就是為什么Vagrant開發(fā)環(huán)境
內(nèi)嵌了一個網(wǎng)絡(luò)服務(wù)器,可以生成和Gumtree類似的網(wǎng)頁。這些網(wǎng)頁可能并不好看,但是從爬蟲
開發(fā)者的角度,是完全合格的。如果想在Vagrant上訪問Gumtree,可以在Vagrant開發(fā)機上訪問h
ttp://web:9312/,或是在瀏覽器中訪問http:〃localhost:9312/。
讓我們在這個網(wǎng)頁上嘗試一下Scrapy,在Vagrant開發(fā)機上輸入:
$scrapyshellhttp://web:9312/properties/property_000000.html
[s]AvailableScrapyobjects:
[S]crawler<scrapy.crawler.Crawlerobjectat0x2d4fbl0>
[S]item{}
[S]request<GEThttp://web:9312/.../property_000000.html>
[S]response<200http://web:9312/.../property_000000.html>
[S]settings<scrapy.settings.Settingsobjectat0x2d4fa90>
(S]spider<DefaultSpider*default,at0x3ea0bd0>
[s]Usefulshortcuts:
[s]shelp()Shellhelp(printthishelp)
[s]fetch(req_or_ur1)Fetchrequest(orURL)andupdatelocal...
[s]view(response)Viewresponseinabrowser
>>>
得到一些輸出,加載頁面之后,就進入了Python(可以使用Ctrl+D退出)。
請求和響應(yīng)
在前面的輸出日志中,Scrapy自動為我們做了一些工作。我們輸入了一條地址,Scrapy做了一個
GET請求,并得到一個成功響應(yīng)值200。這說明網(wǎng)頁信息已經(jīng)成功加載,并可以使用了。如果要
打印reponse.body的前50個字母,我們可以得到:
>>>response.body[:50]
H
,<!DOCFYPEhtn1>\n<html>\n<head>\n<metacharset=UTF-8"'
這就是這個Gumtree網(wǎng)頁的HTML文檔。有時請求和響應(yīng)會很復(fù)雜,第5章會對其進行講解,現(xiàn)在
只講最簡單的情況。
抓取對象
下一步是從響應(yīng)文件中提取信息,輸入到Item。因為這是個HTML文檔,我們用XPath來做。首先
來看一下這個網(wǎng)頁:
頁面上的信息很多,但大多是關(guān)于版面的:log。、搜索框、按鈕等等。從抓取的角度,它們不重
要。我們關(guān)注的是,例如,列表的標題、地址、電話。它們都對應(yīng)著HTML里的元素,我們要在
HTML中定位,用上一章所學(xué)的提取出來。先從標題開始。
在標題上右鍵點擊,選擇檢查元素。在自動定位的HTML上再次右鍵點擊,選擇復(fù)制XPath。
Chrome給的XPath總是很復(fù)雜,并且容易失效。我們要對其進行簡化。我們只取最后面的E。這
是因為從SEO的角度,每頁HTML只有一個hi最好,事實上大多是網(wǎng)頁只有一個hi,所以不用擔
心重復(fù)。
提示:SEO是搜索引擎優(yōu)化的意思:通過對網(wǎng)頁代碼、內(nèi)容、鏈接的優(yōu)化,提升對搜索引擎
的支持。
讓我們看看hi標簽行不行:
>>>response.xpath(V/hl/textO').extract()
[u*setuniquefamilywell']
很好,完全行得通。我在hi后面加上了text。,表示只提取hi標簽里的文字。沒有添加text。的
話,就會這樣:
>>>response.xpath('//hl').extract()
[u'<hlitemprop=',name"class=Mspace-mbsM>setuniquefamilywell</hl>*]
我們已經(jīng)成功得到了title,但是再仔細看看,還能發(fā)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 債務(wù)劃清責任合同范本簡易
- 雙軟認證合同范本
- 農(nóng)村房屋合同范例
- 不買社保勞務(wù)合同范本
- 合作木柴出售合同范本
- 公司裁員合同范本
- 廠房回收拆除合同范例
- 農(nóng)村果林租賃合同范本
- 印花材料供應(yīng)合同范本
- 東麗區(qū)恒溫配送合同范本
- 借哪吒精神燃開學(xué)斗志 開學(xué)主題班會課件
- GB/T 45107-2024表土剝離及其再利用技術(shù)要求
- 人教PEP版(2024)三年級上冊英語Unit 6《Useful numbers》單元作業(yè)設(shè)計
- 幼兒園安全教育課件:《危險的小圓珠》
- 冠心病病人的護理ppt(完整版)課件
- 砂石生產(chǎn)各工種安全操作規(guī)程
- (精心整理)林海雪原閱讀題及答案
- 云南藝術(shù)學(xué)院
- 2020華夏醫(yī)學(xué)科技獎知情同意報獎證明
- 素描石膏幾何體
- 第二章 法國學(xué)前教育
評論
0/150
提交評論