图书目录

第 1篇基础知识

第 1章开发环境配置 . 2 

1.1 安装官方的 Python运行环境 .2 

1.2  配置 PATH环境变量.5 

1.3 安装 Anaconda Python开发环境 .6 

1.4 安装 PyCharm .7 

1.5 配置 PyCharm .8 

1.6  小结 . 10

第 2章爬虫基础.11 

2.1 HTTP基础 11 

2.1.1  URI和 URL  11 

2.1.2  超文本  12 

2.1.3  HTTP与 HTTPS . 12 

2.1.4  HTTP的请求过程 . 15 

2.1.5  请求  17 

2.1.6  响应  20 

2.2 网页基础  23 

2.2.1  HTML . 23 

2.2.2  CSS  24 

2.2.3  CSS选择器. 25 

2.2.4  JavaScript . 27 

2.3 爬虫的基本原理  27 

2.3.1  爬虫的分类 . 27 

2.3.2  爬虫抓取数据的方式和手段 . 28 

2.4 Session与 Cookie . 28 

2.4.1  静态页面和动态页面 . 29 

2.4.2  无状态 HTTP与 Cookie  30 

2.4.3  利用 Session和 Cookie保持状态 . 30 

2.4.4  查看网站的 Cookie  31 

2.4.5  HTTP状态何时会失效  32 

CONTENTS 目 录

2.5 实战案例:抓取所有的网络资源 . 33 

2.6 实战案例:抓取博客文章列表 . 37 

2.7 小结 . 40

第 2篇网络库

第 3章网络库 urllib . 42 

3.1  urllib简介  42 

3.2  发送请求与获得响应 . 43 

3.2.1  用 urlopen函数发送 HTTP GET请求  43 

3.2.2  用 urlopen函数发送 HTTP POST请求  44 

3.2.3  请求超时 . 45 

3.2.4  设置 HTTP请求头  46 

3.2.5  设置中文 HTTP请求头 . 48 

3.2.6  请求基础验证页面 . 50 

3.2.7  搭建代理与使用代理 . 54 

3.2.8  读取和设置 Cookie  56 

3.3  异常处理  60 

3.3.1 URLError 60 

3.3.2 HTTPError 61 

3.4  解析链接  62 

3.4.1  拆分与合并 URL(urlparse与 urlunparse) . 62 

3.4.2  另一种拆分与合并 URL的方式(urlsplit与 urlunsplit)  63 

3.4.3  连接 URL(urljoin) . 65 

3.4.4  URL编码(urlencode). 65 

3.4.5  编码与解码(quote与 unquote). 66 

3.4.6  参数转换(parse_qs与 parse_qsl)  66 

3.5  Robots协议  67 

3.5.1 Robots协议简介 . 67 

3.5.2 分析 Robots协议  68 

3.6 小结 . 69

第 4章网络库 urllib3 . 70 

4.1 urllib3简介  70 

4.2 urllib3模块  70 

4.3 发送 HTTP GET请求  71 

4.4 发送 HTTP POST请求  72 

4.5 HTTP请求头  74 

4.6 HTTP响应头  76 

4.7 上传文件  76 

4.8 超时 . 78 

4.9 小结 . 79

第 5章网络库 requests . 80 

5.1 基本用法  80 

5.1.1  requests的 HelloWorld  81 

5.1.2  GET请求  81 

5.1.3  添加 HTTP请求头  82 

5.1.4  抓取二进制数据  83 

5.1.5  POST请求  84 

5.1.6  响应数据 . 85 

5.2 高级用法  87 

5.2.1  上传文件 . 88 

5.2.2  处理 Cookie  89 

5.2.3  使用同一个会话(Session)  90 

5.2.4  SSL证书验证 91 

5.2.5  使用代理 . 94 

5.2.6  超时  95 

5.2.7  身份验证 . 97 

5.2.8  将请求打包 . 97 

5.3 小结 . 98

第 6章 Twisted网络框架 99 

6.1 异步编程模型 . 99 

6.2 Reactor(反应堆)模式 . 101 

6.3 HelloWorld,Twisted框架  101 

6.4 用 Twisted实现时间戳客户端 103 

6.5 用 Twisted实现时间戳服务端 104 

6.6 小结 . 105

第 3篇解析库

