关于爬虫,看这一篇就够了!

阅读本篇预计需要 6 分钟
本文来自公众号:DeveloperPython
作者:马超

抓包,我相信很多程序员对这个都不陌生。但真正抓过包或者了解其原理的并没有几个。

所以,这次我分享一篇关于抓包的文章,也算是对之前文章的一个重新梳理。

其中会介绍几款简单易用的工具以及针对目前互联网主流的 Http 和 Https 网络包进行抓取并分析,最后也会分享下手机抓包得技术。

目前市面上比较火的几个抓包工具有:Charles、Fiddler 以及 Wireshark。

1、抓包工具

Fiddler

这个是我之前在 Windows 时代经常用的工具。而且当时的 Fiddler 足以满足了我的简单抓包需求。

话说现在都更新到 Fiddler 4 了,如果用 Windows 的朋友可以试试这个。

Charles

自从换了 Mac 之后我就开始用这个工具,但有一点比较麻烦的就是这个款软件是收费的。

不过在我大天朝,如果你不是土豪那么就找找破解版。

Wireshark

这个工具比较牛逼,不过我不经常用。这工具可以详细的抓包网络请求的三次握手,同时也支持 Spdy、tcp 直连等等的网络协议。

如果你需要对网络做一个比较深的抓取,那么建议使用这个。

(ps: 后台回复对应工具,会拿到破解版的下载地址)

2、抓取 Http、Https 包

2.1、 Http 包的步骤:

2.1.1、 清理 Charles 列表,让抓包更加清晰

image

2.1.2、 以我的 CSDN 为例 (m694449212),在 Chrome 中打开我的博客,抓到需要的包

image

在 Structure 中找到 csdn 的包,如上图。

2.1.3、 分析包

image

2.1.4、查看请求头

image

其中比较重要的是 Cookie 字段,这是网站为了表示用户身份、进行 Session 跟踪而存储在用户本地终端上的数据(通常是加密的)。

其次,Cookie 在我们爬虫的时候也是一个必不可少的东西,那么如何自动获取 Cookie 呢?后面会讲到。

2.1.5、 拿到返回的数据 Response

image

CSDN 博客的返回数据是 Html 的格式,其中每篇文章的地址都是通过跳转 href 来做的,因此我们可以通过正则表达式匹配,或者 XPath 来拿到 Href 再拼接 Host 生成一个绝对路径的地址:

http://blog.csdn.net/m694449212/artlcle/details/31806139.这就是我的Blog中的一篇文章。

2.1.6、获取 Cookie ,我以往的经验:

a. 获取 Cookie 的时候,首先需要保证我们的浏览器环境是干净的,我说的干净其实就是 清除当前浏览器保存的 Cookie,并重启浏览器。

b. 重启之后我们访问 www.csdn.net,当前 Host 的 Request 就不会包含Cookie,那么 Cookie 在哪呢?其实细心点的会发现 Cookie 在 Response 的 Headers > set-cookie 字段里面,并在下次请求中使用。

也就是说 Cookie 在大多数情况下都是服务器生成的,然后在首次请求的时候返回给客户端使用。

c. 那么,当我们做登录操作的时候携带 Cookie 在请求 Headers 中,登录成功之后这个 Cookie 就会被服务器标记为有效值。之后我们的所有请求都携带这个 Cookie 就可以正常的完成所有请求。
image

提提神,继续看


2.2、Https 包的步骤

2.2.1、 Https 简介

SSL 相信大家都不陌生,其实 Https 就是在 Http 基础上通过 SSl 协议进行加密之后的网络传输。

其中通过非对称和对称加密算法来对密码和数据进行加密。具体看下图:

image

1. Client 明文将自己支持的一套加密规则、一个随机数(Random_c)发送给服务器。

2. Server 返回自己选择的加密规则、CA 证书(服务器地址、加密公钥、以及证书颁发机构),外加一个通过加密规则和 HASH 算法生成的随机数(Random_S)

3. Client 收到 Server 的消息之后会:

a:验证证书(地址是否是正在访问的和机构是否合法)
b:自己生成一个随机的密码(Pre_master)并使用CA证书中的加密公钥进行加密生成enc_pre_master
c:计算出一个对称加密的enc_key,通过Random_C、Random_S、Pre_master。
d:生成握手信息:使用约定好的Hash算法计算握手信息,并通过enc_key和约定好的加密算法对消息进行加密

