利用Charles以及模擬器的錄制功能,巧妙的爬取抖音數(shù)據(jù)。

前言

之前使用過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ù)即可,這樣就能獲得用戶的粉絲信息。

image.png

點(diǎn)擊tool的Mirror


image.png

image.png

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

image.png

添加你想要獲取的某個(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è)文件夾的)
image.png

至此,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


image.png

四、利用模擬器,實(shí)現(xiàn)自動(dòng)化的刷粉絲獲取charles數(shù)據(jù)

1、下載模擬器

沒試過其他模擬器是否能夠?qū)崿F(xiàn)錄制功能。筆者下載的是網(wǎng)易的mumu模擬器。
如果其他模擬器也可以,則也可以使用其他模擬器。

2、配置charles

模擬器中,長(zhǎng)按wifi,修改網(wǎng)絡(luò)


image.png

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


image.png
image.png

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


image.png

成功。

3、下載抖音

因?yàn)楦甙姹径兑魰?huì)有很多反扒機(jī)制,例如SSL。這邊可以下載低版本的抖音,筆者下載了4.3.3這個(gè)版本,還是可以用的。

4、開始錄制

隨便找了一個(gè)熱門榜上的人的,點(diǎn)擊他的粉絲,發(fā)現(xiàn)有300多萬、、、


image.png

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


image.png

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


image.png

五、獲取到足夠的數(shù)據(jù)之后,回到python

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


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天偶然刷微博看到之前何炅應(yīng)該是錄《世界青年說》的節(jié)目吧,其中一段節(jié)選就是,他談:夢(mèng)想不僅僅是用來實(shí)現(xiàn)的。 其實(shí)應(yīng)...
    把心開好閱讀 398評(píng)論 0 9
  • 痛哭!眼部淚溝自體脂肪填充后很后悔、自體脂肪填充就我毀了?有不少小仙女還不到30歲就出現(xiàn)了淚溝,忍不住做了自體脂肪...
    tongben0405閱讀 31,833評(píng)論 0 0
  • “旁友,要票子哇”看完愛情公寓 ,對(duì)這句話津津樂道,說的就是黃牛。 本人表示對(duì)于黃牛深惡痛絕,畢業(yè)前南漂創(chuàng)業(yè),做農(nóng)...
    麻團(tuán)ER閱讀 433評(píng)論 0 1
  • 改革騰飛四十秋,春風(fēng)化雨沐神州。 航空母艦登新路,九號(hào)神舟任遠(yuǎn)遊。 兩百方針民意喜,城鄉(xiāng)一體用心周。 和諧共筑中華...
    林野輕風(fēng)閱讀 242評(píng)論 0 1
  • 今天好累啊 每天都會(huì)學(xué)到新的東西,問自己為什么要活的這么努力,因?yàn)橄胱兊酶鼜?qiáng)。 每天堅(jiān)持去做一件事情,可我發(fā)現(xiàn)這樣...
    金橘錦鯉閱讀 254評(píng)論 0 0

友情鏈接更多精彩內(nèi)容