第 7章正则表达式 . 108 

7.1 使用正则表达式  108 

7.1.1  使用 match方法匹配字符串  108 

7.1.2  使用 search方法在一个字符串中查找模式 . 109 

7.1.3  匹配多个字符串  110 

7.1.4  匹配任何单个字符 . 111 

7.1.5  使用字符集 . 112 

7.1.6  重复、可选和特殊字符  114 

7.1.7  分组  117 

7.1.8  匹配字符串的起始和结尾以及单词边界 . 118 

7.1.9  使用 findall和 finditer查找每一次出现的位置 . 120 

7.1.10 用 sub和 subn搜索与替换. 121 

7.1.11 使用 split分隔字符串  122 

7.2 一些常用的正则表达式 . 123 

7.3 项目实战:抓取小说目录和全文 . 124 

7.4 项目实战:抓取猫眼电影 Top100榜单  128 

7.5 项目实战:抓取糗事百科网的段子  133 

7.6 小结 . 136

第 8章 lxml与 XPath . 137 

8.1 lxml基础 137 

8.1.1  安装 lxml  137 

8.1.2  操作 XML . 138 

8.1.3  操作 HTML . 140 

8.2 XPath . 141 

8.2.1  XPath概述  141 

8.2.2  使用 XPath  141 

8.2.3  选取所有节点  143 

8.2.4  选取子节点 . 145 

8.2.5  选取父节点 . 146 

8.2.6  属性匹配与获取  146 

8.2.7  多属性匹配 . 147 

8.2.8  按序选择节点  148 

8.2.9  节点轴选择 . 149 

8.2.10  在 Chrome中自动获得 XPath代码  151 

8.2.11  使用 Chrome验证 XPath . 153 

8.3 项目实战:抓取豆瓣 Top250图书榜单  154 

8.4 项目实战:抓取起点中文网的小说信息 . 158 

8.5 小结 . 161

第 9章 Beautiful Soup库. 162 

9.1 Beautiful Soup简介  162 

9.2 Beautiful Soup基础  162 

9.2.1  安装 Beautiful Soup  163 

9.2.2  选择解析器 . 164 

9.2.3  编写第一个 Beautiful Soup程序  164 

9.3 节点选择器 . 165 

9.3.1  选择节点 . 165 

9.3.2  嵌套选择节点  167 

9.3.3  选择子节点 . 168 

9.3.4  选择父节点 . 171 

9.3.5  选择兄弟节点  172 

9.4 方法选择器 . 174 

9.4.1  find_all方法 . 174 

9.4.2  find方法 . 177 

9.5 CSS选择器 . 178 

9.5.1  基本用法 . 179 

9.5.2  嵌套选择节点  180 

9.5.3  获取属性值与文本 . 181 

9.5.4  通过浏览器获取 CSS选择器代码. 182 

9.6 实战案例:抓取租房信息  184 

9.7 实战案例:抓取酷狗网络红歌榜 . 188 

9.8 小结 . 191

第 10章 pyquery库 . 192 

10.1 pyquery简介 . 192 

10.2 pyquery基础 . 192 

10.2.1  安装 pyquery . 193 

10.2.2  pyquery的基本用法  193 

10.3 CSS选择器 . 194 

10.4 查找节点. 196 

10.4.1  查找子节点 . 196 

10.4.2  查找父节点 . 197 

10.4.3  查找兄弟节点  198 

10.4.4  获取节点信息  199 

10.5  修改节点. 203 

10.5.1  添加和移除节点的样式(addClass和 removeClass). 204 

10.5.2  修改节点属性和文本内容(attr、removeAttr、text和 html) 205 

10.5.3  删除节点(remove) . 207 

10.6  伪类选择器 . 208 

10.7  项目实战:抓取当当图书排行榜 210 

10.8  项目实战:抓取京东商城手机销售排行榜 213 

10.9  小结 219

第 4篇数据存储

第 11章文件存储  222 

11.1 打开文件 . 222 

11.2  操作文件的基本方法 . 224 

11.2.1  读文件和写文件  224 

11.2.2  读行和写行 . 226 

11.3  使用 FileInput对象读取文件 . 227 

11.4  处理 XML格式的数据 . 228 

11.4.1  读取与搜索 XML文件 . 228 

