抖音app的环境部署概述
现在app的加密反爬越来越厉害,我们可以使用模拟点击,操作手,然后用mitmdump拦截,能解决60%的爬虫,再加普通的requests请求,抓包工具,可以解决90%app的爬虫,但是效率不高
一、搭建环境(python3.7+windows+appium + weditor + mitmdump +夜神+安卓5.1.1)
1、 下载sdk,安装,配置好环境,最好去下载android-studio-ide-183.5522156-windows,从ide里面安装sdk很方便
2、下载安卓模拟器,并安装完成后,然后将模拟器中的adb.exe和nox_adb.exe替换成sdk中的adb.exe,最后adb version测试一下
3.安装nodjs,配置好环境,node -v测试一下
4、安装appium,最好去github上取下载安装包安装,解压安装,这种方法省去很多麻烦,是最简单的
5、安装appium-python-client,命令安装即可
5、安装mitmproxy,命令安装,对请求和响应进行拦截,最牛的的是可以执行python脚本
6、在模拟器上安装justrustMe.apk和xposed,可以解决证书信任问题
7、安装 uiautomator2和weditor,命令安装,可以准确的定位元素,用起来真的很爽
8、在谷歌浏览器上安装SwitchyOmega_Chromium,配置好本地代理及端口号127.0.0.1:8889
9、安装fiddler,配置好
二、配置模拟器中的环境
配置模拟器上的手机环境
1.0、打开模拟器,创建一个安卓5.1.1版本手机,开启桥接模式
1.1、开启本地代理,在cmd 运行mitmdump -p 8889
1.2、安装mitmproxy的证书,打开浏览器,访问mitm.it,安装安卓证书,起个名字,设个密码
、配置抓包
2.0、 在fiddler上配置好,代理ip,端口号8889,开启远程访问
2.1 、开启模拟器手机,在手机的浏览器中,访问ip:8889,安装fiddler证书
三、windows安装docker
下载地址:https://store.docker.com/editions/community/docker-ce-desktop-windows
1、创建dockerfile
2、打包镜像
3、运行镜像
4、多任务部署
可实现多任务抓取
四、接下来项目示范,抓取抖音app粉丝数据
步骤:
1、启动appium服务
2、打开夜神模拟器,安装好抖音app
3、mitmdump -s test.py -p 8889
*test.py代码如下*
import json
import csv
def response(flow):
with open('data.csv', 'a', encoding='utf-8', newline='') as fp:
header = ['unique_id', 'uid', 'nickname']
wr = csv.DictWriter(fp, fieldnames=header)
#wr.writeheader()
if 'aweme/v1/user/follower/list' in flow.request.url:
dic_data = json.loads(flow.response.text)
for user in dic_data['followers']:
douyin_info = {}
douyin_info['unique_id'] = user['unique_id'] if user['unique_id'] else None
douyin_info['uid'] = user['uid'] if user['uid'] else None
douyin_info['nickname'] = user['nickname'] if user['nickname'] else None
print(douyin_info)
# 同时写入多行
try:
wr.writerow(douyin_info)
except Exception as e:
print(e)
4、启动模拟点击的脚本(app_click.py)如下:
from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time
import random
cap = {
"platformName": "Android", # 平台名称
"platformVersion": "5.1.1", # 平台版本
"deviceName": "127.0.0.1:62001", # 设备名称
"appPackage": "com.ss.android.ugc.aweme", # 包名
"appActivity": ".splash.SplashActivity", # 激活
"noReset": True, # 记录操作
"unicodekeyboard": True # 允许写汉字
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', cap)
driver_wait = WebDriverWait(driver, 10, 1)
driver.implicitly_wait(10)
time.sleep(10)
def get_size():
x = driver.get_window_size()['width'] # 获取屏幕宽度
y = driver.get_window_size()['height']
return (x, y)
# 点击搜索
if driver_wait.until(lambda x: x.find_element_by_xpath('//*[@resource-id="com.ss.android.ugc.aweme:id/d6z"]')):
driver.find_element_by_xpath('//*[@resource-id="com.ss.android.ugc.aweme:id/d6z"]').click()
time.sleep(2)
# 输入关键字
if driver_wait.until(lambda x: x.find_element_by_xpath('//*[@text="李晨"]')):
driver.find_element_by_xpath('//*[@text="李晨"]').click()
time.sleep(3)
# 选择李晨的大图像
if driver_wait.until(lambda x: x.find_element_by_xpath(
'//*[@resource-id="com.ss.android.ugc.aweme:id/aal"]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[2]/android.view.View[1]/android.widget.ImageView[1]'
)):
driver.find_element_by_xpath(
'//*[@resource-id="com.ss.android.ugc.aweme:id/aal"]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[2]/android.view.View[1]/android.widget.ImageView[1]').click()
time.sleep(2)
# 点击粉丝
if driver_wait.until(lambda x: x.find_element_by_xpath(
'//*[@resource-id="com.ss.android.ugc.aweme:id/c_m"]'
)):
driver.find_element_by_xpath(
'//*[@resource-id="com.ss.android.ugc.aweme:id/c_m"]').click()
d = get_size()
x1 = int(d[0] * 0.5) # 鼠标,开始的停的位置
x2 = int(d[0] * 0.5) # 滑轮,从哪里开始滑动
y1 = int(d[1] * 0.75) # 滑轮,从哪里滑动结束
y2 = int(d[1] * 0.25) # 鼠标,从哪里停止
while True:
driver.swipe(x1, y1, x2, y2) # 循环的执行滑动
time.sleep(random.randint(1, 4))