I.はじめの説明
mitmproxyは、コンソール操作の形であることを除いて、フィドラー、チャールズ機能に似てHTTPとHTTPSパケットキャプチャプログラム、です。
mitmproxy二つの関連コンポーネントがあります。一つは、それがmitmproxyコマンドラインインタフェースで、mitmdumpあり、我々はそれを使用することができ、リスニングプロセスはPythonで実装した後、Pythonのスクリプトをドッキング。もう一つは、それは我々が明確に要求mitmproxyキャプチャを観察することができ、それを通してWebプログラム、である、mitmwebです。
mitmproxyの特徴:
1、インターセプトHTTPおよびHTTPSリクエストとレスポンス
2、HTTPセッションを保存し、分析
図3に示すように、アナログクライアントが要求を送信し、サーバは、アナログに対する応答を返します
4、指定されたサーバーへのリバースプロキシ転送トラフィックの使用
5、MacとLinuxの透過プロキシのサポート
図6に示すように、HTTP要求および応答のPythonリアルタイム処理を使用して
mitmproxy実行し、自分のPC上で、PCのポートは8080で実行し、実際にHTTP / HTTPSプロキシであるプロキシサービスを開きます。
プロキシを設定するLANで電話とPCは、そのインターネットトラフィックのパケットがmitmproxy流れることになるのアクセスに携帯電話は、実サーバを楽しみにこれらのパケットを行くmitmproxyとき、プロキシアドレスmitmproxyで、サーバが再びパケットを返します。 mitmproxyはmitmproxyが仲介する役割と同等の再生ように、バック電話に転送すべての要求および応答をクロール、加えてこの方法はまたmitmproxyインターフェース、要求と応答の特定のコンテンツへのクロールは、Pythonで直接処理することができることができます例えば:私たちは、応答は、このように解析したデータを格納する処理を完了し、その後、データベースに保存され、直接解決することができます取得した後。
第二に、インストールと設定
ピップmitmproxyをインストール
インストールがエラータイムアウトを失敗した場合は、プラスのパラメータ--timeout数回または秒数を試してみてください
10000インストールmitmproxy --timeoutピップ
注:コンソールは、Windowsのインターフェイスmitmproxyをサポートしていませんが、mitmdumpとmitmwebを使用することができます。
これら三つのコマンドの一貫した機能、およびカスタムスクリプトを読み込むことができ、唯一の違いは、対話型インタフェースです。
mitmproxy
開始するコマンドの後に、コマンドライン・インタフェースを提供し、ユーザは、リアルタイム要求が発生する参照し、要求されたデータを表示するために、要求コマンドを介して濾過することができます。
mitmweb
開始するコマンドの後、GUIの相互作用を介して、ユーザーがリアルタイムの要求が発生見ることができ、及びフィルタ要求に要求を閲覧データをWebインタフェースを提供します。
mitmdump
開始するコマンドの後、何のインタフェースが存在しない、プログラムが静かに動作しますので、フィルタリングの要求を提供するデータを表示できない、あなただけ静かに働いて、カスタムスクリプトを組み合わせることができmitmdump。
証明書の設定
図に示すように、ファイル名を指定して実行コマンド生成mitmdump CA証明書およびCA証明書は、ディレクトリ.mitmproxyユーザーディレクトリで見つかりました。
Windowsプラットフォームでの証明書をインストールします。
以下のようにmitmproxy-ca.p12をクリックして、証明書イントロ導入されます。
次に、[次へをクリックすることができますが、パスワードを設定しない場合は、[次へ]をクリックします。
図に示すように、次に、記憶領域は、証明書を選択する必要があります。
ここでは二番目のオプション「すべて次のストアに配置証明書」をクリックし、「参照」ボタンをクリックして、信頼されたルート証明書などの証明書ストアの場所の権限を選択「およびクリックして」OK
セット『ボタン、クリックして』次へ「ボタン。
セキュリティの警告がある場合は最後に、ポップアップし、「はい」ボタンをクリックします。これは、CA証明書の設定を完了します。
Androidプラットフォーム上で証明書をインストールします。
Android携帯電話上では、証明書をクリックし、その後、携帯電話にmitmproxy-CA-のcert.pemファイルを送信する必要があるウィンドウが表示されます。
電話が.PEMファイルを認識しない場合は、携帯電話に.cerファイルをコピーし、証明書のインストール]をクリックします。
mitmproxyをし、インストールを完了するために、OKをクリックします。この時間は、例えば、証明書の名前を入力します。
Android携帯電話は、証明書をインストールする方法があります
コマンドラインは、ローカルIPを見ることでipconfigと入力し、mitmproxyを開始mitmweb入力します
あなたは見ることができます
Web server listening at http://127.0.0.1:8081/
Proxy server listening at http://*:8080
所以可以确定,我们代理IP端口号为8080,于是,在手机Wifi设置手动代理,输入本机IP和端口号8080。此时,打开mitmproxy界面并操作手机,可以看到手机请求信息:
此时在手机端打开http://mitm.it/,可以进入到如下界面:(如果没有进入如下界面,请检查手机端代理IP和端口号是否输入正确!)
选择第一个进行证书安装,有时网络不好,可能页面一直没有响应。我就遇到这样的问题,最后,多试几次,就可以进入证书安装界面。
成功安装证书后,Go to Settings > General > About > Certificate Trust Settings.
Under “Enable full trust for root certificates”, turn on trust for the mitmproxy certificate.
三、mitmdump的使用
mitmdump是mitmproxy的命令行接口,同时还可以对接Python对请求进行处理,这是相对于fiddler和Charles这些工具更加方便的地方,有了它我们可以不用手动截获和分析HTTP请求和响应,只需要写好请求与响应的处理逻辑即可。它还可以实现数据的解析、存储等工作,这些过程都可以通过Python来实现。
1、我们可以使用命令启动mitmproxy,并把截获的数据保存到文件中
命令如下:
mitmdump -w outfile
其中outfile的名称任意,截获的数据都会被保存到此文件中。
还可以指定一个脚本来处理截获的数据,使用-s参数即可
mitmdump -s script.py
这里指定了当前处理脚本为script.py,它需要放置在当前命令执行的目录下。
我们可以在脚本里写入如下的代码:
def request(flow) : flow.request.headers['User-Agent'] = 'MitmProxy' print(flow.request.headers)
我们定义了 一个request ()方法,参数为 flow ,它其实是一个 HTTP Flow 对象,通过 request 属性即可获取到当前请求对象 。然后打印输出了请求的请求头,将请求头的 User-Agent 改成了MitmProxy。运行之后在手机端访问 http: //httpbin.org get 。
手机端返回结果的 Headers 实际上就是请求的 Headers, User-Agent 被修改成了 mitmproxy ,PC控制台输出了修改后Headers 内容,其 User-Agent 的内容正是 mitmproxy。所以,通过这上面三行代码我们就可以完成对请求的改写。
print()方法输出结果可以呈现在 PC 端控制台上,可以方便地进行调试。
2、日志的输出
mitmdump提供了专门的日志输出功能,可以设定不同级别以不同颜色输出结果,我们可以把脚本修改成以下内容:
from mitmproxy import ctx
def request(flow):
flow .request . headers['User-Agent'] ='mitmProxy'
ctx.log.info(str(flow.request.headers))
ctx.log.warn(str(flow.request.headers))
ctx.log.error(str(flow.request.headers))
在这里调用了ctx模块,它有一个log功能,调用不同的输出方法就可以输出不同颜色的结果,以方便我们做调试。例如:info()方法输出的内容是白色的,warn()方法输出的内容是黄色的,error()方法输出的内容是红色的。
不同的颜色对应不同级别的输出,我们可以将不同的结果合理划分级别输出,以更直观方便地查看调试信息。
3、request的使用
我们在上面也实现了request()方法并且对Headers进行了修改。下面我们介绍下request其他常用的一些功能,如下:
from mitmproxy import ctx
def request(flow):
request = flow.request
info = ctx.log.info
info(request.url)
info(str(request.headers))
info(str(request.cookies))
info(request.host)
info(request.method)
info(str(request.port))
info(request.scheme)
在手机上打开百度,就可以看到pc端控制台输出了一系列的请求,在这里我们找到第一个请求。控制台打印输出了request的一些常见的属性,如URL、headers、cookies、host、method、scheme即请求链接、请求头、请求cookies、请求host、请求方法、请求端口、请求协议这些内容。
同时我们还可以对任意属性进行修改,就像最初修改headers一样,直接赋值即可,例如把请求的URL修改了,如下:‘
def request(flow):
url ='https://httpbin.org/get'
flow.request.url = url
我们只需要用简单的脚本就可以成功把请求修改为其他的站点,通过这种方式修改和伪造请求就变得很容易。
通过这个例子我们也可以知道,有时候URL虽然是正确的,但是内容并非是正确的,我们需要进一步提高自己的安全防范意识。
所以我们能很容易地获取和修改request的任意内容,比如:可以用修改cookies、添加代理的方式来规避反爬。
4、响应的使用
对于爬虫来说,我们会更加关心响应的内容,因为response body才是爬取的结果。对于响应来说,mitmdump也提供了对应的处理接口,就是response()方法。
from mitmproxy import ctx
def response(flow):
response = flow.response
info = ctx.log.info
inf(str(response.status_code))
info(str(response.headers))
info(str(response.cookies))
info(str(response .text))
在这里打印输出了响应的状态码status_code、响应头headers、cookies、响应体text这几个属性,其中最重要的是text属性也就是网页的源代码。
通过response()方法获取每个请求的响应内容,然后再进行响应的信息提取和存储,我们就可以完成数据爬取啦!