11.4.2  字典转换为 XML字符串 . 229 

11.4.3  XML字符串转换为字典  231 

11.5  处理 JSON格式的数据 232 

11.5.1  JSON字符串与字典互相转换  233 

11.5.2  将 JSON字符串转换为类实例  234 

11.5.3  将类实例转换为 JSON字符串  236 

11.5.4   类实例列表与 JSON字符串互相转换  236 

11.6 将 JSON字符串转换为 XML字符串  237 

11.7  CSV文件存储 . 238 

11.7.1  写入 CSV文件  238 

11.7.2  读取 CSV文件  241 

11.8  小结  241

第 12章数据库存储. 242 

12.1  SQLite数据库 . 242 

12.1.1 管理 SQLite数据库 . 243 

12.1.2 用 Python操作 SQLite数据库 . 245 

12.2 MySQL数据库 . 247 

12.2.1 安装 MySQL . 247 

12.2.2 在 Python中使用 MySQL  250 

12.3 非关系型数据库  253 

12.3.1 NoSQL简介 253 

12.3.2 MongoDB数据库 . 253 

12.3.3 pymongo模块 . 255 

12.4 项目实战:抓取豆瓣音乐排行榜 256 

12.5 项目实战:抓取豆瓣电影排行榜 260 

12.6 小结 264

第 5篇爬虫高级应用

第 13章抓取异步数据 . 266 

13.1 异步加载与 AJAX . 266 

13.2 基本原理. 267 

13.3 逆向工程. 270 

13.4 提取结果. 274 

13.5 项目实战:支持搜索功能的图片爬虫 . 274 

13.6 项目实战:抓取京东图书评价 . 279 

13.7 小结 284

第 14章可见即可爬:Selenium  285 

14.1 安装 Selenium . 286 

14.2 安装 WebDriver  286 

14.2.1 安装 ChromeDriver 287 

14.2.2 装 Edge WebDriver  288 

14.2.3 安装其他浏览器的 WebDriver  289 

14.3 Selenium的基本使用方法 . 289 

14.4 查找节点. 293 

14.4.1 查找单个节点  293 

14.4.2 查找多个节点  295 

14.5 节点交互. 297 

14.6 动作链  298 

14.7 执行 JavaScript代码 . 301 

14.8 获取节点信息  302 

14.9 管理 Cookies . 303 

14.10 改变节点的属性值 . 304 

14.11 项目实战:抓取 QQ空间说说的内容 . 306 

14.12 小结  308

第 15章基于 Splash的爬虫 . 309 

15.1 Splash基础 . 309 

15.1.1 Splash功能简介  309 

15.1.2 安装 Docker  310 

15.1.3 安装 Splash . 310 

15.2  Splash Lua脚本  312 

15.2.1 第一个 Lua脚本  312 

15.2.2 异步处理 . 313 

15.2.3 Splash对象属性  314 

15.2.4 go方法 . 318 

15.2.5 wait方法 . 319 

15.2.6 jsfunc方法  320 

15.2.7 evaljs方法  320 

15.2.8 runjs方法 . 320 

15.2.9 autoload方法  321 

15.2.10 call_later方法 . 322 

15.2.11 http_get方法 . 323 

15.2.12 http_post方法 . 324 

15.2.13 set_content方法  325 

15.2.14 html方法  325 

15.2.15 png方法  326 

15.2.16 jpeg方法 . 326 

15.2.17 har方法  326 

15.2.18 其他方法 . 327 

15.3  使用 CSS选择器 . 331 

15.3.1 select方法  331 

15.3.2 select_all方法 . 332 

15.4  模拟鼠标和键盘的动作 333 

15.5  Splash HTTP API  334 

15.6  项目实战:使用 Splash Lua抓取京东搜索结果 . 338 

15.7  小结 340

第 16章抓取移动 App的数据 . 341 

16.1  使用 Charles . 341 

16.1.1 抓取 HTTP数据包 . 342 

16.1.2 安装 PC端证书 . 344 

16.1.3 在手机端安装证书 . 345 

16.1.4 监听 HTTPS数据包 . 346 

16.2  使用 mitmproxy  348 

16.2.1 安装 mitmproxy. 348 

16.2.2 在 PC端安装 mitmproxy证书  349 

16.2.3 在移动端安装 mitmproxy证书. 352 

