Python3 爬虫 中间人爬虫

news2024/10/6 23:37:14

        中间人(Man-in-the-Middle,MITM)攻击是指攻击者与通信的两端分别创建独立的联系,并交换其所收到的数据,使通信的两端认为其正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通信双方的通话,并插入新的内容或者修改原有内容。

        中间人攻击,名字看起来很高级的样子,其实大多数人在小时候都遭受过甚至使用过——上课传纸条。A要把纸条传给B,但是A与B距离太远,于是让C来转交纸条。此时,C作为一个中间人,他有两种攻击方式:仅仅偷偷查看纸条的内容,或者先篡改纸条的内容再传给B。

        中间人爬虫就是利用了中间人攻击的原理来实现数据抓取的一种爬虫技术。数据抓包就是中间人爬虫的一个简单应用。所以使用Charles也是一种中间人攻击。

        在前面分享中讲到模拟登录的时候,有一种方法是在Chrome的开发者工具中把Cookies复制出来,拿给requests来实现绕过登录。所以肯定有读者会想到,使用Charles也可以获得网站的Cookies,然后复制出来给requests登录。这个想法很好,但问题是,无论Chrome还是Charles都是图形界面的软件,所有操作都需要鼠标来协助完成,把Cookies复制出来这个简单的动作难以实现自动化。这个时候,就需要使用mitmproxy了。

一、mitmproxy的介绍和安装

        对编程有了解的读者一定听说过“Linux比Windows好”这种言论,那么Linux哪一点比Windows好呢?Linux好就好在它里面有无数强大的命令行下的软件。这些软件不需要鼠标,也没有图形界面,所有的操作就是输入命令。而命令本质上就是文本。操作文本比操作图形界面容易得多。操作文本可以实现自动化,而操作图形界面却难以实现自动化。

        所以,请想一想,有什么办法能自动把Charles里面的Cookies拿给爬虫使用?如何把鼠标指针自动移动到Charles的窗口里?如何自动选中Cookies然后自动复制?如何再把鼠标指针自动移动到另一个终端窗口里面,自动写代码并把Cookies放到Redis中,最后爬虫自动从Redis里面取Cookies,安装到自己身上再去爬网站?

        除了最后一步,爬虫从Redis取Cookies很容易以外,其他操作要实现自动化都极其困难。

        但是如果有一个命令行下面的抓包工具,所有的操作都是文本型的命令,不需要鼠标,不需要图形界面,它抓到的数据包直接就是文本信息,并且可以无缝传递给其他程序,会怎么样呢?

        mitmproxy是一个命令行下的抓包工具,它的作用和Charles差不多,但它可以在终端下工作。使用mitmproxy就可以实现自动化的抓包并从数据包里面得到有用的信息。

        请开发者在Linux、Mac OS或者Windows 10自带的Ubuntu Bash下使用mitmproxy,只有这样,才能发挥它的最大能力。

        对于Mac OS系统,使用Homebrew安装mitmproxy,命令为:

brew install mitmproxy

        在Ubuntu中,要安装mitmproxy,首先需要保证系统的Python为Python 3.5或者更高版本,然后执行下面两条命令:

sudo apt-get install python3-dev python3-pip libffi-dev libssl-dev

sudo pip3 install mitmproxy