4. Client 将 enc_pre_master,加密之后的握手信息发送给 Server

5. Sever 收到消息之后

a: 收到enc_pre_master之后,会通过私钥进行解密(非对称加密算法)得到pre_master
b: 通过pre_masrer、Random_C、Random_S计算得到协商密码 enc_key
c: 通过enc_key解密握手信息,验证HASH是否和客户端发来的一致
d: 生成握手信息同样使用enc_key和约定好的加密算法

6. Server 发送握手信息给 Client,也就是说 Server 验证通过了 Client,并在此发送信息给 Client 来让其验证自己

7. 客户端拿到握手信息,解密并计算握手信息的 HASH,如果与服务端发来的 HASH 一致,此时握手过程结束

8. 正常加密通信,握手成功之后,所有的通信数据将由之前协商密钥 enc_key 及约定好的算法进行加密解密。

其中,Https 使用到的加密算法如下:

  • 非对称加密: RSA、DSA/DSS

  • 对称加密:AES、RC4、3DES

  • HASH 算法:MD5、SHA1、SHA256

2.2.2、Charles 抓取 Https 原理

Charles 本身就是一个协议代理工具,在上面的Https 原理上,客户端和服务器的所有通信都被 Charles 捕获到。

如下图:

image

主要步骤如下:

  1. Charles 捕获 Client 发送给 Server 的请求,并伪装成客户端向服务器发送握手请求

  2. 服务器响应,Charles 获取到服务器的 CA 证书,并用根证书公钥进行解密,获取到服务器的 CA 证书公钥。然后 Charles 伪造自己的 CA 证书,伪装为服务器的 CA 证书发送给服务器

  3. 客户端收到返回之后,和上面讲的过程一样,证书校验、生成密码、并使用 Charles 伪装的证书公钥进行加密,并生成 Https 通信的协商密码 enc_key

  4. Charles 捕获到 Client 发来的重要信息,并使用自己伪造的证书私钥将密文解密,获取到 enc_key,然后 Charles 使用服务器之前返回的证书公钥对明文进行加密并发送给服务器

  5. 与之前一样,服务器收到消息之后,用私钥解开并建立信任,然后发送加密的握手信息

  6. Charles 截获服务器发来的握手密文,并用对称密钥解开,再用自己伪造证书的私钥加密传给客户端

  7. 客户端拿到加密信息之后,用公钥解开,验证 HASH。握手过程正式完成,客户端和服务器就这样建立了“信任”

其实在整个过程中,最重要的就是 enc_key,由于Charles 从一开始伪造并获取了 enc_key,所以整个通信过程中 Charles 都充当第三者,所有信息对其来讲都是透明的。

其次就是根证书,这是 https 一个信任链的开始。这也是 Charles 伪造的 CA 证书能获得双方信任的关键。

2.2.3、演示 Charles 抓取 https

原理清楚了,其实操作就很简单了,操作的核心点就是根证书。

  • 安装根证书(Charles Root Certificate)
image
  • 让系统信任证书
image
  • 接下来将需要抓的 Https 链接添加到 Charles SSL 代理规则中,443 是 https 的默认端口
image

当然,你也可以像我一样,使用 *.443 来抓取所有的 Https 包。

  • 通过浏览器访问自己要抓的链接,这样所有的 Https 都可以像 HTTP 一样明文的展示在我们面前

    image

3、手机抓包

手机抓包的原理其实也很简单,让手机和抓包工具处于同一个局域网,并将手机的 Wifi Proxy 手动代理到电脑的 IP 和 Charles 设置的抓包端口上,具体操作可以参考:http://blog.csdn.net/richer1997/article/details/52198024

我这里主要讲一下手机端抓取 Https 的方式,其实也和浏览器一样:

  • 首先需要安装 Charles 的根证书到手机上
image
  • 点击之后,会弹出让你在手机上配置代理到对一个 ip 和端口,之后通过手机浏览器打开 chls.pro/ssl 来安装
image
  • 使用手机访问该链接之后,会自动被识别为证书,并跳转到安装界面
image
  • 之后就类似于 PC 端抓包原理一样,手机端的证书被作为根证书使用,并通过 Charles 拿到 enc_key 将所有通信过程透明化

4、总结

抓包的用处其实很多,有时候可以用来调试我们的接口、有时候也可以用来做一些对工作有益的事情。

感谢大家阅读本篇。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容