16.2.4  mitmproxy有哪些功能  353 

16.2.5  设置手机的代理  353 

16.2.6  用 mitmproxy监听 App的请求与响应数据 . 354 

16.2.7  使用 mitmproxy编辑请求信息. 356 

16.2.8  mitmdump与 Python对接 . 357 

16.2.9  使用 mitmweb监听请求与响应 361 

16.3  项目实战:实时抓取“得到” App在线课程  363 

16.4  小结 367

第 17章使用 Appium在移动端抓取数据 . 368 

17.1  安装 Appium . 368 

17.1.1  安装 Appium桌面端  368 

17.1.2  配置 Android开发环境  370 

17.1.3  配置 iOS开发环境  371 

17.2  Appium的基本使用方法 . 372 

17.2.1  启动 Appium服务 . 372 

17.2.2  查找 Android App的 Package和入口 Activity. 374 

17.2.3  控制 App . 376 

17.3  使用 Python控制手机 App  379 

17.4  AppiumPythonClient API. 380 

17.4.1  初始化(Remote类) 380 

17.4.2  查找元素 . 381 

17.4.3  单击元素 . 381 

17.4.4  屏幕拖动 . 382 

17.4.5  屏幕滑动 . 382 

17.4.6  拖曳操作 . 383 

17.4.7  文本输入 . 383 

17.4.8  动作链  383 

17.5  项目实战:利用 Appium抓取微信朋友圈信息  384 

17.6  小结 388

第 18章多线程和多进程爬虫  389 

18.1  线程与进程 . 389 

18.1.1  进程  389 

18.1.2  线程  390 

18.2  Python与线程 . 390 

18.2.1  使用单线程执行程序 . 390 

18.2.2  使用多线程执行程序 . 391 

18.2.3  为线程函数传递参数 . 393 

18.2.4  线程和锁 . 394 

18.3  高级线程模块(threading) . 395 

18.3.1  Thread类与线程函数 . 395 

18.3.2  Thread类与线程对象 . 396 

18.3.3  从 Thread类继承 . 398 

18.4  线程同步. 399 

18.4.1  线程锁  400 

18.4.2  信号量  402 

18.5  生产者—消费者问题与 queue模块  405 

18.6  多进程  407 

18.7  项目实战:抓取豆瓣音乐 Top250排行榜(多线程版)  408 

18.8  项目实战:抓取豆瓣音乐 Top250排行榜(多进程版)  411 

18.9  小结 412

第 19章网络爬虫框架:Scrapy 413 

19.1  Scrapy基础知识 . 413 

19.1.1  Scrapy简介 . 413 

19.1.2  Scrapy安装 . 414 

19.1.3  Scrapy Shell抓取 Web资源 . 415 

19.2  用 Scrapy编写网络爬虫  417 

19.2.1  创建和使用 Scrapy工程  417 

19.2.2  在 PyCharm中使用 Scrapy  419 

19.2.3  在 PyCharm中使用扩展工具运行 Scrapy程序 . 421 

19.2.4  使用 Scrapy抓取数据,并通过 XPath指定解析规则  423 

19.2.5  将抓取到的数据保存为多种格式的文件  424 

19.2.6  使用 ItemLoader保存单条抓取的数据  426 

19.2.7  使用 ItemLoader保存多条抓取的数据  428 

19.2.8 抓取多个 URL . 430 

19.3 Scrapy的高级应用  431 

19.3.1 处理登录页面  431 

19.3.2 处理带隐藏文本框的登录页面 . 434 

19.3.3 通过 API抓取天气预报数据  436 

19.3.4 从 CSV格式转换到 JSON格式  443 

19.3.5 下载器中间件  447 

19.3.6 爬虫中间件 . 452 

19.3.7 Item管道  455 

19.3.8 通用爬虫 . 465 

19.4 小结 474

第 20章综合爬虫项目:可视化爬虫  475 

20.1 项目简介. 475 

20.2 主界面设计和实现 . 477 

20.3 获取商品页数和每页商品数 . 478 

20.4 并发抓取商品列表 . 479 

20.5 数据库操作类  481 

20.6 情感分析. 484 

20.7 抓取和分析商品评论数据  485 

20.8 可视化评论数据  486 

20.9 小结 488