二、mitmproxy的使用

        安装好mitmproxy以后,在终端执行下面的命令,此时会弹出一个窗口,窗口的文字根据系统的不同,可能是英文也可能是中文,大意是询问是否允许Python 3.6接收收入的网络连接,单击“允许”按钮或者“Allow”按钮,如图

                接下来会打开一个命令行下的数据监控窗口,如图所示:

        mitmproxy的端口为8080端口,在浏览器或者在手机上设置代理,代理IP为计算机IP,端口为8080端口,如图:

        设置好代理以后,在手机上打开一个App或者打开一个网页,可以看到mitmproxy上面有数据滚动,如图:

        用鼠标在终端窗口上单击其中的任意一个请求,可以显示这个数据包的详情信息,如图:

        此时只能访问HTTP网站,要访问HTTPS网站,还需要安装mitmproxy的证书。在手机设置了mitmproxy的代理以后,通过手机浏览器访问http://mitm.it/这个网址,会出现图所示的网页。

        根据自己的手机选择对应的图标,就可以弹出安装证书的界面。界面与安装Charles的证书界面基本一样。安装完成证书以后,就可以截获HTTPS的数据包了,如图所示。

        到目前为止,mitmproxy就可以像Charles一样使用了。但是既然有了Charles,何必单独介绍一个功能重复的东西呢?那是因为mitmproxy有它擅长的地方,就是可使用Python来定制mitmproxy的行为。

三、使用Python定制mitmproxy

        mitmproxy的强大之处在于它还自带一个mitmdump命令。这个命令可以用来运行符合一定规则的Python脚本,并在Python脚本里面直接操作HTTP和HTTPS的请求,以及返回的数据包。

        为了自动化地监控网站或者手机发出的请求头部信息和Body信息,并接收网站返回的头部信息和Body信息,就需要掌握如何在Python脚本中获得请求和返回的数据包。

        1. 请求数据包

        创建一个parse_request.py文件,其文件内容只有两行代码:

def request(flow):

   print(flow.request.headers)

        在命令行下执行命令:

mitmdump -s parse_request.py

        运行命令以后,在手机上打开一个App,可以看到这个App请求的头部信息已经出现在终端窗口中,如图所示。

        当然,除了显示头部信息以外,还可以查看请求的Cookies或者Body信息。修改parse_request.py:

def request(flow):  

   req = flow.request

   print(f'当前请求的URL为: {req.url}')    

   print(f'当前的请求方式为: {req.method}')    

   print(f'当前的Cookies为: {req.cookies}')    

   print(f'请求的body为: {req.text}')

        运行结果如图:

2. 返回数据包

        对于网站返回的数据包,可以再实现一个response()函数。创建一个parse_response.py文件,其内容如下:

import json

def response(flow):    

    resp = flow.response

    print(f'返回的头部为:{resp.headers}')    

    print(f'返回的body为:{json.loads(resp.content)}'

)

        如果网站返回的body正好是JSON格式的字符串,那么就可以使用Python的JSON模块来解析。当然,由于这个函数要处理所有的网络返回的数据包,对返回内容不是JSON格式字符串的情况就会报错,如图:

        此时,可以在Python脚本里面针对性地处理某个网站返回的数据。这个时候,就把请求和返回内容放在一起,且函数名必须为“response”,代码如下:

def response(flow):    

    req = flow.request    

    response = flow.response    

    if 'kingname.info' in req.url:

        print('这是kingname的网站,也是我的目标网站')

        print(f'请求的headers是: {req.headers}')

        print(f'请求的UA是: {req.headers["User-Agent"]}')

        print(f'返回的内容是:{response.text}')

        运行结果如图:

四、mitmdump的使用场景

        网站返回的Headers中经常有Cookies,如图:

                那是否可以这样写代码:

        得到网站返回的Cookies以后就直接塞进Redis里面,这样爬虫就可以直接从Redis里面取已经登录的Cookies了。

        这个想法非常好,但是实际做起来会发现,Redis里面始终是空的。这是由于mitmdump的脚本对第三方库的支持有缺陷,很多第三方库都不能运行,甚至Python自带的写文件功能都不能运行。

        为了解决这个问题,就需要用到Linux/Mac OS里面非常厉害又很简单的一个工具——管道。这个工具在终端里面就是一根竖线。它可以把左边的内容传递给右边。

        mitmdump的脚本使用print()函数把Cookies打印出来,然后通过管道传递给另一个普通的正常的Python脚本。在另一个脚本里面,得到管道传递进来的Cookies,再把它放进Redis里面。

        首先是mitmdump的脚本,其代码如下:

        代码的运行结果如图:

        代码运行以后,会把Cookies放在>>>和<<<中间。

        另外创建一个普通的extract.py文件,其内容如下:

        如果直接使用Python运行这个代码,会发现它似乎“卡住”了,不会自动结束,也没有任何输出,如图:

        如果输入不同的内容,就会发现奥妙所在。当输入普通字符串并按下Enter键的时候,不会有任何内容返回。但是如果按照“>>>内容<<<”的格式输入,就会发现有内容返回出来,如图:

        现在需要使用管道把mitmdump运行的脚本和这个Python脚本连接在一起。运行命令:

