本書深入系統(tǒng)地介紹了Python流行框架Scrapy的相關(guān)技術(shù)及使用技巧。全書共14章,從邏輯上可分為基礎(chǔ)篇和高級篇兩部分,基礎(chǔ)篇重點(diǎn)介紹Scrapy的核心元素,如spider、selector、item、link等;高級篇講解爬蟲的高級話題,如登錄認(rèn)證、文件下載、執(zhí)行JavaScript、動(dòng)態(tài)網(wǎng)頁爬取、使用HTTP代理、分布式爬蟲的編寫等,并配合項(xiàng)目案例講解,包括供練習(xí)使用的網(wǎng)站,以及京東、知乎、豆瓣、360爬蟲案例等。
本書案例豐富,注重實(shí)踐,代碼注釋詳盡,適合有一定Python語言基礎(chǔ),想學(xué)習(xí)編寫復(fù)雜網(wǎng)絡(luò)爬蟲的讀者使用。
本書以應(yīng)用為出發(fā)點(diǎn),詳細(xì)深入地介紹了Python流行框架Scrapy的核心技術(shù)及網(wǎng)絡(luò)爬蟲的開發(fā)技巧。
本書分為基礎(chǔ)篇和高級篇兩部分,基礎(chǔ)篇重點(diǎn)介紹Scrapy的核心元素,如spider、selector、item、link等;高級篇講解如登錄認(rèn)證、文件下載、執(zhí)行JavaScript、動(dòng)態(tài)網(wǎng)頁爬取、使用HTTP代理、分布式爬蟲的編寫等內(nèi)容。
為方便讀者快速上手,本書還設(shè)計(jì)了大量項(xiàng)目案列,包括供練習(xí)用的網(wǎng)站的爬取以及如京東、知乎、豆瓣、360等網(wǎng)站的爬取。
本書很適合有一定Python語言基礎(chǔ),想學(xué)習(xí)編寫復(fù)雜網(wǎng)絡(luò)爬蟲的讀者使用。此外,書中涉及的關(guān)聯(lián)知識很豐富,可以幫助讀者拓展知識面,掌握更多實(shí)用技能。
關(guān)于本書
如今是互聯(lián)網(wǎng)的時(shí)代,而且正在邁入智能時(shí)代。人們早已意識到互聯(lián)網(wǎng)中的數(shù)據(jù)是有待開采的巨大金礦,這些數(shù)據(jù)將會改善我們的生活,網(wǎng)絡(luò)爬蟲開發(fā)工作崗位的出現(xiàn)和不斷增加正是基于對數(shù)據(jù)價(jià)值的重視。優(yōu)秀的爬蟲框架就像是開采金礦的強(qiáng)力挖掘機(jī),如果你能嫻熟地駕駛它們,就能大幅提高開采效率。
本書講解目前最流行的Python爬蟲框架Scrapy,它簡單易用、靈活易拓展、文檔豐富、開發(fā)社區(qū)活躍,使用Scrapy可以高效地開發(fā)網(wǎng)絡(luò)爬蟲應(yīng)用。本書的讀者只需要有Python語言基礎(chǔ)即可,我們從零基礎(chǔ)、逐步由淺入深進(jìn)行講解。第1~8章講解Scrapy開發(fā)的核心基礎(chǔ)部分,其中包括:
●初識Scrapy
●編寫Spider
●使用Selector提取數(shù)據(jù)
●使用Item封裝數(shù)據(jù)
●使用ItemPipeline處理數(shù)據(jù)
●使用LinkExtractor提取鏈接
●使用Exporter導(dǎo)出數(shù)據(jù)
●項(xiàng)目練習(xí)
第9~14章講解實(shí)際爬蟲開發(fā)中使用頻率最高的一些實(shí)用技術(shù),其中包括:
●下載文件和圖片
●模擬登錄
●爬取動(dòng)態(tài)頁面
●存入數(shù)據(jù)庫
●使用HTTP代理
●分布式爬取
本書特色
本書的宗旨是以實(shí)用和實(shí)戰(zhàn)為教學(xué)目標(biāo),主要特色是:
●所有基礎(chǔ)部分的講解都配有代碼示例,而不僅僅是枯燥的文檔。
●案例選材方面以講解知識點(diǎn)為核心,盡量選擇專門供練習(xí)爬蟲技術(shù)的網(wǎng)站(不易變動(dòng))或貼近日常生活的網(wǎng)站(京東、知乎、豆瓣、360)進(jìn)行演示。
●在講解某些知識點(diǎn)時(shí),對Scrapy源碼進(jìn)行分析,讓讀者能夠“知其然并知其所以然”。
另外,Python是一門簡單易學(xué)、功能強(qiáng)大、開發(fā)效率極高的語言,近年來在網(wǎng)絡(luò)爬蟲、數(shù)據(jù)分析、機(jī)器學(xué)習(xí)等領(lǐng)域得到廣泛認(rèn)可。雖然Python很容易上手,但想靈活恰當(dāng)?shù)剡\(yùn)用它也并不簡單。作者在慕課網(wǎng)(www.imooc.com)上推出了一套《Python高級進(jìn)階實(shí)戰(zhàn)》課程,可供有需求的讀者進(jìn)行參考:http://coding.imooc.com/class/62.html。
致謝
感謝康爍和陳渝老師在清華大學(xué)信息研究院工作期間對我在專業(yè)方面的耐心指導(dǎo)。
感謝清華大學(xué)出版社的王金柱編輯給予我這次寫作的機(jī)會以及在寫作方面的指點(diǎn)。
感謝趙佳音同事認(rèn)真閱讀全書并提出了許多的寶貴建議。
感謝劍超和任怡同學(xué)認(rèn)真審閱全書并對書中代碼在多個(gè)Python版本上進(jìn)行測試。
感謝女兒劉真,她的笑容化解了寫作本書時(shí)偶爾的小煩躁。
編者
2017年8月8日
劉碩:碩士,曾就職于知名外企,從事一線開發(fā)工作10年,目前主要從事Python開發(fā)與教學(xué)工作,在慕課網(wǎng)開設(shè)有多門Python課程,深受學(xué)員歡迎。
第1章 初識Scrapy 1
1.1 網(wǎng)絡(luò)爬蟲是什么 1
1.2 Scrapy簡介及安裝 2
1.3 編寫第一個(gè)Scrapy爬蟲 3
1.3.1 項(xiàng)目需求 4
1.3.2 創(chuàng)建項(xiàng)目 4
1.3.3 分析頁面 5
1.3.4 實(shí)現(xiàn)Spider 6
1.3.5 運(yùn)行爬蟲 8
1.4 本章小結(jié) 11
第2章 編寫Spider 12
2.1 Scrapy框架結(jié)構(gòu)及工作原理 12
2.2 Request和Response對象 14
2.2.1 Request對象 15
2.2.2 Response對象 16
2.3 Spider開發(fā)流程 18
2.3.1 繼承scrapy.Spider 19
2.3.2 為Spider命名 20
2.3.3 設(shè)定起始爬取點(diǎn) 20
2.3.4 實(shí)現(xiàn)頁面解析函數(shù) 22
2.4 本章小結(jié) 22
第3章 使用Selector提取數(shù)據(jù) 23
3.1 Selector對象 23
3.1.1 創(chuàng)建對象 24
3.1.2 選中數(shù)據(jù) 25
3.1.3 提取數(shù)據(jù) 26
3.2 Response內(nèi)置Selector 28
3.3 XPath 29
3.3.1 基礎(chǔ)語法 30
3.3.2 常用函數(shù) 35
3.4 CSS選擇器 36
3.5 本章小結(jié) 40
第4章 使用Item封裝數(shù)據(jù) 41
4.1 Item和Field 42
4.2 拓展Item子類 44
4.3 Field元數(shù)據(jù) 44
4.4 本章小結(jié) 47
第5章 使用Item Pipeline處理數(shù)據(jù) 48
5.1 Item Pipeline 48
5.1.1 實(shí)現(xiàn)Item Pipeline 49
5.1.2 啟用Item Pipeline 50
5.2 更多例子 51
5.2.1 過濾重復(fù)數(shù)據(jù) 51
5.2.2 將數(shù)據(jù)存入
MongoDB 54
5.3 本章小結(jié) 57
第6章 使用LinkExtractor提取鏈接 58
6.1 使用LinkExtractor 59
6.2 描述提取規(guī)則 60
6.3 本章小結(jié) 65
第7章 使用Exporter導(dǎo)出數(shù)據(jù) 66
7.1 指定如何導(dǎo)出數(shù)據(jù) 67
7.1.1 命令行參數(shù) 67
7.1.2 配置文件 69
7.2 添加導(dǎo)出數(shù)據(jù)格式 70
7.2.1 源碼參考 70
7.2.2 實(shí)現(xiàn)Exporter 72
7.3 本章小結(jié) 74
第8章 項(xiàng)目練習(xí) 75
8.1 項(xiàng)目需求 77
8.2 頁面分析 77
8.3 編碼實(shí)現(xiàn) 83
8.4 本章小結(jié) 88
第9章 下載文件和圖片 89
9.1 FilesPipeline和
ImagesPipeline 89
9.1.1 FilesPipeline使用
說明 90
9.1.2 ImagesPipeline使用
說明 91
9.2 項(xiàng)目實(shí)戰(zhàn):爬取matplotlib
例子源碼文件 92
9.2.1 項(xiàng)目需求 92
9.2.2 頁面分析 94
9.2.3 編碼實(shí)現(xiàn) 96
9.3 項(xiàng)目實(shí)戰(zhàn):下載360圖片 103
9.3.1 項(xiàng)目需求 104
9.3.2 頁面分析 104
9.3.3 編碼實(shí)現(xiàn) 107
9.4 本章小結(jié) 109
第10章 模擬登錄 110
10.1 登錄實(shí)質(zhì) 110
10.2 Scrapy模擬登錄 114
10.2.1 使用FormRequest 114
10.2.2 實(shí)現(xiàn)登錄Spider 117
10.3 識別驗(yàn)證碼 119
10.3.1 OCR識別 119
10.3.2 網(wǎng)絡(luò)平臺識別 123
10.3.3 人工識別 127
10.4 Cookie登錄 128
10.4.1 獲取瀏覽器
Cookie 128
10.4.2 CookiesMiddleware
源碼分析 129
10.4.3 實(shí)現(xiàn)BrowserCookies-
Middleware 132
10.4.4 爬取知乎個(gè)人
信息 133
10.5 本章小結(jié) 135
第11章 爬取動(dòng)態(tài)頁面 136
11.1 Splash渲染引擎 140
11.1.1 render.html端點(diǎn) 141
11.1.2 execute端點(diǎn) 142
11.2 在Scrapy中使用Splash 145
11.3 項(xiàng)目實(shí)戰(zhàn):爬取toscrape
中的名人名言 146
11.3.1 項(xiàng)目需求 146
11.3.2 頁面分析 146
11.3.3 編碼實(shí)現(xiàn) 147
11.4 項(xiàng)目實(shí)戰(zhàn):爬取京東商城
中的書籍信息 149
11.4.1 項(xiàng)目需求 149
11.4.2 頁面分析 149
11.4.3 編碼實(shí)現(xiàn) 152
11.5 本章小結(jié) 154
第12章 存入數(shù)據(jù)庫 155
12.1 SQLite 156
12.2 MySQL 159
12.3 MongoDB 165
12.4 Redis 169
12.5 本章小結(jié) 173
第13章 使用HTTP代理 174
13.1 HttpProxyMiddleware 175
13.1.1 使用簡介 175
13.1.2 源碼分析 177
13.2 使用多個(gè)代理 179
13.3 獲取免費(fèi)代理 180
13.4 實(shí)現(xiàn)隨機(jī)代理 184
13.5 項(xiàng)目實(shí)戰(zhàn):爬取豆瓣電影
信息 187
13.5.1 項(xiàng)目需求 188
13.5.2 頁面分析 189
13.5.3 編碼實(shí)現(xiàn) 194
13.6 本章小結(jié) 198
第14章 分布式爬取 199
14.1 Redis的使用 200
14.1.1 安裝Redis 200
14.1.2 Redis基本命令 201
14.2 scrapy-redis源碼分析 206
14.2.1 分配爬取任務(wù)
部分 207
14.2.2 匯總爬取數(shù)據(jù)
部分 214
14.3 使用scrapy-redis進(jìn)行分
布式爬取 217
14.3.1 搭建環(huán)境 217
14.3.2 項(xiàng)目實(shí)戰(zhàn) 218
14.4 本章小結(jié) 224
第1章初識Scrapy
本章首先介紹爬蟲的基本概念、工作流程,然后介紹Scrapy的安裝和網(wǎng)絡(luò)爬蟲項(xiàng)目的實(shí)現(xiàn)流程,使讀者對網(wǎng)絡(luò)爬蟲有一個(gè)大致的了解,并且建立起網(wǎng)絡(luò)爬蟲的編寫思路。本章重點(diǎn)講解以下內(nèi)容:
?網(wǎng)絡(luò)爬蟲及爬蟲的工作流程。
?Scrapy的介紹與安裝。
?網(wǎng)絡(luò)爬蟲編寫步驟。
1.1網(wǎng)絡(luò)爬蟲是什么
網(wǎng)絡(luò)爬蟲是指在互聯(lián)網(wǎng)上自動(dòng)爬取網(wǎng)站內(nèi)容信息的程序,也被稱作網(wǎng)絡(luò)蜘蛛或網(wǎng)絡(luò)機(jī)器人。大型的爬蟲程序被廣泛應(yīng)用于搜索引擎、數(shù)據(jù)挖掘等領(lǐng)域,個(gè)人用戶或企業(yè)也可以利用爬蟲收集對自身有價(jià)值的數(shù)據(jù)。舉一個(gè)簡單的例子,假設(shè)你在本地新開了一家以外賣生意為主的餐館,現(xiàn)在要給菜品定價(jià),此時(shí)便可以開發(fā)一個(gè)爬蟲程序,在美團(tuán)、餓了么、百度外賣這些外賣網(wǎng)站爬取大量其他餐館的菜品價(jià)格作為參考,以指導(dǎo)定價(jià)。
一個(gè)網(wǎng)絡(luò)爬蟲程序的基本執(zhí)行流程可以總結(jié)為以下循環(huán):
1.下載頁面
一個(gè)網(wǎng)頁的內(nèi)容本質(zhì)上就是一個(gè)HTML文本,爬取一個(gè)網(wǎng)頁內(nèi)容之前,首先要根據(jù)網(wǎng)頁的URL下載網(wǎng)頁。
2.提取頁面中的數(shù)據(jù)
當(dāng)一個(gè)網(wǎng)頁(HTML)下載完成后,對頁面中的內(nèi)容進(jìn)行分析,并提取出我們感興趣的數(shù)據(jù),提取到的數(shù)據(jù)可以以多種形式保存起來,比如將數(shù)據(jù)以某種格式(CSV、JSON)寫入文件中,或存儲到數(shù)據(jù)庫(MySQL、MongoDB)中。
3.提取頁面中的鏈接
通常,我們想要獲取的數(shù)據(jù)并不只在一個(gè)頁面中,而是分布在多個(gè)頁面中,這些頁面彼此聯(lián)系,一個(gè)頁面中可能包含一個(gè)或多個(gè)到其他頁面的鏈接,提取完當(dāng)前頁面中的數(shù)據(jù)后,還要把頁面中的某些鏈接也提取出來,然后對鏈接頁面進(jìn)行爬取(循環(huán)1-3步驟)。
設(shè)計(jì)爬蟲程序時(shí),還要考慮防止重復(fù)爬取相同頁面(URL去重)、網(wǎng)頁搜索策略(深度優(yōu)先或廣度優(yōu)先等)、爬蟲訪問邊界限定等一系列問題。
從頭開發(fā)一個(gè)爬蟲程序是一項(xiàng)煩瑣的工作,為了避免因制造輪子而消耗大量時(shí)間,在實(shí)際應(yīng)用中我們可以選擇使用一些優(yōu)秀的爬蟲框架,使用框架可以降低開發(fā)成本,提高程序質(zhì)量,讓我們能夠?qū)W⒂跇I(yè)務(wù)邏輯(爬取有價(jià)值的數(shù)據(jù))。接下來,本書就帶你學(xué)習(xí)目前非常流行的開源爬蟲框架Scrapy。
1.2Scrapy簡介及安裝
Scrapy是一個(gè)使用Python語言(基于Twisted框架)編寫的開源網(wǎng)絡(luò)爬蟲框架,目前由ScrapinghubLtd維護(hù)。Scrapy簡單易用、靈活易拓展、開發(fā)社區(qū)活躍,并且是跨平臺的。在Linux、MaxOS以及Windows平臺都可以使用。Scrapy應(yīng)用程序也使用Python進(jìn)行開發(fā),目前可以支持Python2.7以及Python3.4+版本。
在任意操作系統(tǒng)下,可以使用pip安裝Scrapy,例如:
$pipinstallscrapy
為確認(rèn)Scrapy已安裝成功,首先在Python中測試能否導(dǎo)入Scrapy模塊:
>>>importscrapy
>>>scrapy.version_info
(1,3,3)
然后,在shell中測試能否執(zhí)行Scrapy這條命令:
$scrapy
Scrapy1.3.3-noactiveproject
……