Charles是一个网络抓包工具,咱们能够用它来作App的抓包分析,获得App运行过程当中发生的全部网络请求和响应内容,这就和Web端浏览器的开发者工具Network部分看到的结果一致。程序员
相比Fiddler来讲,Charles的功能更强大,并且跨平台支持更好。因此咱们选用Charles做为主要的移动端抓包工具,用于分析移动App的数据包,辅助完成App数据抓取工做。web
1、本节目标api
本节咱们以京东App为例,经过Charles抓取App运行过程当中的网络数据包,而后查看具体的Request和Response内容,以此来了解Charles的用法。浏览器
2、准备工做缓存
请确保已经正确安装Charles并开启了代理服务,手机和Charles处于同一个局域网下,Charles代理和CharlesCA证书设置好。服务器
3、原理网络
首先Charles运行在本身的PC上,Charles运行的时候会在PC的8888端口开启一个代理服务,这个服务其实是一个HTTP/HTTPS的代理。并发
确保手机和PC在同一个局域网内,咱们可使用手机模拟器经过虚拟网络链接,也可使用手机真机和PC经过无线网络链接。ide
设置手机代理为Charles的代理地址,这样手机访问互联网的数据包就会流经Charles,Charles再转发这些数据包到真实的服务器,服务器返回的数据包再由Charles转发回手机,Charles就起到中间人的做用,全部流量包均可以捕捉到,所以全部HTTP请求和响应均可以捕获到。同时Charles还有权力对请求和响应进行修改。函数
4、抓包
初始状态下Charles的运行界面以下图所示。
Charles会一直监听PC和手机发生的网络数据包,捕获到的数据包就会显示在左侧,随着时间的推移,捕获的数据包愈来愈多,左侧列表的内容也会愈来愈多。
能够看到,图中左侧显示了Charles抓取到的请求站点,咱们点击任意一个条目即可以查看对应请求的详细信息,其中包括Request、Response等内容。
接下来清空Charles的抓取结果,点击左侧的扫帚按钮便可清空当前捕获到的全部请求。而后点击第二个监听按钮,确保监听按钮是打开的,这表示Charles正在监听App的网络数据流,以下图所示。
这时打开手机京东,注意必定要提早设置好Charles的代理并配置好CA证书,不然没有效果。
打开任意一个商品,如iPhone,而后打开它的商品评论页面,以下图示。
不断上拉加载评论,能够看到Charles捕获到这个过程当中京东App内发生的全部网络请求,以下图所示。
左侧列表中会出现一个api.m.jd.com连接,并且它在不停闪动,极可能就是当前App发出的获取评论数据的请求被Charles捕获到了。咱们点击将其展开,继续上拉刷新评论。随着上拉的进行,此处又会出现一个个网络请求记录,这时新出现的数据包请求肯定就是获取评论的请求。
为了验证其正确性,咱们点击查看其中一个条目的详情信息。切换到Contents选项卡,这时咱们发现一些JSON数据,核对一下结果,结果有commentData字段,其内容和咱们在App中看到的评论内容一致,以下图所示。
这时能够肯定,此请求对应的接口就是获取商品评论的接口。这样咱们就成功捕获到了在上拉刷新的过程当中发生的请求和响应内容。
5、分析
如今分析一下这个请求和响应的详细信息。首先能够回到Overview选项卡,上方显示了请求的接口URL,接着是响应状态Status Code、请求方式Method等,以下图所示。
这个结果和本来在Web端用浏览器开发者工具内捕获到的结果形式是相似的。
接下来点击Contents选项卡,查看该请求和响应的详情信息。
上半部分显示的是Request的信息,下半部分显示的是Response的信息。好比针对Reqeust,咱们切换到Headers选项卡便可看到该Request的Headers信息,针对Response,咱们切换到JSON TEXT选项卡便可看到该Response的Body信息,而且该内容已经被格式化,以下图所示。
因为这个请求是POST请求,咱们还须要关心POST的表单信息,切换到Form选项卡便可查看,以下图所示。
这样咱们就成功抓取App中的评论接口的请求和响应,而且能够查看Response返回的JSON数据。
至于其余App,咱们一样可使用这样的方式来分析。若是咱们能够直接分析获得请求的URL和参数的规律,直接用程序模拟便可批量抓取。
6、重发
Charles还有一个强大功能,它能够将捕获到的请求加以修改并发送修改后的请求。点击上方的修改按钮,左侧列表就多了一个以编辑图标为开头的连接,这就表明此连接对应的请求正在被咱们修改,以下图所示。
咱们能够将Form中的某个字段移除,好比这里将partner字段移除,而后点击Remove。这时咱们已经对原来请求携带的Form Data作了修改,而后点击下方的Execute按钮便可执行修改后的请求,以下图所示。
能够发现左侧列表再次出现了接口的请求结果,内容仍然不变,以下图所示。
删除Form表单中的partner字段并无带来什么影响,因此这个字段是可有可无的。
有了这个功能,咱们就能够方便地使用Charles来作调试,能够经过修改参数、接口等来测试不一样请求的响应状态,就能够知道哪些参数是必要的哪些是没必要要的,以及参数分别有什么规律,最后获得一个最简单的接口和参数形式以供程序模拟调用使用。
7、结语
以上内容即是经过Charles抓包分析App请求的过程。经过Charles,咱们成功抓取App中流经的网络数据包,捕获原始的数据,还能够修改原始请求和从新发起修改后的请求进行接口测试。
知道了请求和响应的具体信息,若是咱们能够分析获得请求的URL和参数的规律,直接用程序模拟便可批量抓取!
在 Python 中一切都是对象,毫无例外整数也是对象,对象之间比较是否相等能够用 ==,也能够用 is。 ==和 is操做的区别是:
is比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象,是否指向同一个内存地址。
==比较的是两个对象的内容是否相等,默认会调用对象的 __eq__()方法。
清楚 is和 ==的区别以后,对此也许你有可能会遇到下面的这些困惑,因而就有了这样一篇文章,试图把Python中一些隐晦的东西趴出来,但愿对你有必定的帮助。咱们先来看两段代码:
片断一:
>>> a = 256
>>> b = 256
>>> a == b
True
>>>
片断二:
>>> a = 256
>>> b = 256
>>> a is b
True
>>>
在交互式命令行执行上面两段代码,代码片断一中的 a==b返回 True很好理解,由于两个对象的值都是256,对于片断二, a is b也返回True,这说明a和b是指向同一个对象的,能够检查一下他们的id值是否相等:
>>> id(a)
8213296
>>> id(b)
8213296
>>>
结果证实他俩的确是同一个对象,指向的是同一个内存地址。那是否是全部的整数对象只要两个对象的值(内容)相等,它们就是同一个实例对象呢?换句话说,对于整数对象只要 ==返回 True, is操做也会返回 True吗?带着这个问题来看下面这两段代码:
片断一:
>>> a = 257
>>> b = 257
>>> a == b
True
>>>
片断二:
>>> a = 257
>>> b = 257
>>> a is b
False
>>>
对于257, a is b返回的居然是False,结果可能在你的意料之中,也有可能出乎你的意料,但无论怎么,咱们仍是要刨根问底,找出问题的真相。
解惑一
出于对性能的考虑,Python内部作了不少的优化工做,对于整数对象,Python把一些频繁使用的整数对象缓存起来,保存到一个叫 small_ints的链表中,在Python的整个生命周期内,任何须要引用这些整数对象的地方,都再也不从新建立新的对象,而是直接引用缓存中的对象。Python把这些可能频繁使用的整数对象规定在范围[-5, 256]之间的小对象放在 small_ints中,但凡是须要用些小整数时,就从这里面取,再也不去临时建立新的对象。由于257再也不小整数范围内,所以尽管a和b的值是同样,可是他们在Python内部倒是以两个独立的对象存在的,各自为政,互不干涉。
弄明白第一个问题后,咱们继续在Python交互式命令行中写一个函数,再来看下面这段代码:
片断一:
>>> c = 257
>>> def foo():
... a = 257
... b = 257
... print a is b
... print a is c
...
>>> foo()
True
False
呃,什么状况,是的,你没看错,片断一中的这段代码 a、b 值都是257的状况下,出现了 a is b返回 True,而 a is c 返回的 False,a、b、c的值都为257,为何会出现不一样的结果呢?这对于刚恰好不容易创建起来的认知就被完全否决了吗,那这段代码中究竟发生了什么?难道解惑一中的结论是错误的吗?
解惑二
A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the interpreter or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the interpreter command line with the ‘-c‘ option) is a code block. structure-of-a-program
为了弄清楚这个问题,咱们有必要先理解程序代码块的概念。Python程序由代码块构成,代码块做为程序的一个最小基本单位来执行。一个模块文件、一个函数体、一个类、交互式命令中的单行代码都叫作一个代码块。在上面这段代码中,由两个代码块构成, c = 257做为一个代码块,函数 foo做为另一个代码块。Python内部为了将性能进一步的提升,凡是在一个代码块中建立的整数对象,若是存在一个值与其相同的对象于该代码块中了,那么就直接引用,不然建立一个新的对象出来。Python出于对性能的考虑,但凡是不可变对象,在同一个代码块中的对象,只有是值相同的对象,就不会重复建立,而是直接引用已经存在的对象。所以,不只是整数对象,还有字符串对象也遵循一样的原则。因此 a is b就理所固然的返回 True了,而 c和 a不在同一个代码块中,所以在Python内部建立了两个值都是257的对象。为了验证刚刚的结论,咱们能够借用 dis模块从字节码的角度来看看这段代码。
能够看出两个257都是从常量池的同一个位置 co_consts[1]获取的。
总结
一番长篇大论以后,得出两点结论:一、小整数对象[-5,256]是全局解释器范围内被重复使用,永远不会被GC回收。二、同一个代码块中的不可变对象,只要值是相等的就不会重复建立新的对象。彷佛这些知识点对平常的工做一点忙也帮不上,由于你根本不会用 is来比较两个整数对象的值是否相等。那为何还要拿出来讨论呢?嗯,程序员学知识,不该该浅尝辄止,要充分发挥死磕到底的精神。
手机爬虫很是有意思,并且能够爬取的数据很是多,固然还有不少东西要学。之后我也会写一些实战的有趣案例给你们。
若是你也是想要学习Python爬虫的话,不妨点击文章底部左侧的了解更多看看,为你分享的一个三大案列入门Python爬虫的课程。
本篇文章的分享到此结束,文章来源网络,若有侵权,请联系删除。