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