mitmdump -s parse_one_site.py | python3 extract.py

        运行命令以后,在手机上访问网站或者刷新App就会看到图所示的输出。

        整个窗口看起来简洁了非常多。这个命令会一直运行,之后就不需要关闭它了。只要有包含Cookies的网络请求,并且域名包含“kingname.info”,那么Cookies就会被截获。由于extract.py是一个普通的Python脚本,任何第三方库都可以在上面正常运行,于是就可以使用Redis来存放Cookies了,代码如下:

        到目前为止,自动获取Cookies的功能已经实现了。当然不仅仅是Cookies,Headers里面的所有数据、请求发送的Body里面的所有数据都可以使用这种方式截取下来。

        假设有这样一个网站,它的每一个请求都带有一个参数:Token。这个Token的有效期为5min,每过5min就会自动更换。如果使用错误的或者过期的Token来请求网站,就会自动跳转到404页面。现在不知道这个Token是怎么生成的,只知道如果使用浏览器访问的话,这个Token就会出现在请求的Headers里面。有了mitmpdump脚本的功能以后,就不需要关心这个Token是怎么生成的了。首先使用Python与Selenium操作浏览器,设置代理,从而使数据经过mitmdump的脚本,然后用PhantomJS访问这个网页,于是mitmdump就可以成功把这个Token给截获下来并放到Redis里面。那么爬虫就可以从Redis里面读取这个Token并直接使用了。

        这里给出为PhantomJS设置代理的代码:

        这个脚本可以每5min运行一次来刷新Token。

        由于Windows自带的CMD是没有管道这种强大的工具的,因此Windows是没有办法直接完成这个流程的。

        也许会有读者疑惑,直接使用Python的第三方库Selenium中的接口,就可以从Phantomjs中读取出Headers和Cookies,为什么还要使用mitmproxy呢?

        这是因为,mitmproxy在这里做的是代理的角色,网络请求都可以通过它发出去。而Selenium只是一个网页自动化测试工具,它们负责的是不同的事情,只不过在获取计算机网页的请求上面有一小部分功能重叠而已。Selenium也无法获取App和微信小程序的网络请求。

        同时,由于mitmproxy是一个代理,HTTP/HTTPS流量数据经过它,就会被截获。那么Phantomjs没有必要和mitmproxy运行在同一个服务器上。只要mitmproxy运行在一个公网服务器即可。Phantomjs可以运行在个人计算机中,并将代理IP设置为公网服务器的IP。如果Phantomjs写代码的操作特别麻烦,直接为浏览器设置代理来实现手工操作网页也可以让mitmproxy实现抓包。

五、总结

        抓包是爬虫开发过程中非常有用的一个技巧。使用Charles,可以把爬虫的爬取范围从网页瞬间扩展到手机App和微信小程序。由于微信小程序的反爬虫机制在大多数情况下都非常脆弱,所以如果目标网站有微信小程序,那么可以大大简化爬虫的开发难度。

        当然,网站有可能会对接口的数据进行加密,App得到密文以后,使用内置的算法进行解密。对于这种情况,单纯使用抓包就没有办法处理了,就需要使用下一章所要讲到的技术来解决。

        使用mitmproxy可以实现爬虫的全自动化操作。对于拥有复杂参数的网站,使用这种先抓包再提交的方式可以在一定程度上绕过网站的反爬虫机制,从而实现数据抓取。

