python3编写网络爬虫19-app爬取
一、app爬取
前面都是介绍爬取Web网页的内容,随着移动互联网的发展,越来越多的企业并没有提供Web页面端的服务,
而是直接开发了App,更多信息都是通过App展示的
App爬取相比Web端更加容易 反爬虫能力没有那么强,而且数据大多数是以JSON形式传递的 解析更加简单
在Web端 我们可以通过浏览器开发者工具 监听到各个网络请求和响应过程 在App端 查看内容就需要抓包软件
例如 WireShark Fiddler Charles mitmproxy AnyProxy等 它们原理基本相同
可以通过设置代理的方式将手机处于抓包软件的监听下 就可以看到App运行过程中发生的所有请求和响应
相当于分析Ajax一样
如果参数程序是有规律的 直接用程序模拟爬取即可
如果没有规律 可以通过mitmdump 对接Python脚本 处理response
如果需要自动化 可以使用Appium
1.charles的使用
简介 : 是一个网络抓包工具 可以用它来做app抓包分析 类似Web浏览器的开发者工具
安装 官网:
https://www.charlesproxy.com
下载地址 :
https://www.charlesproxy.com/dowload
默认安装即可
charles 是收费软件 免费试用30天
证书配置
现在很多页面都在向HTTPS方向发展 HTTPS通信协议应用越来越广泛 如果一个App通信应用了HTTPS协议
那么它的通信数据都会被加密 常规的截包方法无法识别内部数据
需要配置SSL证书
Charles是运行在PC端的 抓取的是App端的数据 所以PC和移动端都要安装证书
PC端安装证书
打开charles 点击Help -> SSL Proxying -> Install Charles Root Certificate 进入安装证书的页面
点击安装证书 点击下一步 选择将所有证书放入下列存储 点击浏览 选择存储位置为 受信任的根证书颁发机构 点击确定
如果报错 存储已满 或者只读 解决办法
win+R 输入mmc 点击文件 添加删除管理单元
点击证书 点击添加 选择计算机账户 下一步 确定
重新导入证书
移动端安装证书
首先保证手机和电脑在同一局域网 (有网线的情况下) 手机设置选择wifi 手动代理 添加charles的ip和端口
设置完电脑会弹出是否信任此设备 点击allow即可
手机浏览器(尽量不要用默认的浏览器 可以使用QQ浏览器)打开chls.pro/ssl 给证书添加个名字 点击确定就能完成证书的安装
手机访问互联网 数据包会流经charles charles再转发数据包到真实服务器 服务器在返回数据包 流经charles
在转发给手机
设置好charles并且配置好证书
示例 打开京东 选一个商品 打开商品评论页面 不断下拉加载评论
左侧会有一个api.m.jd.com 点击其中一条 切换到contents选项卡 可以看到JSON数据 核对结果 和app上看到的内容一致
这样就捕获到了在上拉刷新的请求和响应内容
重发 charles另一个强大功能可以将捕获的请求加以修改并重新发送
可以用来做调试
2.mitmproxy的使用
是一个支持HTTP和HTTPS的抓包程序类似Fiddler charles 只不过是一个控制台形式操作
mitmproxy还有两个相关组件 mitmdump 命令行接口 利用它可以对接python脚本
另一个是mitmweb 一个web程序 通过它可以清楚观察捕获的请求
安装
下载地址:
https://github.com/mitmproxy/mitmproxy/releases
默认安装即可
证书配置
启动mitmdump 找到mitmproxy文件下ca证书 双击mitmproxy-ca.pl2 默认下一步即可
选择将所有证书放入下列存储 点击浏览 选择存储位置为 受信任的根证书颁发机构 点击确定
手机 将文件发送到手机 点击安装
通过 手机微信助手 发送 mitmproxy-ca-cert.cer 手机点击wifi 高级设置 安装证书 默认download 返回上一级 内部存储空间
tencent -> MicroMsg -> Download 点击安装
运行 mitmdump 是mitmproxy的命令行接口 同时可以对接python脚本
示例:
可以使用命令启动mitmproxy 例如 mitmdump -w outfile 截获的数据都会被保存到此文件中
指定脚本来处理截获的数据 使用-s参数
mitmdump -s test.py
脚本文件内容如下
def request(flow):
flow.request.headers['User-Agent'] = 'MitmProxy'
print(flow.request.headers)
这里 定义一个request() 方法 参数为flow 通过request属性获取当前请求对象 打印输出请求的请求头
将User-Agent修改成了MitmProxy
手机端访问 http://httpbin.org/get
日志输出
mitmdump 提供了专门的日志传输系统 可以设定不同颜色输出结果 修改脚本如下:
确保安装好mitmproxy pip install mitmproxy
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))#输出红色
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.post))
info(request.scheme)
修改脚本 手机打开百度 分别输出 请求链接 请求头 cookies host 请求方法 端口 协议
同时还可以对任意属性进行修改 就像最初修改Headers一样 直接赋值
示例:
def request(flow):
url = 'https://httpbin.org/get'
flow.request.url = url
更多属性参考 http://docs.mitmproxy.org/en/latest/scripting/api.html
响应
response() 方法
示例:
from mitmproxy import ctx def response(flow):
response = flow.response
info = ctx.log.info
info(str(response.status_code))
info(str(response.headers))
info(str(response.cookies))
info(str(response.text))
打印出响应状态码 headers cookies 网页源代码等
python3编写网络爬虫19-app爬取的更多相关文章
- python3编写网络爬虫13-Ajax数据爬取
一.Ajax数据爬取 1. 简介:Ajax 全称Asynchronous JavaScript and XML 异步的Javascript和XML. 它不是一门编程语言,而是利用JavaScript在 ...
- Python 网络爬虫 002 (入门) 爬取一个网站之前,要了解的知识
网站站点的背景调研 1. 检查 robots.txt 网站都会定义robots.txt 文件,这个文件就是给 网络爬虫 来了解爬取该网站时存在哪些限制.当然了,这个限制仅仅只是一个建议,你可以遵守,也 ...
- 网络爬虫之scrapy爬取某招聘网手机APP发布信息
1 引言 过段时间要开始找新工作了,爬取一些岗位信息来分析一下吧.目前主流的招聘网站包括前程无忧.智联.BOSS直聘.拉勾等等.有段时间时间没爬取手机APP了,这次写一个爬虫爬取前程无忧手机APP岗位 ...
- python3编写网络爬虫18-代理池的维护
一.代理池的维护 上面我们利用代理可以解决目标网站封IP的问题 在网上有大量公开的免费代理 或者我们也可以购买付费的代理IP但是无论是免费的还是付费的,都不能保证都是可用的 因为可能此IP被其他人使用 ...
- Python网络爬虫与如何爬取段子的项目实例
一.网络爬虫 Python爬虫开发工程师,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页 ...
- python3编写网络爬虫23-分布式爬虫
一.分布式爬虫 前面我们了解Scrapy爬虫框架的基本用法 这些框架都是在同一台主机运行的 爬取效率有限 如果多台主机协同爬取 爬取效率必然成倍增长这就是分布式爬虫的优势 1. 分布式爬虫基本原理 1 ...
- python3编写网络爬虫14-动态渲染页面爬取
一.动态渲染页面爬取 上节课我们了解了Ajax分析和抓取方式,这其实也是JavaScript动态渲染页面的一种情形,通过直接分析Ajax,借助requests和urllib实现数据爬取 但是javaS ...
- python3编写网络爬虫16-使用selenium 爬取淘宝商品信息
一.使用selenium 模拟浏览器操作爬取淘宝商品信息 之前我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过A ...
- python3编写网络爬虫22-爬取知乎用户信息
思路 选定起始人 选一个关注数或者粉丝数多的大V作为爬虫起始点 获取粉丝和关注列表 通过知乎接口获得该大V的粉丝列表和关注列表 获取列表用户信息 获取列表每个用户的详细信息 获取每个用户的粉丝和关注 ...
随机推荐
- 了解golang的可变参数(... parameters),这一篇就够了
在实际开发中,总有一些函数的参数个数是在编码过程中无法确定的,比如我们最常用的fmt.Printf和fmt.Println: fmt.Printf("一共有%v行%v列\n", r ...
- 高德地图Javascript API设置域名白名单
在涉及到GPS地图相关应用的开发过程中,我们需要在高德开放平台注册相应的账号,并设置好相应应用来获取调用的Key值,该Key值直接放入到网站前端页面,针对任何人来说都可看到,因此我们防止他人盗用你的K ...
- JQuery官方学习资料(译):类型
类型 JavaScript提供了多个内置数据类型.除了这些,这份文档还将介绍一些虚拟类型,例如选择器.伪类.事件等. String 在JavaScript中字符串是一个不可变的对象,它包含无. ...
- [Linux] Nginx 提供静态内容和优化积压队列
1.try_files指令可用于检查指定的文件或目录是否存在; NGINX会进行内部重定向,如果没有,则返回指定的状态代码.例如,要检查对应于请求URI的文件是否存在,请使用try_files指令和$ ...
- python面向对象学习(五)多态
多态 多态:不同的 子类对象 调用相同的 父类方法,产生不同的执行结果 多态 可以 增加代码的灵活度 以 继承 和 重写父类方法 为前提 是调用方法的技巧,不会影响到类的内部设计 多态案例练习 需求 ...
- Spring Data REST API集成Springfox、Swagger
原文: Documenting a Spring Data REST API with Springfox and Swagger 使用Spring Date REST,你可以迅速为Spring Da ...
- WPF Modern UI 主题更换原理
WPF Modern UI 主题更换原理 一 . 如何更换主题? 二 . 代码分析 代码路径 : FirstFloor.ModernUI.App / Content / SettingsAppeara ...
- 我为什么推荐Prettier来统一代码风格
译者按: 关于代码风格,不同的人有不同的偏好,其实并没有什么绝对的对错.但是,有2条原则应该是对的: 少数服从多数:用工具统一风格. 原文: Why robots should format our ...
- thinkphp简洁、美观、靠谱的分页类
我们要实现如下图分页效果 这个分页类是在thinkphp框架内置的分页类的基础上修改而来:原分页类的一些设计,在实际运用中感觉不是很方便: 1.只有一页内容时不显示分页: 2.原分页类在当前页是第一页 ...
- 浅析 JavaScript 中的 Function.prototype.bind() 方法
Function.prototype.bind()方法 bind() 方法的主要作用就是将函数绑定至某个对象,bind() 方法会创建一个函数,函数体内this对象的值会被绑定到传入bind() 函数 ...