由于最终目的是要抓取抖音视频数据,而经过抓包发现请求抖音的视频数据都须要对应用户的sec_id,这个加密的id的生成过程咱们是不知道的,可是咱们能够从抖音用户的数据包中看到对应的sec_id,并且这个加密的id不会变的,因此我能够先爬取用户的数据,但经过用户的关注列表以及粉丝列表获取其余用户的sec_id,知道了用户的数据,咱们就能够爬取用户的视频数据了。这一篇文章我将介绍抖音用户数据爬取。python
若是你已经配置好环境(手机上安装好了抖音app而且抓包软件等也都配置好了),就能够开心食用下文,不然请查看环境配置而后再继续本文。
android
打开抖音,进入抖音发布者我的页面:(点击右方发布者头像进入发布者我的页面)
这个时候咱们查看fiddle抓到的包,咱们发现对应的数据的请求地址都是包含“aweme”样式的url,fiddle右上角就是咱们的请求数据,右下角就是对应的响应数据:
由于个人爬取思路是根据用户的关注列表爬取关注列表的关注列表,因此我不太关注用户自己的数据,我更感兴趣的是用户的关注列表数据以及粉丝数据,那怎么看用户的关注列表呢?
这样咱们就能够看到用户的关注列表了,那么对应的抓包软件抓到的包是什么呢:
从图中咱们能够看到follower就是用户的粉丝数据,following就是用户关注的用户。对应的请求头和响应数据以下图所示:
json
咱们首先分析请求数据:
请求数据包括对应的url(也就是api),对应的header数据,其中headers里面有Host、Connection、Cookie、Accept-Encoding、X-SS-QUERIES、X-SS-REQ-TICKET、X-Tt-Token、sdk-version、User-Agent、X-Khronos、X-Gorgon、X-Podsapi
api = "https://api.amemv.com/aweme/v1/user/follower/list/?" \ # url "user_id={}" \ # user_id 能够在用户关注列表中搞到 "&max_time={}" \ # 当前时间戳 "&count=20&offset=0&source_type=1&address_book_access=2&gps_access=2" \ # 不重要 "&ts={}" \ # 当前时间戳 "&js_sdk_version=1.16.3.5&app_type=normal&manifest_version_code=630" \ # 不重要 "&_rticket={}" \ # 当前时间戳 "&ac=wifi&device_id=47012747444&iid=1846815477740845" \ # 不重要 "&os_version=8.0.0&channel=wandoujia_aweme1&version_code=630" \ # 不重要 "&device_type=HUAWEI%20NXT-AL10&language=zh&resolution=1080*1812&openudid=b202a24eb8c1538a" \ # 不重要 "&update_version_code=6302&app_name=aweme&version_name=6.3.0&os_api=26&device_brand=HUAWEI&ssmix=a" \ # 不重要 "&device_platform=android&dpi=480&aid=1128" \ # 不重要 "&sec_user_id={}"\ # 加密的uid 能够在用户关注列表中搞到 ".format(user_id, max_time, ts, _rticket, sec_user_id)
根据上面的api,咱们发现大部分的数据咱们是能够构造的,只有user_id以及加密的sec_user_id咱们没法本身构造,可是咱们能够经过用户的关注列表中获取到它关注的全部的用户的user_id和sec_user_id,因此咱们只须要知道一个用户的user_id和sec_user_id,咱们就能够获取和他关联的用户以及和他关联的用户的用户的user_id和sec_user_id。cookie
Host: api.amemv.com # 对应的host 不变 Connection: keep-alive # 不变,不重要 Cookie: "cookies" # 重要,不变,你本身的cookie,能够在fiddle中看到 Accept-Encoding: gzip # 不变 X-SS-REQ-TICKET: 1606999477776 # 当前的时间戳,咱们能够本身构造 X-Tt-Token: 003ea17385e4...23bbe199e41467-1.0.0 # 你本身的token,重要,不变,能够在fiddle中看到 sdk-version: 1 # 不变 User-Agent: com.ss.a....0.2991.0) # 重要,你本身的ua,能够在fiddle中看到 X-Khronos: 1606999477 # 当前时间戳 X-Gorgon: 03006cc00000d7464322a76ab998c12eef987b81af552788dabd # 重要,我后面会讲怎么获取 X-Pods: # 不重要,能够不要它
经过分析请求头,咱们发现大部分数据是不变的,并且咱们均可以经过Fiddle得到,惟一不能得到的或者说会发生改变的是:X-Gorgon,经过反编译抖音APK,咱们发现它是根据请求的url和cookies和token等生成的。
这里贴一下对应的请求X-Gorgon的代码:
假设咱们已经知道了咱们本身的cookies和token以及咱们请求的url那么咱们能够获取到对应的X-Gorgon:app
# 获取当前时间戳: ts = str(time.time()).split(".")[0] _rticket = str(time.time() * 1000).split(".")[0] max_time = ts user_id = "96244072243" sec_user_id = "MS4wLjABAAAAtk0pVzYt82o_R5jUjN4FEpRlautyPFGSgioxrH-jfvg" # 下面填写你本身的cookies和token cookies = "你本身的cookies" token = "你本身的token" # 构造请求的url url= "https://api.amemv.com/aweme/v1/user/follower/list/?" \ "user_id={}" \ "&max_time={}" \ "&count=20&offset=0&source_type=1&address_book_access=2&gps_access=2" \ "&ts={}" \ "&js_sdk_version=1.16.3.5&app_type=normal&manifest_version_code=630" \ "&_rticket={}" \ "&ac=wifi&device_id=47012747444&iid=1846815477740845" \ "&os_version=8.0.0&channel=wandoujia_aweme1&version_code=630" \ "&device_type=HUAWEI%20NXT-AL10&language=zh&resolution=1080*1812&openudid=b202a24eb8c1538a" \ "&update_version_code=6302&app_name=aweme&version_name=6.3.0&os_api=26&device_brand=HUAWEI&ssmix=a" \ "&device_platform=android&dpi=480&aid=1128" \ "&sec_user_id={}".format(user_id, max_time, ts, _rticket, sec_user_id) # 发起请求获取X-Gorgon headers = { "dou-url": url, # 填写对应的请求的api "dou-cookies": cookies, # 填写你的cookies "dou-token": token, # 填写你的token "dou-queries": "" # 填写你的请求的queries(没有的话,就填空置:“”) } res = requests.get("http://8.131.59.252:8080", headers=headers) if res.status_code==200: res_gorgon = json.loads(res.text) if res_gorgon.get("status") == 0: gorgon = res_gorgon.get("X-gorgon") else: print("param error when get gorgon") return else: print("request error when get gorgon") return print("gorgon: " + gorgon) # 这就是你的gorgon了
# 从新构造请求头: headers = { "Host": "api.amemv.com", "Connection": "keep-alive", "Cookie": cookies, # 你本身的Cookies "Accept-Encoding": "gzip", "X-SS-REQ-TICKET": _rticket, # 当前时间戳,上面的代码片已经生成了 "X-Tt-Token": "0095a45e5cc.....c42c97e37d7350", # 你本身的token "sdk-version": "1", "User-Agent": "你本身的user-agent", "X-Khronos": ts, # 当前时间戳,上面的代码片已经生成了 "X-Gorgon": gorgon # X-gorgon,上面的代码片已经生成了 } # 发起请求 result = doGetGzip(url, headers) # 这是我本身写的函数,在下面的代码片中 print(result)
def doGetGzip(url, headers): req = request.Request(url) for key in headers: req.add_header(key, headers[key]) with request.urlopen(req) as f: data = f.read() return gzip.decompress(data).decode()
响应的数据的格式是json的,因此通常咱们都将响应的数据转换成json进行处理,经过fiddle抓包咱们能够看到响应数据主要包括下面几个部分,而关注的用户的信息都在“followers”里面。其余的字段主要用于翻页,由于一次请求只返回20条数据,响应数据的其余字段:has_more 表示的是是否是有更的数据,max_time就是下一页数据的游标,咱们主要关注follower里的数据。
下面咱们能够看到followers里面有20条数据,每一条数据里面就是一个用户的信息
下面就是具体的每个用户的字段:
用户字段有不少,大多数对我来讲都没有用,我只关注user_id 和 对应的 sec_uid,固然若是能够看本身的需求获取更多的数据,从上图咱们发现咱们能够获取到,所以个人目的就达到了,这样我就能够把它们存下来,下面再经过它俩请求这个用户关注的用户的这两个信息,下一篇文章我将主要介绍一下如何爬取视频信息。
以上就是获取抖音用户的所有内容了,后面我会具体讲解怎么抓取视频数据等,码字不易,还请点赞关注,有任何问题请留言。
函数
——————————————————————————————————————————ui
覆盖主流平台:抖音,快手,小红书,TikTok,YouTube加密