App的数据如何用python抓取
程序员文章站
2022-06-22 21:35:42
前言 文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 App中的数据可以用网络爬虫抓取么 答案是完全肯定的:凡是可以看到的APP数据都可以抓取。 下面我就介绍下自己的学习经验和一些方法吧 本篇适合有过web爬虫基础的程序猿看 没有 ......
前言
文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
app中的数据可以用网络爬虫抓取么
答案是完全肯定的:凡是可以看到的app数据都可以抓取。
下面我就介绍下自己的学习经验和一些方法吧 本篇适合有过web爬虫基础的程序猿看
没有的的话学的可能会吃力一些
app接口爬取数据过程
-
使用抓包工具
-
手机使用代理,app所有请求通过抓包工具
-
获得接口,分析接口
-
反编译apk获取key
-
突破反爬限制
需要的工具:
-
夜神模拟器
-
fiddler
-
pycharm
实现过程
首先下载夜神模拟器模拟手机也可以用真机,然后下载fiddler抓取手机app数据包,分析接口完成以后使用python实现爬虫程序
fiddler安装配置过程
第一步:下载神器fiddler
fiddler下载完成之后,傻瓜式的安装一下!
第二步:设置fiddler
打开fiddler, tools-> fiddler options (配置完后记得要重启fiddler)
选中"decrpt https traffic", fiddler就可以截获https请求
选中"allow remote computers to connect". 是允许别的机器把http/https请求发送到fiddler上来
记住这个端口号是:8888
夜神模拟器安装配置过程
第一步:下载安装
-
夜神模拟器下载完成之后,傻瓜式的安装一下!
第二步:配置桥接 实现互通
-
首先将当前手机网络桥接到本电脑网络 实现互通
安装完成桥接驱动后配置ip地址,要配成和本机互通的网段,配置完成后打开主机cmd终端ping通ok
第三步:配置代理
-
打开主机cmd
2、输入ipconfig查看本机ip
3、配置代理
进入夜神模拟器–打开设置–打开wlan
点击修改网络–配置代理 如下图:
配置完后保存
到这里我们就设置好所有的值,下面就来测试一下,打开手机的超级课程表app
4、在夜神模拟器上下载你想爬取得app使用fiddler抓包分析api后使用python进行爬取就可以了
爬取充电网app实例
爬取部分内容截图:
部分python代码分享:
import requests
import city
import json
import jsonpath
import re
city_list = city.jsons
tags_list = city.tag
def city_func(city_id):
try:
city = jsonpath.jsonpath(city_list, '$..sub[?(@.code=={})]'.format(int(city_id)))[0]["name"]
except:
city = jsonpath.jsonpath(city_list, '$[?(@.code=={})]'.format(int(city_id)))[0]["name"]
return city
def tags_func(tags_id):
tags_join = []
if tags_id:
for tags in tags_id:
t = jsonpath.jsonpath(tags_list,'$..spotfiltertags[?(@.id=={})]'.format(int(tags)))
tags_join.append(t[0]["title"])
return ('-'.join(tags_join))
def split_n(ags):
return re.sub('\n',' ',ags)
def request(page):
print('开始下载第%d页'%page)
url = 'https://app-api.chargerlink.com/spot/searchspot'
two_url = "https://app-api.chargerlink.com/spot/getspotdetail?spotid={d}"
head = {
"device": "client=android&cityname=%e5%8c%97%e4%ba%ac%e5%b8%82&citycode=110106&lng=116.32154281224254&device_id=8a261c9d60acebded7cd3706c92dd68e&ver=3.7.7&lat=39.895024107858724&network=wifi&os_version=19",
"appid": "20171010",
"timestamp": "1532342711477",
"signature": "36daaa33e7b0d5d29ac9c64a2ce6c4cf",
"forcecheck": "1",
"content-type": "application/x-www-form-urlencoded",
"content-length": "68",
"host": "app-api.chargerlink.com",
"connection": "keep-alive",
"user-agent": "okhttp/3.2.0"
}
data = {
"userfilter[operatetype]": 2,
"citycode": 110000,
"sort": 1,
"page": page,
"limit": 10,
}
response = requests.post(url,data=data,headers=head)
#获取数据
data = response.json()
for i in data['data']:
c = []
id = i['id']
name = i["name"] #充电桩名
phone = i["phone"] #手机号
num = i['quantity'] #有几个充电桩
city = city_func(i["provincecode"]) #城市
tags =tags_func(i["tags"].split(','))#标签
message = c + [id,name,phone,num,city,tags]
parse_info(two_url.format(d=id),message)
def parse_info(url,message):
#打开文件
with open('car.csv','a',encoding='utf-8')as c:
head = {
"device": "client=android&cityname=&citycode=&lng=116.32154281224254&device_id=8a261c9d60acebded7cd3706c92dd68e&ver=3.7.7&lat=39.895024107858724&network=wifi&os_version=19",
"token": "036c8e24266c9089db50899287a99e65dc3bf95f",
"appid": "20171010",
"timestamp": "1532357165598",
"signature": "734ecec249f86193d6e54449ec5e8ff6",
"forcecheck": "1",
"host": "app-api.chargerlink.com",
"connection": "keep-alive",
"user-agent": "okhttp/3.2.0",
}
#发起详情请求
res = requests.get(url,headers=head)
price = split_n(jsonpath.jsonpath(json.loads(res.text),'$..chargingfeedesc')[0]) #价钱
paytype = jsonpath.jsonpath(json.loads(res.text),'$..paytypedesc')[0] #支付方式
businesstime =split_n(jsonpath.jsonpath(json.loads(res.text),'$..businesstime')[0]) #营业时间
result = (message + [price,paytype,businesstime])
r = ','.join([str(i) for i in result])+',\n'
c.write(r)
def get_page():
url = 'https://app-api.chargerlink.com/spot/searchspot'
head = {
"device": "client=android&cityname=%e5%8c%97%e4%ba%ac%e5%b8%82&citycode=110106&lng=116.32154281224254&device_id=8a261c9d60acebded7cd3706c92dd68e&ver=3.7.7&lat=39.895024107858724&network=wifi&os_version=19",
"appid": "20171010",
"timestamp": "1532342711477",
"signature": "36daaa33e7b0d5d29ac9c64a2ce6c4cf",
"forcecheck": "1",
"content-type": "application/x-www-form-urlencoded",
"content-length": "68",
"host": "app-api.chargerlink.com",
"connection": "keep-alive",
"user-agent": "okhttp/3.2.0"
}
data = {
"userfilter[operatetype]": 2,
"citycode": 110000,
"sort": 1,
"page": 1,
"limit": 10,
}
response = requests.post(url, data=data, headers=head)
# 获取数据
data = response.json()
total = (data["pager"]["total"])
page_size = (data["pager"]["pagesize"])
totalpage = (data['pager']["totalpage"])
print('当前共有{total}个充电桩,每页展示{page_size}个,共{totalpage}页'.format(total=total,page_size=page_size,totalpage=totalpage))
if __name__ == '__main__':
get_page()
start = int(input("亲,请输入您要获取的开始页:"))
end = int(input("亲,请输入您要获取的结束页:"))
for i in range(start,end+1):
request(i)
作者:nicepython
ps:如有需要python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/a6zvjdun
2020年最新python教程:
如果你处于想学python或者正在学习python,python的教程不少了吧,但是是最新的吗?
说不定你学了可能是两年前人家就学过的内容,在这小编分享一波2020最新的python教程。
以上这些教程小编已经为大家打包准备好了,希望对正在学习的你有所帮助!