爬虫相关

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

2020-01-07  本文已影响0人  Shawn丶

前言

之前使用过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
上一篇下一篇

猜你喜欢

热点阅读