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