本文旨在探讨移动端爬虫技术的应用和挑战,仅供教育和研究用途。请确保在合法合规的框架内使用爬虫技术,遵循相关法律法规和网站的使用条款。作者不对因使用本文内容而产生的任何法律或安全问题承担责任。
学习移动端爬虫的原因:
①、随机互联网的发展,数据不仅仅只是存在于PC端。移动端的数据在这几年的占比以及势头发展趋势呈现几何倍数的增长。对于做数据分析、用户画像、市场调研来说仅仅参考PC端的数据是远远不够的。
②、部分网站的web端难爬取数据,反而APP的反爬措施更简单,甚至没有反爬。
移动端爬虫的原理:
App 中的页面要加载出来,首先需要获取数据,而这些数据一般是通过请求服务器的接口来获取,由于 App 没有浏览器这种可以比较直观地看到后台请求的开发者工具,所以主要用一些抓包技术来抓取数据。
概述:既然要学习移动端爬虫,就需要移动端,我们可以采用真实手机或模拟器,由于修改系统可能会导致手机无法正常使用,所以本文所有操作都基于虚拟机进行。
网上有许多虚拟手机软件:夜神模拟器、雷电模拟器、网易MuMu模拟器、逍遥模拟器等等...可以选择的任意一种(推荐野神模拟器,它的模拟器助手可以多开并且创建指定版本的android)。
概述:Fiddler是一个http协议调试代理工具,它能够记录并检查所有的电脑和互联网之间的http通讯,设置断点,查看所有的进出Fiddler的数据(cookie,html,js,css等文件),并且Fiddler 要比其他的网络调试器要更加简单,因为它不仅仅暴露http通讯还提供了一个用户友好的格式。
①.首先进入官网下载:Download Fiddler Web Debugging Tool for Free by Telerik
注意:国家一定要选China,其他问题随便。
下载后的界面如下:
②、下载完成后双击打开进行安装;
③、安装时无脑下一步即可(可以更改一下安装位置),安装完成后会跳转到如下界面:
①、安装好后启动Fiddler(可以在开始菜单中找到);
②、打开配置菜单:
③、勾选https并勾选忽略错误:
概述:Fiddler默认只抓取http协议的请求,需要修改配置实现抓取https协议的请求,需要手动勾选Decypt HTTPS traffic,勾选后会有证书安装的窗口弹出,都选择YES。
④、勾选允许远程连接:
概述:在前面的章节中已经准备好了模拟器和Fiddler抓包工具,但是Fiddler抓包工具并不能抓到模拟器的请求,本章节主要解决Fiddler抓包工具无法抓取模拟器请求的问题及问题解决后出现的安全证书问题。
概述:电脑打开cmd(命令提示符),输入如下命令获取本机的IPV4地址(注意区分,不要拿到虚拟机的地址):
ipconfig
参考图片如下:
为防个人隐私泄露,假设该IPv4地址为192.168.1.2,后面将用该地址举例,大家将其替换成自己的IPv4地址即可。
概述:验证IPv4地址(要提前打开Fiddler),在浏览器地址栏参考如下地址输入自己的地址:
# 这里的8888就是配置Fiddler是设置的端口号,如果你在配置Fiddler时修改了端口号,需要将端口号替换
# 记得将IP地址替换成自己的IPv4地址
192.168.1.2:8888
打开如下地址就是正确的:
流程:首先打开夜神模拟器 > 点击工具文件夹 > 点击设置 > 点击WLAN > 长按已连接的WLAN > 点击修改网络 > 点击高级选项右侧的向下箭头 > 点击代理右侧的向下三角 > 点击手动 > 填入主机IPv4的地址和Fiddler设置的端口号 > 点击保存。(具体流程可参考下图)
至此,模拟器代理就设置完成了。
概述:当我们进入模拟器的浏览器进入任意https开头的网址都会弹出安全警告,如下图:
在浏览器中的地址栏参考如下地址输入:
# 记得替换成自己的IP地址
192.168.1.2:8888
进入该界面后点击下载证书:
接下来安装证书:
接下来设置密码:
后面还需要确认一下密码,这里就不展示了,设置完成后的界面如下:
但是当我们再次进入浏览器访问百度时任然会有警告信息!
欸!为什么下载了证书还是会弹安全警告?哦,原来我们的模拟器android版本大于7.0了(如下图):
分析:在设置 > 安全 > 信任凭证 > 用户 中我们可以看到刚刚下载的安全证书,对于android7.0版本以下的设备只需要将安全证书放在用户中即可正常访问,但对于android7.0版本以上的用户就需要将证书放在系统中。
流程:打开Fiddler > Tools > Options > HTTPS > Actions > Export Root Certificate to Desktop
注意:导出的证书会自动生成到桌面上。
提示:为了方便后期操作,我将证书移动到了D盘的根目录。
概述:我们刚刚导出的证书移动端是无法识别的,我们需要通过openssl这个工具将导出的证书转换成移动端能识别的证书。
下载地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions (slproweb.com)
提示:需要更具自己电脑的实际情况下载EXE文件,我的电脑是64位的,所以下载了Win64的EXE文件:
双击打开下载好的EXE文件,然后无脑下一步进行安装即可(建议修改一下安装地址,方便后面找到),安装完成后会问你是否要捐款,将√去掉然后点Finish即可。
概述:首先打开openssl的安装地址,我将其安装在了D盘下一个名为OpenSSL-Win64的文件夹中,然后进入该文件夹中一个名为bin的文件夹中,完整路径如下:D:\OpenSSL-Win64\bin,然后在地址栏输入cmd回车即可:
回车后打开了如下命令提示符:
接下来在命令提示符中输入如下命令将Fiddler导出的cer证书转换为pem证书并存放到d盘根目录(Fiddler导出的证书我已经提前放在了D盘根目录):
openssl x509 -inform DER -in d:\FiddlerRoot.cer -out d:\FiddlerRoot.pem
运行后的文件夹内容如下:
在命令提示符中输入如下命令使用md5方式显示pem证书的hash值,然后保存该值用于后面改名:
openssl x509 -inform PEM -subject_hash_old -in d:\FiddlerRoot.pem
然后将刚刚生成到D盘根目录的FiddlerRoot.pem文件改重命名为 hash值.0,例如我改名成了269953fb.0
①、首先获取访问权限:
②、返回桌面并将刚刚改名的269953fb.0文件拖拽到模拟器桌面,拖拽完成后就会自动进入安卓文件夹:
③、拷贝该文件:
④、将证书拷贝到//system/etc/security/cacerts:
拷贝后的内容如下:
⑤、虽然已经将证书添加到系统中了,但该证书的权限不足导致无法生效,接下来我们通过MT管理器为该证书修改权限:
MT管理器获取:MT管理器_免费高速下载|百度网盘-分享无限制 (baidu.com)
提示1:将下载好的apk文件直接拖拽到模拟器桌面进行安装即可。
接下来打开安装好的MT管理器(所有权限都允许)
提示2:不需要更新(不影响使用,时间久了就不保真了),不需要登录(点击虚拟机空白处或按ESC就可以跳过登录)
运行如下命令:
# 进入存放证书的目录
cd /system/etc/security/cacerts
# 切换为root用户
su
# 重新挂载系统,使文件具有可读写权限
mount -o rw,remount /system
# 修改证书权限
chmod 644 269953fb.0
# 重启模拟器
参考截图如下(软件的显示好像有问题,参考上面提供的命令运行即可):
重启模拟器后,打开设置 > 安全 > 信任的凭证 > 系统 中找到名称中带有 FiddlerRoot 的证书,如果能找到就说明我们已经成功的将证书放进了模拟器的系统中,并且能正常使用,如下图:
至此,对于android7.0版本以上系统的请求都能被Fiddler获取且没有安全警告。
概述:本章节将通过抓取某小说app的排行数据实现抓包练习。
①、实操前需要进入模拟器桌面的游戏中心下载任意一款小说软件:
②、下载完成后进入首页:
③、进入Fiddler,清空所有的请求:
④、立即点击模拟器中小说首页的排行:
⑤、逐个排查每一个响应内容(如果找不到数据可以尝试点击排行中的女生,重新获取新的响应):
⑥、找到响应后获取数据链接:
⑦、验证地址的真实性,将获取的地址放在浏览器中去获取,获取的内容如下(更加确信该地址就是排行数据):
⑧、编写爬虫获取指定数据(运行爬虫文件时要关闭Fiddler,否则会没有响应甚至报错):
注意:当运行程序时发现程序运行较慢时,可能时响应被Fiddler劫持了,此时将Fiddler关闭即可。
import requests
def get_data():
url = 'https://b.zhuishushenqi.com/category/rank-recommend?node=recommendfemale&size=100&token=&gender=female&tag=&type=&packageName=com.ushaqi.zhuishushenqi&userid=yk_bc66a5dbbf1cf8895e534'
header = {'User-Agent':'Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.131 Mobile Safari/537.36'}
books = requests.get(url,headers=header)
for book in books.json().get('books'):
title = book.get('title')
author = book.get('author')
hot = book.get('bookIndicator')
print(f'标题:{title},作者:{author},热度:{hot}')
if __name__ == '__main__':
get_data()
运行结果如下:
注意:虽然我们的案例中很顺利地获取到了数据,但不是所有的app都会如此,部分app的响应也会做加密处理。