--------------------------------------

没有自由的秩序和没有秩序的自由,同样具有破坏性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2193184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LCD屏入门(基于ESP-IDF、SPI屏)

主要参考资料&#xff1a; ESP32-S3 开发 SPI 屏【DIY 智能手表】: https://www.bilibili.com/video/BV1Yc411y7bb/?spm_id_from333.337.search-card.all.click&vd_sourcedd284033cd0c4d1f3f59a2cd40ae4ef9 使用 SPI 屏和 I2C 触屏运行 SquareLine Studio 提供的手表 UI 示…

突触可塑性与STDP:神经网络中的自我调整机制

突触可塑性与STDP&#xff1a;神经网络中的自我调整机制 在神经网络的学习过程中&#xff0c;突触可塑性&#xff08;Synaptic Plasticity&#xff09;是指神经元之间的连接强度&#xff08;突触权重&#xff09;随着时间的推移而动态变化的能力。这种调整机制使神经网络能够通…

链动 2+1 模式 S2B2C 商城小程序:交易转化的创新引擎

摘要 在数字化商业时代&#xff0c;电商行业竞争激烈&#xff0c;交易转化成为核心问题。链动 21 模式 S2B2C 商城小程序源码作为创新电商模式&#xff0c;通过独特的推荐与分享机制、丰富奖励机制、AI 智能名片及 S2B2C 商城的个性化定制与供应链协同等&#xff0c;在交易转化…

redis+mysql数据一致性+缓存穿透解决方案

在分布式事务中我们知道有cap定理&#xff0c;即 我们保证高可用的情况下&#xff0c;必然要牺牲一些一致性&#xff0c;在保证强一致性的情况下&#xff0c;必然会牺牲一些可用性。而我们redismysql数据一致性的使用策略就是在我们保证可用性的情况下尽量保证数据的一致性。想…

MySql的基本语法操作

查看数据库和表 查看所有的数据库 show databases; 建立一个新的数据库 create database database_name; 也可以是 create database if not exists database_name; 表示这个数据库不存在才建立 而不会打断其他sql语句的执行&#xff0c;而如果没有加的话&#xff0c;创建…

神经网络及大模型科普揭秘

一、生物神经元及神经元构成的神经网络 下图是生物神经元的示意图: 生物神经元由细胞体、树突、轴突、轴突末梢四部分构成。 下图是生物神经网络的一个简单示意图: 生物神经元通过电信号在彼此间传递信号,神经元的各个树突接收输入信号,经过细胞体汇总,如果最终总和高…

【动态规划-最长公共子序列(LCS)】力扣97. 交错字符串

给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; s s1 s2 … sn t t1 t2 … tm |n - m| < 1 交错 是 s1…

【微服务】服务注册与发现 - Eureka(day3)

CAP理论 P是分区容错性。简单来说&#xff0c;分区容错性表示分布式服务中一个节点挂掉了&#xff0c;并不影响其他节点对外提供服务。也就是一台服务器出错了&#xff0c;仍然可以对外进行响应&#xff0c;不会因为某一台服务器出错而导致所有的请求都无法响应。综上所述&…

网络安全概述:从认知到实践

一、定义 网络安全&#xff0c;即致力于保护网络系统所涵盖的硬件、软件以及各类数据&#xff0c;切实保障其免遭破坏、泄露或者篡改等不良情形的发生。 二、重要性 个人层面&#xff1a;着重于守护个人隐私以及财产安全&#xff0c;为个人在网络世界中的各项活动提供坚实的保…

分享几个做题网站------学习网------工具网;

以下是就是做题网站&#xff1b;趣IT官网-互联网求职刷题神器趣IT——互联网在线刷题学习平台&#xff0c;汇集互联网大厂面试真题&#xff0c;拥有java、C、Python、前端、产品经理、软件测试、新媒体运营等多个热门IT岗位面试笔试题库&#xff0c;提供能力测评、面试刷题、笔…

