Scrapy是使用Python開發(fā)的一個(gè)快速、高層次的屏幕抓取和Web抓取框架,用于抓Web站點(diǎn)并從頁(yè)面中提取結(jié)構(gòu)化的數(shù)據(jù)!毒≒ython爬蟲框架Scrapy》以Scrapy 1.0版本為基礎(chǔ),講解了Scrapy的基礎(chǔ)知識(shí),以及如何使用Python和三方API提取、整理數(shù)據(jù),以滿足自己的需求。
本書共11章,其內(nèi)容涵蓋了Scrapy基礎(chǔ)知識(shí),理解HTML和XPath,安裝Scrapy并爬取一個(gè)網(wǎng)站,使用爬蟲填充數(shù)據(jù)庫(kù)并輸出到移動(dòng)應(yīng)用中,爬蟲的強(qiáng)大功能,將爬蟲部署到Scrapinghub云服務(wù)器,Scrapy的配置與管理,Scrapy編程,管道秘訣,理解Scrapy性能,使用Scrapyd與實(shí)時(shí)分析進(jìn)行分布式爬取。本書附錄還提供了各種軟件的安裝與故障排除等內(nèi)容。
本書適合軟件開發(fā)人員、數(shù)據(jù)科學(xué)家,以及對(duì)自然語(yǔ)言處理和機(jī)器學(xué)習(xí)感興趣的人閱讀。
Scrapy是一個(gè)開源的Python爬蟲框架,可以用來(lái)輕松提取從頁(yè)面數(shù)據(jù)。Scrapy帶有豐富的特性,可通過(guò)簡(jiǎn)單的編碼或配置來(lái)訪問(wèn),從而可以節(jié)省開發(fā)人員數(shù)周的開發(fā)時(shí)間,并高效地提取所需數(shù)據(jù)。Scrapy有一個(gè)高度活躍且迅速增長(zhǎng)的社區(qū),而且已經(jīng)成為黑客、創(chuàng)業(yè)者和Web爬取專家的首 選框架。
本書講解了Scrapy的基礎(chǔ)知識(shí),討論了如何從任意源提取數(shù)據(jù),如何清理數(shù)據(jù),以及如何使用Python和第三方API進(jìn)行處理,以滿足自身需求。本書還講解了如何將爬取的數(shù)據(jù)高效地饋入數(shù)據(jù)庫(kù)、搜索引擎和流數(shù)據(jù)處理系統(tǒng)(比如Apache Spark)。在學(xué)習(xí)完本書后,你將對(duì)數(shù)據(jù)爬取胸有成竹,并將數(shù)據(jù)應(yīng)用在自己的應(yīng)用程序中。
本書內(nèi)容:
使用HTML和Xpath提取所需的數(shù)據(jù);
使用Python編寫Scrapy爬蟲,并在網(wǎng)絡(luò)上進(jìn)行爬取操作;
將數(shù)據(jù)推送到任意數(shù)據(jù)庫(kù)、搜搜引擎或分析系統(tǒng)的方法;
配置爬蟲,使其下載文件和圖形,以及使用代理;
創(chuàng)建用來(lái)限流數(shù)據(jù)的高效管道;
使用Twitsted實(shí)踐驅(qū)動(dòng)的API并發(fā)處理數(shù)百個(gè)Item;
讓爬蟲更快速,讓內(nèi)存使用率更高,以及對(duì)Scrapy性能進(jìn)行調(diào)優(yōu)的技巧;
使用Scrapyd和Scrapinghub執(zhí)行大規(guī)模分布式爬取操作的方法。
Dimitrios Kouzis-Loukas作為一位軟件開發(fā)人員,已經(jīng)擁有超過(guò)15年的經(jīng)驗(yàn)。同時(shí),他還使用自己掌握的知識(shí)和技能,向廣大讀者講授如何編寫軟件。
他學(xué)習(xí)并掌握了多門學(xué)科,包括數(shù)學(xué)、物理學(xué)以及微電子學(xué)。他對(duì)這些學(xué)科的透徹理解,提高了自身的標(biāo)準(zhǔn),而不只是“實(shí)用的解決方案”。他知道真正的解決方案應(yīng)當(dāng)是像物理學(xué)規(guī)律一樣確定,像ECC內(nèi)存一樣健壯,像數(shù)學(xué)一樣通用。
Dimitrios目前正在使用新的數(shù)據(jù)中心技術(shù)開發(fā)低延遲、高可用的分布式系統(tǒng)。他是語(yǔ)言無(wú)關(guān)論者,不過(guò)對(duì)Python、C++和Java略有偏好。他對(duì)開源軟硬件有著堅(jiān)定的信念,他希望他的貢獻(xiàn)能夠造福于各個(gè)社區(qū)和全人類。
關(guān)于譯者
李斌,畢業(yè)于北京科技大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)專業(yè),獲得碩士學(xué)位。曾任職于阿里巴巴,當(dāng)前供職于凡普金科,負(fù)責(zé)應(yīng)用安全工作。熱愛Python編程和Web安全,希望以更加智能和自動(dòng)化的方式提升網(wǎng)絡(luò)安全。
第 1章 Scrapy簡(jiǎn)介 1
1.1 初識(shí)Scrapy 1
1.2 喜歡Scrapy的更多理由 2
1.3 關(guān)于本書:目標(biāo)和用途 3
1.4 掌握自動(dòng)化數(shù)據(jù)爬取的重要性 4
1.4.1 開發(fā)健壯且高質(zhì)量的應(yīng)用,并提供合理規(guī)劃 4
1.4.2 快速開發(fā)高質(zhì)量可行產(chǎn)品 5
1.4.3 Google不會(huì)使用表單,爬取才能擴(kuò)大規(guī)模 6
1.4.4 發(fā)現(xiàn)并融入你的生態(tài)系統(tǒng) 7
1.5 在充滿爬蟲的世界里做一個(gè)好公民 7
1.6 Scrapy不是什么 8
1.7 本章小結(jié) 9
第 2章 理解HTML和XPath 10
2.1 HTML、DOM樹表示以及XPath 10
2.1.1 URL 11
2.1.2 HTML文檔 11
2.1.3 樹表示法 13
2.1.4 你會(huì)在屏幕上看到什么 14
2.2 使用XPath選擇HTML元素 15
2.2.1 有用的XPath表達(dá)式 16
2.2.2 使用Chrome獲取XPath表達(dá)式 19
2.2.3 常見任務(wù)示例 20
2.2.4 預(yù)見變化 21
2.3 本章小結(jié) 22
第3章 爬蟲基礎(chǔ) 23
3.1 安裝Scrapy 24
3.1.1 MacOS 24
3.1.2 Windows 25
3.1.3 Linux 25
3.1.4 新源碼安裝 26
3.1.5 升級(jí)Scrapy 26
3.1.6 Vagrant:本書中運(yùn)行示例的官方方式 27
3.2 UR2IM——基本抓取流程 28
3.2.1 URL 29
3.2.2 請(qǐng)求和響應(yīng) 31
3.2.3 Item 31
3.3 一個(gè)Scrapy項(xiàng)目 37
3.3.1 聲明item 38
3.3.2 編寫爬蟲 40
3.3.3 填充item 43
3.3.4 保存文件 45
3.3.5 清理——item裝載器與管理字段 47
3.3.6 創(chuàng)建contract 50
3.4 抽取更多的URL 53
3.4.1 使用爬蟲實(shí)現(xiàn)雙向爬取 56
3.4.2 使用CrawlSpider實(shí)現(xiàn)雙向爬取 59
3.5 本章小結(jié) 61
第4章 從Scrapy到移動(dòng)應(yīng)用 62
4.1 選擇手機(jī)應(yīng)用框架 62
4.2 創(chuàng)建數(shù)據(jù)庫(kù)和集合 63
4.3 使用Scrapy填充數(shù)據(jù)庫(kù) 65
4.4 創(chuàng)建手機(jī)應(yīng)用 68
4.4.1 創(chuàng)建數(shù)據(jù)庫(kù)訪問(wèn)服務(wù) 69
4.4.2 創(chuàng)建用戶界面 69
4.4.3 將數(shù)據(jù)映射到用戶界面 70
4.4.4 數(shù)據(jù)庫(kù)字段與用戶界面控件間映射 71
4.4.5 測(cè)試、分享及導(dǎo)出你的手機(jī)應(yīng)用 72
4.5 本章小結(jié) 73
第5章 迅速的爬蟲技巧 75
5.1 需要登錄的爬蟲 75
5.2 使用JSON API和AJAX頁(yè)面的爬蟲 81
5.3 30倍速的房產(chǎn)爬蟲 85
5.4 基于Excel文件爬取的爬蟲 90
5.5 本章小結(jié) 93
第6章 部署到Scrapinghub 94
6.1 注冊(cè)、登錄及創(chuàng)建項(xiàng)目 94
6.2 部署爬蟲與計(jì)劃運(yùn)行 96
6.3 訪問(wèn)item 99
6.4 計(jì)劃定時(shí)爬取 100
6.5 本章小結(jié) 101
第7章 配置與管理 102
7.1 使用Scrapy設(shè)置 102
7.2 基本設(shè)置 103
7.2.1 分析 104
7.2.2 性能 107
7.2.3 提前終止爬取 108
7.2.4 HTTP緩存和離線運(yùn)行 108
7.2.5 爬取風(fēng)格 109
7.2.6 feed 110
7.2.7 媒體下載 111
7.2.8 Amazon Web服務(wù) 113
7.2.9 使用代理和爬蟲 113
7.3 進(jìn)階設(shè)置 114
7.3.1 項(xiàng)目相關(guān)設(shè)置 115
7.3.2 Scrapy擴(kuò)展設(shè)置 116
7.3.3 下載調(diào)優(yōu) 116
7.3.4 自動(dòng)限速擴(kuò)展設(shè)置 117
7.3.5 內(nèi)存使用擴(kuò)展設(shè)置 117
7.3.6 日志和調(diào)試 117
7.4 本章小結(jié) 118
第8章 Scrapy編程 119
8.1 Scrapy是一個(gè)Twisted應(yīng)用 119
8.1.1 延遲和延遲鏈 122
8.1.2 理解Twisted和非阻塞I/O——一個(gè)Python故事 125
8.2 Scrapy架構(gòu)概述 132
8.3 示例1:非常簡(jiǎn)單的管道 135
8.4 信號(hào) 136
8.5 示例2:測(cè)量吞吐量和延時(shí)的擴(kuò)展 138
8.6 中間件延伸 141
8.7 本章小結(jié) 144
第9章 管道秘訣 145
9.1 使用REST API 146
9.1.1 使用treq 146
9.1.2 用于寫入Elasticsearch的管道 146
9.1.3 使用Google Geocoding API實(shí)現(xiàn)地理編碼的管道 149
9.1.4 在Elasticsearch中啟用地理編碼索引 156
9.2 與標(biāo)準(zhǔn)Python客戶端建立數(shù)據(jù)庫(kù)接口 157
9.3 使用Twisted專用客戶端建立服務(wù)接口 161
9.4 為CPU密集型、阻塞或遺留功能建立接口 166
9.4.1 處理CPU密集型或阻塞操作的管道 166
9.4.2 使用二進(jìn)制或腳本的管道 168
9.5 本章小結(jié) 172
第 10章 理解Scrapy性能 173
10.1 Scrapy引擎——一種直觀方式 173
10.1.1 級(jí)聯(lián)隊(duì)列系統(tǒng) 175
10.1.2 定義瓶頸 176
10.1.3 Scrapy性能模型 176
10.2 使用telnet獲得組件利用率 178
10.3 基準(zhǔn)系統(tǒng) 180
10.4 標(biāo)準(zhǔn)性能模型 182
10.5 解決性能問(wèn)題 185
10.5.1 案例 #1:CPU飽和 185
10.5.2 案例 #2:代碼阻塞 187
10.5.3 案例 #3:下載器中的“垃圾” 188
10.5.4 案例 #4:大量響應(yīng)或超長(zhǎng)響應(yīng)造成的溢出 191
10.5.5 案例 #5:有限/過(guò)度item并發(fā)造成的溢出 193
10.5.6 案例 #6:下載器未充分利用 194
10.6 故障排除流程 197
10.7 本章小結(jié) 198
第 11章 使用Scrapyd與實(shí)時(shí)分析進(jìn)行分布式爬取 199
11.1 房產(chǎn)的標(biāo)題是如何影響價(jià)格的 200
11.2 Scrapyd 200
11.3 分布式系統(tǒng)概述 203
11.4 爬蟲和中間件的變化 205
11.4.1 索引頁(yè)分片爬取 205
11.4.2 分批爬取URL 207
11.4.3 從設(shè)置中獲取初始URL 211
11.4.4 在Scrapyd服務(wù)器中部署項(xiàng)目 213
11.5 創(chuàng)建自定義監(jiān)控命令 215
11.6 使用Apache Spark流計(jì)算偏移量 216
11.7 運(yùn)行分布式爬取 218
11.8 系統(tǒng)性能 220
11.9 關(guān)鍵要點(diǎn) 221
11.10 本章小結(jié) 221
附錄A 軟件的安裝與故障排除 222