前言
之前使用過python直接爬取抖音用戶的Uid。但是遇到了頗多麻煩事。
麻煩事1:
例如爬過抖音的都知道,爬取抖音用戶的時(shí)候,通過share頁(yè)面,能夠獲取抖音的用戶數(shù)據(jù),但是uid需要對(duì)數(shù)字做字符集映射。
麻煩事2:
再例如,在獲取抖音數(shù)據(jù)的時(shí)候,經(jīng)常會(huì)出現(xiàn)response為200,但是data為空,后來經(jīng)過測(cè)試以及優(yōu)秀的百度,發(fā)現(xiàn)再向抖音請(qǐng)求數(shù)據(jù)的要不斷的獲取,才會(huì)給你一次。這就涉及到了一個(gè)問題,多少次請(qǐng)求一次比較合適,因?yàn)槎虝r(shí)間內(nèi)請(qǐng)求多次,很容易被發(fā)現(xiàn),因此封一段時(shí)間。
然后我就在想,有沒有一種方式,更加快捷。因此我發(fā)現(xiàn),既然能夠從charles獲取到抖音數(shù)據(jù),能不能通過不斷的刷抖音,獲取charles數(shù)據(jù),然后把charles的數(shù)據(jù)導(dǎo)出,通過python解析,也就獲得了抖音的數(shù)據(jù)了。
因此我試著去嘗試獲取一個(gè)抖音大V的所有粉絲的Uid。
一:環(huán)境
編寫語言:python
模擬器:網(wǎng)易mumu模擬器
抓包工具:charles
二、從charles導(dǎo)出數(shù)據(jù)
例如我想要獲取這里的所有的followers。當(dāng)不斷刷抖音粉絲的時(shí)候,
/aweme/v1/user/follower/list/
這個(gè)文件夾下,會(huì)不斷的刷出該用戶的粉絲,每次將獲得20個(gè)粉絲。那么我們只需要把自動(dòng)化把這個(gè)文件夾下的文件導(dǎo)出,然后利用python獲取里面的json數(shù)據(jù)即可,這樣就能獲得用戶的粉絲信息。

點(diǎn)擊tool的Mirror


選擇Enable Mirror以及Only for selected locations
Save to: 則選擇自己想要保存的地址,我這邊直接保存在項(xiàng)目的文件夾里,
然后add

添加你想要獲取的某個(gè)文件夾下的文件。比如我要獲取follower/list的數(shù)據(jù)
然后當(dāng)你的charles這個(gè)文件夾有數(shù)據(jù)的時(shí)候,就會(huì)自動(dòng)的保存該文件夾的數(shù)據(jù)到你自己填寫的保存地址。如下,我保存著自己的項(xiàng)目里
(old文件夾是我自己創(chuàng)建的用于放置以利用過的數(shù)據(jù),新建的是沒有這個(gè)文件夾的)

至此,charles已經(jīng)設(shè)置完了。
三、python該如何獲取剛剛保存的數(shù)據(jù)
創(chuàng)建了一個(gè)read_charles的py文件
首先定位剛剛從charles獲取的數(shù)據(jù),如我上圖,一系列的文件
files為該文件夾下的所有文件。
# path為該項(xiàng)目下的剛剛利用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)
該方法主要是循環(huán)的對(duì)files下的每一個(gè)file進(jìn)行數(shù)據(jù)讀取。并且把讀取過的數(shù)據(jù)放入old這個(gè)文件夾,這邊建議跟我一樣建立一個(gè)在list文件加下創(chuàng)建一個(gè)old文件夾。(沒建立,則將shutil.move(file_data, old_file_path) 該行注釋掉即可)
# 從charles獲取的文件中讀取數(shù)據(jù)到uids
def read_data(self):
try:
for file in files:
# 因?yàn)槲医⒘艘粋€(gè)old文件夾,存放讀取過的文件,因此要過濾掉old這個(gè)文件夾
if file == 'old':
continue
# file_data為文件地址加上文件名,定位到這個(gè)文件
file_data = os.path.join(path, file)
# old_file_path為地址加上old文件名,定位到這個(gè)old文件
old_file_path = os.path.join(path, 'old')
# 從文件中讀取數(shù)據(jù),并且將數(shù)據(jù)轉(zhuǎn)化為json形式
fp = open(file_data, 'r')
data = json.load(fp)
fp.close()
# 將已讀取的文件夾移動(dòng)到old這個(gè)文件加下,以免重復(fù)讀取
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為該項(xiàng)目下的剛剛利用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存進(jìn)一個(gè)set集里
self.uids = set()
# 從charles獲取的文件中讀取數(shù)據(jù)到uids
def read_data(self):
try:
for file in files:
# 因?yàn)槲医⒘艘粋€(gè)old文件夾,存放讀取過的文件,因此要過濾掉old這個(gè)文件夾
if file == 'old':
continue
# file_data為文件地址加上文件名,定位到這個(gè)文件
file_data = os.path.join(path, file)
# old_file_path為地址加上old文件名,定位到這個(gè)old文件
old_file_path = os.path.join(path, 'old')
# 從文件中讀取數(shù)據(jù),并且將數(shù)據(jù)轉(zhuǎn)化為json形式
fp = open(file_data, 'r')
data = json.load(fp)
fp.close()
# 將已讀取的文件夾移動(dòng)到old這個(gè)文件加下,以免重復(fù)讀取
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)
結(jié)果如下:截取部分?jǐn)?shù)據(jù),一共獲取了60個(gè)抖音粉絲的uid

四、利用模擬器,實(shí)現(xiàn)自動(dòng)化的刷粉絲獲取charles數(shù)據(jù)
1、下載模擬器
沒試過其他模擬器是否能夠?qū)崿F(xiàn)錄制功能。筆者下載的是網(wǎng)易的mumu模擬器。
如果其他模擬器也可以,則也可以使用其他模擬器。
2、配置charles
模擬器中,長(zhǎng)按wifi,修改網(wǎng)絡(luò)

手動(dòng)添加代理,代理的ip根據(jù)自己的charles上的顯示來操作


然后打開瀏覽器,進(jìn)入chls.pro/ssl,下載證書。
初次連接的時(shí)候,會(huì)在charles中彈出一個(gè)框,點(diǎn)擊allow就好了,筆者這邊無法截圖。
然后安裝證書,取名隨意。
安裝好后,打開任意軟件看看是否能夠通過charles獲取數(shù)據(jù)。(例如打開百度)

成功。
3、下載抖音
因?yàn)楦甙姹径兑魰?huì)有很多反扒機(jī)制,例如SSL。這邊可以下載低版本的抖音,筆者下載了4.3.3這個(gè)版本,還是可以用的。
4、開始錄制
隨便找了一個(gè)熱門榜上的人的,點(diǎn)擊他的粉絲,發(fā)現(xiàn)有300多萬、、、

點(diǎn)擊下方的操作錄制
點(diǎn)擊新建,然后就可以實(shí)現(xiàn)操作的錄制了。例如筆者這邊的操作是下滑抖音粉絲列表。
操作錄制完之后如圖所示,指定循環(huán)次數(shù),循環(huán)時(shí)間等,
這樣你就會(huì)看到你的Charles里面,不斷的在獲取新的粉絲數(shù)據(jù)。

筆者稍微小試了一會(huì)兒,就獲取了n條數(shù)據(jù)

五、獲取到足夠的數(shù)據(jù)之后,回到python
運(yùn)行,即可獲取所有的粉絲的數(shù)據(jù)了。如圖,筆者獲取了抖音大V的1000個(gè)粉絲,全部放在一個(gè)set集里面