Meta 首个多模态大模型一键启动!首个多针刺绣数据集上线,含超 30k 张图片

小扎在 Meta Connect 2024 主题演讲中宣布推出首个多模态大模型 Llama 3.2 vision&#xff01;该模型有 11B 和 90B 两个版本&#xff0c;成为首批支持多模态任务的 Llama 系列模型&#xff0c;根据官方数据&#xff0c;这两个开原模型的性能已超越闭源模型。 小编已经迫不及待…

算法修炼之路之二分查找

目录 一:三大二分介绍及模板 1.普通二分 2.查找左右边界的二分及模板 二:LeetCode OJ练习 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 一:三大二分介绍及模板 1.普通二分 这里通过一道题来引出普通二分及模板 LeetCode_704 二分查找 画图分析: 具体代…

AI 大模型的核心能力与应用场景全解析

深入理解 AI 大模型&#xff1a;核心能力与应用场景全解析 AI大模型是什么 通过概念考察的方式了解AI大模型&#xff0c;拆开来看。 AI领域术语丰富&#xff0c;涵盖模式识别、自然语言处理、神经网络、机器学习、深度学习、强化学习及人类反馈强化学习。大模型&#xff1a;把…

Springboot人才求职招聘系统源码(前台+后台)

文章目录 1 项目描述2 后台功能3 获取方式 项目技术&#xff1a;springboot 运行环境&#xff1a;jdk1.8idea/eclipsemaven3mysql5.6 1 项目描述 基于springboot的招聘系统&#xff0c;包括前台和后台管理系统&#xff0c;前台包括首页&#xff0c;应聘职位&#xff0c; 在…

[C语言]指针和数组

目录 1.数组的地址 2.通过指针访问数组 3.数组和指针的不同点 4.指针数组 1.数组的地址 数组的地址是什么&#xff1f; 看下面一组代码 #include <stdio.h> int main() { int arr[5] {5,4,3,2,1}; printf("&arr[0] %p\n", &arr[0]); printf(&qu…

最新版IntelliJ IDEA 2024.2.3 创建SpringBoot项目(包含各种依赖的选择和功能)

创建SpringBoot项目 1 . 打开IDEA 选择新建项目 2. 基础项目创建 在顶端几个选项可以选择创建基本的java项目 填写项目名称,文件位置,选择构建工具 3. 下方选择springboot 选择构建的方式 三种方式虽然不同但是,基本功能都一致, Gradle-Groovy 是指使用 Groovy 语言编写…

鸿蒙开发(NEXT/API 12)【访问控制应用权限管控概述】程序访问控制

默认情况下&#xff0c;应用只能访问有限的系统资源。但某些情况下&#xff0c;应用存在扩展功能的诉求&#xff0c;需要访问额外的系统数据&#xff08;包括用户个人数据&#xff09;和功能&#xff0c;系统也必须以明确的方式对外提供接口来共享其数据或功能。 系统通过访问…

http2详细讲解

github链接 &#xff1a; http2

免费音频剪辑软件大揭秘:让声音创作更轻松

在精神娱乐越发丰富的现在&#xff0c;音频内容的创作和编辑变得越来越重要。无论是专业的音乐制作人&#xff0c;还是自媒体创作者&#xff0c;都可能需要一款功能强大且易于使用的音频剪辑软件来处理音频素材。今天我们一同来探讨有什么好用的免费音频剪辑软件吧。 1.福昕音…

UGUI(六大UI根基组件)

Rect Transform 各种参数 是显示pos还是width/height 还是left/top/right/bottom之类巴拉巴拉&#xff0c;各种混合的展示baby&#xff0c;都是看anchor的设置 pivot的设置影响具体数值 至于blueprint mode &#xff0c;就是用了之后框框不变&#xff0c;who wanna do thi…