学习分享,勿触底线。
最近有改进了,之前获取_signature参数的方式有点low。现在用pm2部署一下node接口美滋滋。
代码就不放了,可以去最后的测试地址玩一玩,手下留情。
爬虫分为三个部分:
1、个人数据:利用分享页,获取id,粉丝数,点赞数等信息
2、粉丝数据:利用模拟器 + appium + mitmdump,自动化获取粉丝数据
3、视频数据:逆向破解关键参数,获取视频数据
Windows10
Python3.7,pycharm
fiddler, MongoDB,SDK
夜神模拟器 + appium + mitmdump
分享页入口:https://www.iesdouyin.com/share/user/分享id
关键反爬:TTF字体混淆
解决措施:最笨的方法,字典映射:
regex_list = [
{'name': [' ', ' ', ' '], 'value': 0},
{'name': [' ', ' ', ' '], 'value': 1},
{'name': [' ', ' ', ' '], 'value': 2},
{'name': [' ', ' ', ' '], 'value': 3},
{'name': [' ', ' ', ' '], 'value': 4},
{'name': [' ', ' ', ' '], 'value': 5},
{'name': [' ', ' ', ' '], 'value': 6},
{'name': [' ', ' ', ' '], 'value': 7},
{'name': [' ', ' ', ' '], 'value': 8},
{'name': [' ', ' ', ' '], 'value': 9},
]
数据保存
appium模拟滑动,mitmdump解析数据
模拟器下载安卓5版本,安装抖音
配置appium:
desired_caps = {
'platformName': 'Android',
'deviceName': '127.0.0.1:62025', # adb devices获取
'platformVersion': '5.1.1',
'appPackage': 'com.ss.android.ugc.aweme',
'appActivity': 'com.ss.android.ugc.aweme.splash.SplashActivity',
'noReset': True,
'unicodeKeyboard': True,
'resetKeyboard': True
}
获取appPackage和appActivity
# 获取方式一: aapt.exe dump badging apk包
# 获取方式二:adb shell进入命令行,logcat | grep cmp=
编写mitmdump解析脚本:
# 获取share_id数据
def response(flow):
if 'aweme/v1/user/follower/list/' in flow.request.url:
for user in json.loads(flow.response.text)['followers']:
douyin_info = dict()
douyin_info['share_id'] = user['uid']
if user['short_id'] == '0':
douyin_info['douyin_id'] = user['unique_id']
else:
douyin_info['douyin_id'] = user['short_id']
douyin_info['nick_name'] = user['nickname']
save_task(douyin_info) # 保存到MongoDB
print(douyin_info)
手机端配置好mitm.it证书,先运行appium,然后运行mitmdump脚本:
mitmdump -s mitm_get_id.py -p 8080
手动滑动,获取数据成功,保存到数据库,开始编写自动化代码。
配合appium获取元素参数,边写边调试代码:
def handle_douyin(driver, douyin_id):
# 点击搜索
try:
driver.tap([(1040, 80), (1040, 100)], 500)
time.sleep(1)
except Exception as e:
print('未找到搜索', e)
pass
while True:
try:
# 定位搜索框
if WebDriverWait(driver, 3).until(lambda x: x.find_element_by_id("com.ss.android.ugc.aweme:id/ahz")):
# 获取douyin_id进行搜索
driver.find_element_by_id("com.ss.android.ugc.aweme:id/ahz").click()
driver.find_element_by_id("com.ss.android.ugc.aweme:id/ahz").send_keys('{}'.format(douyin_id)) # 输入搜索id
# 点击搜索
# 点击用户标签
# 点击头像
# 点击粉丝按钮
# 向上滑动
# 返回到搜索,并清除搜索内容
except Exception as e:
print(e)
最后,先运行appium,然后运行mitmdump脚本,再运行上面编写的自动化代码。
完成自动获取粉丝数据,主要是获取分享ID,方便构造分享页,获取个人数据。
关键参数:_signature破解
通过分析js代码,找到几个关键位置
包括分享页源代码里面tac参数,拼接HTML文件,获取渲染后的_signature参数
def get_signature(self, tac): # 拼接js构建HTML,获取signature参数
with open(r'html_head', 'r') as f1:
f1_read = f1.read()
with open(r'html_foot', 'r') as f2:
f2_read = f2.read().replace('&&&', self.share_id)
with open(r'result.html', 'w') as f3:
f3.write(f1_read + '\n' + tac + '\n' + f2_read)
。。。
def parse_xhr(self, signature, dytk): # 获取异步数据
xhr_url = f"https://www.iesdouyin.com/web/api/v2/aweme/post/?user_id={self.share_id}&sec_uid=&count=21" \
f"&max_cursor=0&aid=1128&_signature={signature}&dytk={dytk}"
response = requests.get(url=xhr_url, headers=self.pc_headers)
。。。
如果遇到打开抖音,没有获取视频数据,需要安装Xposed和JustTrustMe关闭SSL证书验证:
Xposed安装器下载地址:https://repo.xposed.info/module/de.robv.android.xposed.installer
JustTrustMe下载地址:https://github.com/Fuzion24/JustTrustMe/releases
GitHub:
在线测试地址:https://www.downdawn.com/blog/dy_video/
小服务器经不起爬虫,如果服务器崩了,就会把该页面关了,毕竟这个域名是我的博客地址。。谢谢!
如果有违反相关规定和限制,请联系我,马上删除。