美文网首页爬虫相关
利用Charles以及模拟器的录制功能,巧妙的爬取抖音数据。

利用Charles以及模拟器的录制功能,巧妙的爬取抖音数据。

作者: Shawn丶 | 来源:发表于2020-01-07 18:01 被阅读0次

    前言

    之前使用过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数据即可,这样就能获得用户的粉丝信息。

    image.png

    点击tool的Mirror


    image.png
    image.png

    选择Enable Mirror以及Only for selected locations
    Save to: 则选择自己想要保存的地址,我这边直接保存在项目的文件夹里,
    然后add

    image.png
    添加你想要获取的某个文件夹下的文件。比如我要获取follower/list的数据
    然后当你的charles这个文件夹有数据的时候,就会自动的保存该文件夹的数据到你自己填写的保存地址。如下,我保存着自己的项目里
    (old文件夹是我自己创建的用于放置以利用过的数据,新建的是没有这个文件夹的)
    image.png

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


    image.png

    四、利用模拟器,实现自动化的刷粉丝获取charles数据

    1、下载模拟器

    没试过其他模拟器是否能够实现录制功能。笔者下载的是网易的mumu模拟器。
    如果其他模拟器也可以,则也可以使用其他模拟器。

    2、配置charles

    模拟器中,长按wifi,修改网络


    image.png

    手动添加代理,代理的ip根据自己的charles上的显示来操作


    image.png image.png

    然后打开浏览器,进入chls.pro/ssl,下载证书。
    初次连接的时候,会在charles中弹出一个框,点击allow就好了,笔者这边无法截图。
    然后安装证书,取名随意。
    安装好后,打开任意软件看看是否能够通过charles获取数据。(例如打开百度)


    image.png

    成功。

    3、下载抖音

    因为高版本抖音会有很多反扒机制,例如SSL。这边可以下载低版本的抖音,笔者下载了4.3.3这个版本,还是可以用的。

    4、开始录制

    随便找了一个热门榜上的人的,点击他的粉丝,发现有300多万、、、


    image.png

    点击下方的操作录制
    点击新建,然后就可以实现操作的录制了。例如笔者这边的操作是下滑抖音粉丝列表。
    操作录制完之后如图所示,指定循环次数,循环时间等,
    这样你就会看到你的Charles里面,不断的在获取新的粉丝数据。


    image.png

    笔者稍微小试了一会儿,就获取了n条数据


    image.png

    五、获取到足够的数据之后,回到python

    运行,即可获取所有的粉丝的数据了。如图,笔者获取了抖音大V的1000个粉丝,全部放在一个set集里面


    image.png

    相关文章

      网友评论

        本文标题:利用Charles以及模拟器的录制功能,巧妙的爬取抖音数据。

        本文链接:https://www.haomeiwen.com/subject/mjtdactx.html