├── LICENSE ├── doc ├── fiddler.md └── 爬虫基本原理.md ├── python爬虫.png └── readme.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 liuzhijun 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /doc/fiddler.md: -------------------------------------------------------------------------------- 1 | # 使用 Fiddler 抓包分析微信公众号文章请求过程 2 | 3 | 上一节我们熟悉了 Requests 基本使用方法,配合 Chrome 浏览器实现了一个简单爬虫,但因为微信公众号的封闭性,微信公众平台并没有对外提供 Web 端入口,只能通过手机客户端接收、查看公众号文章,所以,为了窥探到公众号背后的网络请求,我们需要借以代理工具的辅助。 4 | 5 | HTTP代理工具又称为抓包工具,主流的抓包工具 Windows 平台有 Fiddler,macOS 有 Charles,阿里开源了一款工具叫 AnyProxy。它们的基本原理都是类似的,就是通过在手机客户端设置好代理IP和端口,客户端所有的 HTTP、HTTPS 请求就会经过代理工具,在代理工具中就可以清晰地看到每个请求的细节,然后可以分析出每个请求是如何构造的,弄清楚这些之后,我们就可以用 Python 模拟发起请求,进而得到我们想要的数据。 6 | 7 | 8 | 9 | ![](https://user-gold-cdn.xitu.io/2017/12/21/16076ebe7c39555e?w=400&h=189&f=png&s=16585) 10 | 11 | 12 | Fiddler 下载地址是 [https://www.telerik.com/download/fiddler](https://www.telerik.com/download/fiddler),安装包就 4M 多,在配置之前,首先要确保你的手机和电脑在同一个局域网,如果不在同一个局域网,你可以买个随身WiFi,在你电脑上搭建一个极简无线路由器。安装过程一路点击下一步完成就可以了。 13 | 14 | ### Fiddler 配置 15 | 16 | 选择 **Tools > Fiddler Options > Connections** 17 | 18 | Fiddler 默认的端口是使用 8888,如果该端口已经被其它程序占用了,你需要手动更改,勾选 Allow remote computers to connect,其它的选择默认配置就好,配置更新后记得重启 Fiddler。一定要重启 Fiddler,否则代理无效。 19 | 20 | 21 | ![](https://user-gold-cdn.xitu.io/2017/12/21/16076ec4c6769b0e?w=545&h=332&f=jpeg&s=59210) 22 | 23 | 接下来你需要配置手机,我们以 Android 设备为例,现在假设你的手机和电脑已经在同一个局域网(只要连的是同一个路由器就在同局域网内),找到电脑的 IP 地址,在 Fiddler 右上角有个 Online 图标,鼠标移过去就能看到IP了,你也可以在CMD窗口使用 `ipconfig` 命令查看到 24 | 25 | 26 | ![](https://user-gold-cdn.xitu.io/2017/12/21/16076ec782894dc7?w=545&h=229&f=png&s=11588) 27 | 28 | ### Android 手机代理配置 29 | 30 | 进入手机的 WLAN 设置,选择当前所在局域网的 WiFi 链接,设置代理服务器的 IP 和端口,我这是以小米设备为例,其它 Android 手机的配置过程大同小异。 31 | 32 | 33 | ![](https://user-gold-cdn.xitu.io/2017/12/21/16076ecb29d33fed?w=606&h=419&f=png&s=33194) 34 | 35 | 测试代理有没有设置成功可以在手机浏览器访问你配置的地址:http://192.168.31.236:8888/ 会显示 Fiddler 的回显页面,说明配置成功。 36 | 37 | 38 | ![](https://user-gold-cdn.xitu.io/2017/12/21/16076ecef988458a?w=545&h=266&f=png&s=28894) 39 | 40 | 41 | 现在你打开任意一个HTTP协议的网站都能看到请求会出现在 Fiddler 窗口,但是 HTTPS 的请求并没有出现在 Fiddler 中,其实还差一个步骤,需要在 Fiddler 中激活 HTTPS 抓取设置。在 Fiddler 选择 **Tools > Fiddler Options > HTTPS > Decrypt HTTPS traffic**, 重启 Fiddler。 42 | 43 | 44 | ![](https://user-gold-cdn.xitu.io/2017/12/21/16076ed2835c948a?w=539&h=260&f=jpeg&s=24448) 45 | 46 | 47 | 为了能够让 Fiddler 截取 HTTPS 请求,客户端都需要安装且信任 Fiddler 生成的 CA 证书,否则会出现“网络出错,轻触屏幕重新加载:-1200”的错误。在浏览器打开 Fiddler 回显页面 http://192.168.31.236:8888/ 下载 **FiddlerRoot certificate**,下载并安装证书,并验证通过。 48 | 49 | 50 | ![](https://user-gold-cdn.xitu.io/2017/12/21/16076ed5fe54365c?w=926&h=283&f=jpeg&s=65828) 51 | 52 | iOS下载安装完成之后还要从 **设置->通用->关于本机->证书信任设置** 中把 Fiddler 证书的开关打开 53 | 54 | 55 | 56 | ![](https://user-gold-cdn.xitu.io/2017/12/21/16076ed87c067644?w=637&h=534&f=png&s=96133) 57 | 58 | 59 | Android 手机下载保存证书后从系统设置里面找到系统安全,从SD卡安装证书,如果没有安装证书,打开微信公众号的时候会弹出警告。 60 | 61 | 62 | ![](https://user-gold-cdn.xitu.io/2017/12/21/16076edb9b11af6e?w=471&h=407&f=jpeg&s=18776) 63 | 64 | 65 | 66 | 67 | 68 | 至此,所有的配置都完成了,现在打开微信随便选择一个公众号,查看公众号的所有历史文章列表。微信在2018年6月份对 iOS 版本的微信以及部分 Android 版微信针对公众号进行了大幅调整,改为现在的信息流方式,现在要获取某个公众号下面「所有文章列表」大概需要经过以下四个步骤: 69 | 70 | 71 | ![](https://user-gold-cdn.xitu.io/2018/9/8/165b6bfe0e38ebe1?w=1226&h=462&f=jpeg&s=101256) 72 | 73 | 如果你的微信版本还不是信息流方式展示的,那么应该是Android版本(微信采用的ABTest,不同的用户呈现的方式不一样) 74 | 75 | 76 | ![](https://user-gold-cdn.xitu.io/2018/9/8/165b6c1674c35006?w=933&h=658&f=jpeg&s=120420) 77 | 78 | 同时观察 Fiddler 主面板 79 | 80 | 81 | ![](https://user-gold-cdn.xitu.io/2017/12/21/16076f01e2d43cc4?w=657&h=222&f=gif&s=16040) 82 | 83 | 进入「全部消息」页面时,在 Fiddler 上已经能看到有请求进来了,说明公众号的文章走的都是HTTP协议,这些请求就是微信客户端向微信服务器发送的HTTP请求。 84 | 85 | 注意:第一次请求「全部消息」的时候你看到的可能是一片空白: 86 | 87 | 88 | ![](https://user-gold-cdn.xitu.io/2018/9/8/165b6ca355fc077a?w=748&h=510&f=jpeg&s=21348) 89 | 90 | 在Fiddler或Charles中看到的请求数据是这样的: 91 | 92 | 93 | ![](https://user-gold-cdn.xitu.io/2018/9/8/165b6cb6368e4386?w=1840&h=666&f=png&s=154258) 94 | 95 | 这个时候你要直接从左上角叉掉重新进入「全部消息」页面。 96 | 97 | 现在简单介绍一下这个请求面板上的每个模块的意义。 98 | 99 | 100 | ![](https://user-gold-cdn.xitu.io/2017/12/21/16076ee298ad70f6?w=1146&h=594&f=jpeg&s=135253) 101 | 102 | 这样说明这个请求被微信服务器判定为一次非法的请求,这时你可以叉掉该页面重新进入「全部消息」页面。不出意外的话就能正常看到全部文章列表了,同时也能在Fiddler中看到正常的数据请求了。 103 | 104 | 我把上面的主面板划分为 7 大块,你需要理解每块的内容,后面才有可能会用 Python 代码来模拟微信请求。 105 | 106 | 1、服务器的响应结果,200 表示服务器对该请求响应成功 107 | 2、请求协议,微信的请求协议都是基 于HTTPS 的,所以前面一定要配置好,不然你看不到 HTTPS 的请求。 108 | 3、微信服务器主机名 109 | 4、请求路径 110 | 5、请求行,包括了请求方法(GET),请求协议(HTTP/1.1),请求路径(/mp/profile_ext...后面还有很长一串参数) 111 | 6、包括Cookie信息在内的请求头。 112 | 7、微信服务器返回的响应数据,我们分别切换成 TextView 和 WebView 看一下返回的数据是什么样的。 113 | 114 | 115 | TextView 模式下的预览效果是服务器返回的 HTML 源代码 116 | 117 | 118 | ![](https://user-gold-cdn.xitu.io/2017/12/21/16076ee4cce9a909?w=750&h=229&f=jpeg&s=28314) 119 | 120 | WebView 模式是 HTML 代码经过渲染之后的效果,其实就是我们在手机微信中看到的效果,只不过因为缺乏样式,所以没有手机上看到的美化效果。 121 | 122 | 123 | ![](https://user-gold-cdn.xitu.io/2017/12/21/16076ee68550314d?w=753&h=213&f=jpeg&s=18543) 124 | 125 | 如果服务器返回的是 Json格式或者是 XML,你还可以切换到对应的页面预览查看。 126 | 127 | 128 | ### 小结 129 | 130 | 配置好Fiddler的几个步骤主要包括指定监控的端口,开通HTTPS流量解密功能,同时,客户端需要安装CA证书。 -------------------------------------------------------------------------------- /doc/爬虫基本原理.md: -------------------------------------------------------------------------------- 1 | # 微爬虫的基本原理 2 | 3 | 4 | 所谓爬虫就是一个自动化数据采集工具,你只要告诉它要采集哪些数据,丢给它一个 URL,就能自动地抓取数据了。其背后的基本原理就是爬虫程序向目标服务器发起 HTTP 请求,然后目标服务器返回响应结果,爬虫客户端收到响应并从中提取数据,再进行数据清洗、数据存储工作。 5 | 6 | 7 | ### 爬虫的基本流程 8 | 9 | 爬虫的基本流程其实就是一个 HTTP 请求的过程,以浏览器访问一个网址为例,从用户输入 URL 开始,客户端通过 DNS 解析查询到目标服务器的 IP 地址,然后与之建立 TCP 连接,连接成功后,浏览器构造一个 HTTP 请求发送给服务器,服务器收到请求之后,从数据库查到相应的数据并封装成一个 HTTP 响应,然后将响应结果返回给浏览器,浏览器对响应内容进行数据解析、提取、渲染并最终展示在你面前。 10 | 11 | 12 | 13 | 14 | ![](https://user-gold-cdn.xitu.io/2017/12/18/16068a321d8613c3?w=818&h=365&f=jpeg&s=32929) 15 | 16 | 17 | HTTP 协议的请求和响应都必须遵循固定的格式,只有遵循统一的 HTTP 请求格式,服务器才能正确解析不同客户端发的请求,同样地,服务器遵循统一的响应格式,客户端才得以正确解析不同网站发过来的响应。 18 | 19 | ### HTTP 请求格式 20 | 21 | HTTP 请求由请求行、请求头、空行、请求体组成。 22 | 23 | 24 | ![](https://user-gold-cdn.xitu.io/2017/12/23/1607f417a70d604f?w=478&h=220&f=jpeg&s=23091) 25 | 请求行由三部分组成: 26 | 27 | 1. 第一部分是请求方法,常见的请求方法有 GET、POST、PUT、DELETE、HEAD 28 | 2. 第二部分是客户端要获取的资源路径 29 | 3. 第三部分是客户端使用的 HTTP 协议版本号 30 | 31 | 请求头是客户端向服务器发送请求的补充说明,比如 User-Agent 向服务器说明客户端的身份。 32 | 33 | 请求体是客户端向服务器提交的数据,比如用户登录时需要提高的账号密码信息。请求头与请求体之间用空行隔开。请求体并不是所有的请求都有的,比如一般的GET都不会带有请求体。 34 | 35 | 上图就是浏览器登录豆瓣时向服务器发送的HTTP POST 请求,请求体中指定了用户名和密码。 36 | 37 | 38 | ### HTTP 响应格式 39 | 40 | HTTP 响应格式与请求的格式很相似,也是由响应行、响应头、空行、响应体组成。 41 | 42 | ![](https://user-gold-cdn.xitu.io/2017/12/23/1607f4b5edd376b5?w=478&h=220&f=jpeg&s=24097) 43 | 44 | 响应行也包含三部分,分别是服务端的 HTTP 版本号、响应状态码、状态说明,响应状态码常见有 200、400、404、500、502、304 等等,一般以 2 开头的表示服务器正常响应了客户端请求,4 开头表示客户端的请求有问题,5 开头表示服务器出错了,没法正确处理客户端请求。状态码说明就是对该状态码的一个简短描述。 45 | 46 | 第二部分就是响应头,响应头与请求头对应,是服务器对该响应的一些附加说明,比如响应内容的格式是什么,响应内容的长度有多少、什么时间返回给客户端的、甚至还有一些 Cookie 信息也会放在响应头里面。 47 | 48 | 第三部分是响应体,它才是真正的响应数据,这些数据其实就是网页的 HTML 源代码。 49 | 50 | ### 小结 51 | 52 | 这仅仅只是一个爬虫基本原理的介绍,涉及的 HTTP 协议的内容也非常有限,但不可能用一篇文章事无巨细的介绍完,因为 HTTP 协议是一个很大的话题,用一本书也写不完,深入了解推荐两本书《图解HTTP》、《HTTP权威指南》。 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /python爬虫.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzjun567/PythonCrawlerGuide/275897a38c17be121901e797358a4da35fa7ad5c/python爬虫.png -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 「Python爬虫学习+面试指南」一份涵盖大部分Python爬虫工程师所需要掌握的核心知识。 4 | 5 | 6 | ![python爬虫](https://foofish.net/images/python3爬虫.png) 7 | 8 | 9 | # 目录 (善用Ctrl+F) 10 | 11 | 内容会持续更新,敬请关注 12 | 13 | 14 | - Python核心基础 15 | - [python内置模块urllib介绍](https://foofish.net/python-urllib.html) 16 | - [Python 处理 HTML 转义字符的5种方式](https://foofish.net/pycon-html-escape.html) 17 | - [Python 中的字符编码为什么那么蛋疼?](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650366836&idx=1&sn=da43cd0208b6bb7b1c51c5ced3ac1027&chksm=be9cd82089eb5136830ba25a54ae57a5fc1ca105b68718fcf4d9f100ddb1ea18120990c47816#rd) 18 | - [Python3中,是如何解决棘手的字符编码问题的?](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650366846&idx=1&sn=ff9f9f4b7bf8a59afa39b60707ed35c9&chksm=be9cd82a89eb513cc96630c2f1072519d85f474a9f1028749150306110d539cb0dba410b5859#rd) 19 | - [字符编码的前世今生](https://foofish.net/python-character-encode.html) 20 | - [正则表达式完全指南(上)](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650366958&idx=1&sn=044008c9475421feddf428c6ce5bf481&chksm=be9cd8ba89eb51acd8404bda5c2f5db660bf730919664d811a3487ae6b4e49760df67bd5736a#rd) 21 | - [正则表达式完全指南(下)](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650366967&idx=2&sn=a5756059ba031e5c1407587987dbd3ba&chksm=be9cd8a389eb51b5d597c182cf2e6e361408832ea749cde8dad2b7892c978c6aa303286e60dc#rd) 22 | - [python正则表达式的5个小贴士](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650367680&idx=1&sn=2e8ef8bcf4dc176c46376508cb5a8fa7&chksm=be9cdd9489eb54822dc5993ff71050ca9011aff07fdf642b3eccdee7e20dc2efad9f21fb1a63#rd) 23 | 24 | - HTTP协议 25 | 26 | - [快速理解HTTP协议](https://foofish.net/understand-http.html) 27 | - [HTTPS涉及哪些加密算法](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650366788&idx=1&sn=d3280f43e87dff3b461342ea225f4431&chksm=be9cd81089eb51067bd6db545b6f013189bb8e4909b3e0742a357403698f49c46e73e1b3b9c4#rd) 28 | - [这样理解HTTPS更容易](https://showme.codes/2017-02-20/understand-https/) 29 | - [HTTPS 是如何保证安全的?](https://www.jianshu.com/p/b894a7e1c779) 30 | 31 | 32 | - 爬虫工具实战 33 | 34 | 35 | - [用 Python 处理 HTML 转义字符的5种方式](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650367619&idx=1&sn=0ce381e43cbbe4b0646d0214e461ce16&chksm=be9cddd789eb54c1838716d0a00fee71c2d1b1f42b09603af937ee9b274adf50b652bc88720f#rd) 36 | - [requests 快速上手](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650366885&idx=1&sn=37d9c9ff3ad777ac03259805abd84ae3&chksm=be9cd8f189eb51e7affb6c127429b2d855342e19cb8d1b1fb97dd549fe66f03febde84182db7&token=474682597&lang=zh_CN#rd) 37 | -[用BeautifulSoup解析HTML文本](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650366919&idx=1&sn=1b36a9f2c0921cdeac52942ec591a923&chksm=be9cd89389eb5185d32ab5e9034c2e68ddff6c2f8ddeaee1662499d73baf113fd5ec645548f8#rd) 38 | - [json](https://realpython.com/python-json/) 39 | 40 | 41 | - 抓包工具 42 | 43 | - [] 44 | - [爬虫必备的4款抓包神器](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650371858&idx=2&sn=bff71877e92abf6c77f3c8c6f86039b1&chksm=be9ccc4689eb455047bd7c29fd51958bc3d5e4e51a98eabe15c02c9684063dd80c4ac9a46ea6#rd) 45 | - [mitmproxy快速上手](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650368995&idx=1&sn=3a65334f44db0e55f639d2cd5d242150&chksm=be9cd0b789eb59a147be4c056a44c2281881012a1d3e390e2ea445fde7293a3b9f7430b33583#rd) 46 | - [使用 Fiddler 抓包分析微信公众号文章请求过程](./doc/fiddler.md) 47 | - [如何使用抓包调试工具Charles](https://ningyu1.github.io/site/post/84-charles/) 48 | - [如何通俗易懂地解释正向代理与反向代理](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650366790&idx=1&sn=3b5d390d07445745e067334365873a18&chksm=be9cd81289eb510499dd029f91a302a2e08f0c4bbed13c7a47d33d2f1b6a91eebc6199b141b9&token=559698205&lang=zh_CN#rd) 49 | 50 | 51 | 52 | - 爬虫实战 53 | 54 | - [Python爬虫模拟知乎登录](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650366863&idx=1&sn=223ef8bea35082a4915b1ec5bf85f5f4&chksm=be9cd8db89eb51cdc2e46c99159b5162fcfd75090fc5a8b1bd9c7065dadcfe44fd8ad7fdb6ca&token=559698205&lang=zh_CN#rd) 55 | - [Python 爬虫:把廖雪峰教程转换成 PDF 电子书](https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650366762&idx=1&sn=bfe7c2b4df42ff8669d6963602a0a9e1&chksm=be9cd87e89eb5168232334ef8cb164341138c6b8223464fe90eaf165691ba0751dfe1bec9f00&scene=178#rd) 56 | 57 | - 分词工具 58 | 59 | - [结巴分词快速入门指南](https://foofish.net/jieba.html) 60 | - [pkuseg:一个多领域中文分词工具包 ](https://github.com/lancopku/pkuseg-python) 61 | 62 | - 分布式爬虫 63 | 64 | - [https://foofish.net/celery-toturial1.html](https://foofish.net/celery-toturial1.html) 65 | - [为什么说Python多线程是鸡肋?](https://foofish.net/thread.html) 66 | - python多线程真的很鸡肋吗? 67 | 68 | - 日常工具 69 | 70 | - [git简明教程,木有高深内容](https://rogerdudler.github.io/git-guide/index.zh.html) 71 | --------------------------------------------------------------------------------