前言
之前使用过python直接爬取抖音用户的Uid。但是遇到了颇多麻烦事。
麻烦事1:
例如爬过抖音的都知道,爬取抖音用户的时候,通过share页面,能够获取抖音的用户数据,但是uid需要对数字做字符集映射。
麻烦事2:
再例如,在获取抖音数据的时候,经常会出现response为200,但是data为空,后来经过测试以及优秀的百度,发现再向抖音请求数据的要不断的获取,才会给你一次。这就涉及到了一个问题,多少次请求一次比较合适,因为短时间内请求多次,很容易被发现,因此封一段时间。
然后我就在想,有没有一种方式,更加快捷。因此我发现,既然能够从charles获取到抖音数据,能不能通过不断的刷抖音,获取charles数据,然后把charles的数据导出,通过python解析,也就获得了抖音的数据了。
因此我试着去尝试获取一个抖音大V的所有粉丝的Uid。
一:环境
编写语言:python
模拟器:网易mumu模拟器
抓包工具:charles
二、从charles导出数据
例如我想要获取这里的所有的followers。当不断刷抖音粉丝的时候,
/aweme/v1/user/follower/list/
这个文件夹下,会不断的刷出该用户的粉丝,每次将获得20个粉丝。那么我们只需要把自动化把这个文件夹下的文件导出,然后利用python获取里面的json数据即可,这样就能获得用户的粉丝信息。
点击tool的Mirror
选择Enable Mirror
以及Only for selected locations
Save to
: 则选择自己想要保存的地址,我这边直接保存在项目的文件夹里,
然后add
添加你想要获取的某个文件夹下的文件。比如我要获取follower/list的数据
然后当你的charles这个文件夹有数据的时候,就会自动的保存该文件夹的数据到你自己填写的保存地址。如下,我保存着自己的项目里
(old文件夹是我自己创建的用于放置以利用过的数据,新建的是没有这个文件夹的)
至此,charles已经设置完了。
三、python该如何获取刚刚保存的数据
创建了一个read_charles
的py文件
首先定位刚刚从charles获取的数据,如我上图,一系列的文件
files
为该文件夹下的所有文件。
# path为该项目下的刚刚利用charles获取的文件的地址
# files为该文件夹下所有的文件()
path = os.path.join(os.path.dirname(__file__), os.pardir, 'douyin_crawling/charles/aweme-lq.snssdk.com/aweme/v1/user/follower/list')
files = os.listdir(path)
该方法主要是循环的对files下的每一个file进行数据读取。并且把读取过的数据放入old这个文件夹,这边建议跟我一样建立一个在list
文件加下创建一个old文件夹。(没建立,则将shutil.move(file_data, old_file_path)
该行注释掉即可)
# 从charles获取的文件中读取数据到uids
def read_data(self):
try:
for file in files:
# 因为我建立了一个old文件夹,存放读取过的文件,因此要过滤掉old这个文件夹
if file == 'old':
continue
# file_data为文件地址加上文件名,定位到这个文件
file_data = os.path.join(path, file)
# old_file_path为地址加上old文件名,定位到这个old文件
old_file_path = os.path.join(path, 'old')
# 从文件中读取数据,并且将数据转化为json形式
fp = open(file_data, 'r')
data = json.load(fp)
fp.close()
# 将已读取的文件夹移动到old这个文件加下,以免重复读取
shutil.move(file_data, old_file_path)
# 读取获取的抖音粉丝的uid,放入set
for i in range(len(data['followers']) ):
uid = data['followers'][i]['uid']
self.uids.add(uid)
except Exception as e:
print('read data error[', e.__traceback__.tb_lineno, ']: ', e)
time.sleep(10)
其余的没什么好说的,自行看代码。
完整代码如下:
import shutil, os
import json
import time
# path为该项目下的刚刚利用charles获取的文件的地址
# files为该文件夹下所有的文件()
path = os.path.join(os.path.dirname(__file__), os.pardir, 'douyin_crawling/charles/aweme-lq.snssdk.com/aweme/v1/user/follower/list')
files = os.listdir(path)
# 获取charles获取的所有抖音大V的粉丝的UId
class ReadCharles():
def __init__(self):
# 将所有的uid存进一个set集里
self.uids = set()
# 从charles获取的文件中读取数据到uids
def read_data(self):
try:
for file in files:
# 因为我建立了一个old文件夹,存放读取过的文件,因此要过滤掉old这个文件夹
if file == 'old':
continue
# file_data为文件地址加上文件名,定位到这个文件
file_data = os.path.join(path, file)
# old_file_path为地址加上old文件名,定位到这个old文件
old_file_path = os.path.join(path, 'old')
# 从文件中读取数据,并且将数据转化为json形式
fp = open(file_data, 'r')
data = json.load(fp)
fp.close()
# 将已读取的文件夹移动到old这个文件加下,以免重复读取
shutil.move(file_data, old_file_path)
# 读取获取的抖音粉丝的uid,放入set
for i in range(len(data['followers']) ):
uid = data['followers'][i]['uid']
self.uids.add(uid)
except Exception as e:
print('read data error[', e.__traceback__.tb_lineno, ']: ', e)
time.sleep(10)
def operate(self):
try:
print(len(files))
self.read_data()
print(len(self.uids))
except Exception as e:
print('operate error[', e.__traceback__.tb_lineno, ']: ', e)
time.sleep(10)
if __name__ == '__main__':
obj = ReadCharles()
obj.operate()
print(len(obj.uids))
print(obj.uids)
结果如下:截取部分数据,一共获取了60个抖音粉丝的uid
四、利用模拟器,实现自动化的刷粉丝获取charles数据
1、下载模拟器
没试过其他模拟器是否能够实现录制功能。笔者下载的是网易的mumu模拟器。
如果其他模拟器也可以,则也可以使用其他模拟器。
2、配置charles
模拟器中,长按wifi,修改网络
手动添加代理,代理的ip根据自己的charles上的显示来操作
然后打开浏览器,进入chls.pro/ssl,下载证书。
初次连接的时候,会在charles中弹出一个框,点击allow就好了,笔者这边无法截图。
然后安装证书,取名随意。
安装好后,打开任意软件看看是否能够通过charles获取数据。(例如打开百度)
成功。
3、下载抖音
因为高版本抖音会有很多反扒机制,例如SSL。这边可以下载低版本的抖音,笔者下载了4.3.3这个版本,还是可以用的。
4、开始录制
随便找了一个热门榜上的人的,点击他的粉丝,发现有300多万、、、
点击下方的操作录制
点击新建,然后就可以实现操作的录制了。例如笔者这边的操作是下滑抖音粉丝列表。
操作录制完之后如图所示,指定循环次数,循环时间等,
这样你就会看到你的Charles里面,不断的在获取新的粉丝数据。
笔者稍微小试了一会儿,就获取了n条数据
五、获取到足够的数据之后,回到python
运行,即可获取所有的粉丝的数据了。如图,笔者获取了抖音大V的1000个粉丝,全部放在一个set集里面