python+fiddler爬取华润有巢公寓app
- 前言
- fiddler安装及设置
- 完整代码
- 代码解读
- 结果截图
- 遇到的坑及解决办法
- 免责声明
前言
随着移动端越发方便,越来越多的企业不再开放web端,转而开发移动端app或者小程序,这不,在百度找了半天也不见华润有巢的官方网站,可是发现了这家伙有自己的app和小程序,如何才能从其app或者小程序里面拿到他们数据呢?之前都是爬取web网页端的数据,这要爬app端数据,是一个新鲜的尝试,网上查询爬取app方法式主要通过fiddler和charles抓包的方式截取服务器返回来的数据,获取其访问地址和原json格式数据,本文主要介绍如何通过fiddler来实现抓包,俗话说的好,磨刀不误砍柴工,先从安装设置开始。
fiddler安装及设置
进入fiddler官网https://www.telerik.com/download/fiddler , 填写你的应用目的,邮箱和国家,同意用户许可协议,点击download。 安装好,从开始栏打开fiddler,会弹出下面窗口,直接yes便是。

进入主页面,点击菜单栏的Tools,选择Options, 主要设置的有HTTPS和Connections两项,勾选Capture HTTPS CONNECTs和Decrypt HTTPS traffic,然后再点击右侧的Actions点击Trust Root Certificate,安装CA证书,在Connections选项里面的Fiddler listen to port 后面填上8888,表示监听端口为8888,并把Allow romete computers to connect勾上,点击ok键确认,最后点击主页面右上角的Online会出现你电脑的ip地址,记住这个ip 后面会用到,至此,pc端的fiddler算是设置完成,接下来进行手机设置。




使用Fiddler进行手机抓包,首先要确保手机和电脑的网络在一个内网中,可以使用让电脑和手机都连接同一个路由器,这里演示一下iphone6的手机端设置,其他大同小异,主要是进入wifi设置里面手动设置代理,填上你刚才的ip地址和port 号,然后用手机浏览器地址栏输入 http://localhost:8888 下载FiddlerRoot certificate安全证书,苹果手机还需要进入通用设置里面的profile信任FiddlerRoot。



一切准备就绪后就要开始fiddler抓包了,打开你手机有巢app, 同时你的fiddler会capture很多https的信息,逐渐点开去看看是否有你想要的,这里你也可以发现规律然后过滤掉非你所需的host。
你想过没有,你在抓取web端的数据时候,你首先会分析待爬取的网页结构,找到待爬取的url,然后一层一层解析出自己想要的数据,而app不再像web端那么方便直接在地址栏给出url, 这也是fiddler最关键的地方,获取app数据对应的url或者api接口,并查看其请求方式是get还是post, 如果是post,你还要构造好你的请求数据表单,查完了这些之后就可以开始编写代码了。
完整代码
# -*- coding: utf-8 -*-"""
project_name:youtha_spider
@author: 帅帅de三叔
Created on Thu Sep 19 10:27:16 2019
"""
import requests,json #导入服务器请求模块
from bs4 import BeautifulSoup #导入解析模块
import pymysql #导入数据库模块
db=pymysql.connect("localhost","root","123456","youchao",charset="UTF8MB4") #链接数据库
cursor=db.cursor() #获取操作数据库的游标
cursor.execute("drop table if exists youtha") #以重新写入的方式写入数据库
c_sql="""create table youtha(
city varchar(8),
project_name varchar(20),
address varchar(50))Engine=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8MB4"""
cursor.execute(c_sql) #创建表apartmentone
url = 'https://ris.crland.com.cn/api/public/app/project/querAllPro' #请求url
header={"Host": "ris.crland.com.cn",
"Content-Type": "application/json",
"Cookie": "dtCookie=2$4039DDB3F6634C1FE36E57EB5E779E43; SESSIONID_HAP=811c1e06-3afc-4968-b3a5-cd4bb67497c8",
"Connection": "keep-alive",
"Accept": "*/*",
"User-Agent": "crlandRent/3.3 (iPhone; iOS 12.4.1; Scale/2.00)",
"Accept-Language": "zh-Hans;q=1",
"Content-Length": "105",
"Accept-Encoding": "br, gzip, deflate"} #构造请求头
for cityid in ["1","9","15","3","11","22","8","2","14","6","32"]: #城市列表
data_form = {"equipmentId":"C2CCEB9A-4EA2-4F5A-9275-A6D3ECBAF95F","cityId":cityid,"pageSize":"20","token":"","page":"1"} #请求数据表单
#print(data_form)
res=requests.post(url,data=json.dumps(data_form),headers=header,verify=False) #post请求
soup=json.loads(res.text) #字典化
#print(soup)
project_list=soup["data"]["projectAll"] #项目列表
project_num=len(project_list) #项目总数
for project in project_list: #对项目进行循环
city=project["cityName"] #城市
project_name=project['projectName'] #项目名称
address=project["address"] #地址
print(city,project_name,address) #测试
insert_data=("insert into youtha(city,project_name,address)""values(%s,%s,%s)") #控制插入格式
available_data=([city,project_name,address]) #待插入数据库数据
cursor.execute(insert_data,available_data) #执行插入操作
db.commit() #主动提交执行
代码解读
你会发现app抓取和web抓取并无两样,甚至比web抓取的代码还要简单,因为app主要通过api返回来的数据已经是很规范的json格式了,而app抓取最关键的是通过抓包工具分析出数据大门url长什么样子,构造请求头header,,请求方式是post还是get, 如果是post请求构造好请求表单data_form,记得这里表单要利用json.dumps()函数转化为json格式,因为在请求header里面有一个限制"Content-Type": “application/json”,你把数据表单json化后,你请求回来的数据也是json格式,你可以直接取下来,也可以像我这样先利用json.loads()函数字典化请求出来的数据再取,纯属个人偏爱。
结果截图
遇到的坑及解决办法

因为有巢是post请求,首先仔细检查你的请求头,需要构造data_form,并且加用json.loads()函数来转为json格式
json.dumps(data_form) #转为json格式
免责声明
Python爬虫仅为学习交流,如有冒犯,请告知删。