mitmdump可以对接Python脚本,在Python脚本中可以修改请求报文和响应报文。
在命令行模式pip install mitmproxy就可以了
直接用手机连接电脑的WiFi就可以了
第一步:手机连接WiFi
第二步:点击手机WiFi里的代理设置,选择手动设置代理
第三步:服务器ip填电脑的ip(不知道就在命令行模式下输入ipconfig查看),端口填8080(默认端口)
##经过以上三步,你的手机所有的网络请求,响应,都会流经mitmproxy。现在我们没有打开mitmproxy服务,所有手机暂时是上不了网的。
在命令行模式下输入mitmdump就可以启动mitmproxy服务。现在所有手机上的网络请求和响应都会被抓包。
##现在手机可以上网了,只要有网络请求和响应,在命令行界面上就会显示出来。
脚本文件保存为 script.py (随便什么文件名都可以,只要是py后缀就可以了)
接下来编写 script.py
# 修改请求的话,函数名必须为request,参数必须为flow,不然执行不了。
# flow就是我们利用mitmproxy抓包抓取下来的请求报文。
def request(flow):
flow.request.url = 'http://httpbin.org/get'
现在启动mitmproxy服务和Python脚本,在命令行界面输入mitmdump -s script.py
虽然脚本里的函数只有一行代码,但是现在所有的网络请求url都被修改为了 httpbin.org/get 了,可以尝试利用手机浏览器输入任何网站。(如果打开app也是一样的道理,请求被发送到 httpbin.org/get 了,所以你手机里需要上网的app现在是用不了的。)
如果单单是修改url,有一些网站会拒绝响应。可以利用request函数修改更多的请求报文信息。
def request(flow):
flow.request.headers['user-agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.108 Safari/537.36 MZBrowser/7.9.6'
flow.request.headers['accept'] = '*/*'
flow.request.headers['referer'] = 'https://www.qq.com/'
flow.request.headers['accept-encoding'] = 'gzip, deflate, br'
flow.request.headers['accept-language'] = 'zh-CN,en-US;q=0.8'
flow.request.url = 'https://www.qq.com'
抓包工具怎么用,看个人的需求,如果是用来实现爬虫,mitmproxy就和浏览器的开发者工具一样。
最基本的代码就是:
import requests
def request(flow):
## 获取请求的url
url = flow.request.url
## 获取请求的headers(伪装成由手机发起请求)
headers = flow.request.headers
data = requests.get(url=url, headers=headers)
至于后面的data怎么处理,看个人需求。
第一步:连接手机
第二步:写代码
第三步:mitmdump -s file.py
import requests
## num变量用来设置文件名
num = 1
def request(flow):
## 获取请求url和headers
url = flow.request.url
headers = flow.request.headers
global num
## 抓包之后自行观察,得出小视频的抓取逻辑
if 'ixigua' in url:
filename = str(num) + '.mp4'
resp = requests.get(url=url, headers=headers, stream=True)
with open(filename, 'wb') as f:
f.write(resp.content)
num += 1
或者可以用response方法。效果和用request方法一样。
其中的区别就是,如果是写request方法,手机app此时还没发送请求到“抖音服务器”(被mitmproxy截取了);
如果是response方法,此时,“抖音服务器”已经把响应发送回来了,我们mitmproxy截取它的响应报文,这样我们PC端就不需要再发送请求了。直接把响应报文的主体拿来使用。
## num变量用来设置文件名
num = 10000
def response(flow):
## 获取请求url
url = flow.request.url
global num
## 抓包之后自行观察,得出小视频的抓取逻辑
if 'ixigua' in url:
filename = str(num) + '.mp4'
resp = flow.response
with open(filename, 'wb') as f:
f.write(resp.content)
num += 1
一定要注意def request(flow)和def response(flow)的区别
如果在request方法中,flow.response是没有任何内容返回的,因为此时请求还没有转发出去。
## num变量用来设置文件名
num = 10000
def request(flow): ##注意这一行,把response改为request
## 获取请求url
url = flow.request.url
global num
## 抓包之后自行观察,得出小视频的抓取逻辑
if 'ixigua' in url:
filename = str(num) + '.mp4'
resp = flow.response ##注意这一行,request方法中,flow.response是没有内容返回的
with open(filename, 'wb') as f:
f.write(resp.content)
num += 1
保存下来的只是一个空文件。
就这样,动动手指就可以把抖音的小视频下载到电脑上。(这个不算是爬虫,因为没有涉及到自动操作,需要人为地用手指操作手机屏幕,如果需要自动化操作,可以利用Appium)
如果要下载音乐或者其他什么的,也是一样的原理。音乐的代码就不放出来了,因为涉及到版权的问题。
由于Windows中不能使用mitmproxy,只能用mitmdump,(虽然在抓包功能上是一样的,但是在命令行界面看mitmdump真的看得头晕)可以使用charles来抓包来进行分析,charles配置连接手机的方法也是一样的。
(Android系统和IOS系统是一样的)
1.下载charles
2.PC端下载charles证书(然后把设置为“受信任的根证书)
3.在移动端(手机)下载charles证书
4.在移动端连接局域网(再手动设置IP,端口)
在charles中,当有流量经过的时候,Host会高亮显示,如下图黄色的,分析起来比较方便。
分析完之后,用mitmdump来对接python脚本,最终就可以实现把移动端的数据,手动抓取到PC端了。