• 运营托管
  • 装修设计
  • 摄影拍照
  • 客服外包
  • 全 部 栏 目

    装修设计 运营托管 摄影拍照 营销推广 客服外包 商城入驻 短视频推广 设计素材 电商百科

    Python 抖音视频和评论爬虫

    平时工作闲的时候,会刷刷抖音。于是想爬取一下抖音的视频。网上搜索资料,发现多数都是爬取固定用户的主页视频。我想要的效果是爬取首页的随机视频和评论,于是自己抓包分析,实现效果。在做项目的过程中遇到了一些问题,在此记录下来。

    抖音爬虫

    如果有帮助的话,记得给个star哦

    因原AppSign加签服务不可用,所以换了个加签服务项目Sign-douyin,目前该项目还可用。根据该项目,代码已更新。改动之处如下:

    提供的设备参数以及获取加密参数方法修改

    原方法是采用AppSign提供的token值,拼接上参数,请求加密参数,现在Sign-Dou+Yin是要求提供url,所以将拼接好的url post给它,但是测试下来发现我原来的参数拼接成url给它,返回给我的是带有加密参数的url,但我请求这个url拿不到视频数据,而且加密参数从原来的三个ts、as、mas变成四个ts、cp、as、mas。猜测可能是抖音加密算法升级了,导致提供原来的参数不行了,所以我仿照Sign-douYin项目demo里提供的参数提供给它,获取到带有加密参数的url是可以获取视频数据的。所以修改为get_feed_params()和get_sign_url(),具体改动见Github代码

    视频数据和评论数据分离

    原来是采用从首页feed流接口中拿到视频数据后解析出awesome_id,直接给评论接口,从而获取该视频的评论数据。但这是建立在从首页接口获取的加密参数可以直接复用,拼接在评论接口末尾的条件下,原AppSign是可以这样做的,但Sign-DouYin测试下来,根据 https://aweme.snssdk.com/aweme/v1/feed/ 获取的加密参数ts、cp、as、mas不能用于 https://aweme.snssdk.com/aweme/v2/comment/list/ , 所以要请求评论数据的话,还要每一次都要请求加密参数,这样的话对 Sign-DouYin 项目的服务器压力很大,这样对开源作者不友好,而且作者也提供了视频评论的api,所以就将视频和评论分开,先将视频数据存到数据库,再从数据库里拿到awesome_id请求api返回评论数据。但同样请求api也会对服务器有压力,所以请谨慎使用。首页feed流数据可以多次请求的原因是对Sign-DouYin来说,只请求了一次获取加密参数,后面多次请求的是抖音的首页接口。

    其他一些小改动具体见代码

    爬取首页随机视频的作者、ID、名称、点赞数、评论数、分享数、背景音乐作者、名称和无水印视频下载地址

    爬取对应视频的前十条评论的作者、内容、点赞数、评论时间。如果有回复别人的情况,还要爬取被回复的用户名、内容、点赞数和评论时间

    下载无水印视频(已经实现,但考虑到存储空间不足,已注释,暂不使用)

    按照网上教程,用Fiddler抓取iphone手机包,发现不设置代理,可以正常上网,设置了代理之后,就上不了网了。https的请求都会失败,提示错误信息为Failure SSLHandshake: Received fatal alert: unknown_ca 和You may need to configure your browser or application to trust the Charles Root Certificate. 但是相关设置都正确:电脑上安装了Fiddler 的根证书,并且设置了始终信任,然后手机上也安装了描述文件,一切都按正常程序走的, 但是错误始终无法解决。

    原因:

    虽然Fiddler的根证书已经在安装列表中显示,但它是被关闭的。在iOS 10.3之前,当你将安装一个自定义证书,iOS会默认信任,不需要进一步的设置。而iOS 10.3之后,安装新的自定义证书默认是不受信任的。如果要信任已安装的自定义证书,需要手动打开开关以信任证书。

    解决:

    设置->通用->关于本机->证书信任设置-> 找到DO_NOT_TRUST_FiddlerRoot然后信任该证书即可。

    抓包分析,找到了首页视频流接口url:https://aweme-eagle.snssdk.com/aweme/v1/feed/

    url参数如下(样例):

    Name

    Value

    Description

    iid

    51050168070

    设备信息

    idfa

    887748FC-0DA1-4984-B87F-F2FC9AC5D14B

    设备信息

    device_type

    iPhone5,2

    设备信息

    os_version

    10.3.3

    设备信息

    screen_Width</td>

    640

    设备信息

    vid

    AECABC99-0F66-4086-86BC-EC4E01B4DEA1

    设备信息

    device_id

    59415024289

    设备信息

    os_api

    18

    设备信息

    device_platform

    iphone

    设备信息

    openudid

    75a4bc255848cd7901e166e5c168b23e3e9394a8

    设备信息

    version_code

    3.1.0

    app信息

    aid

    1128

    app信息

    app_name

    aweme

    app信息

    build_number

    31006

    app信息

    app_version

    3.1.0

    app信息

    channel

    App Store

    app信息

    pass-region

    1

    常量

    js_sdk_version

    1.3.0.1

    常量

    ac

    mobile

    常量

    count

    6

    视频数

    feed_style

    0

    常量

    filter_warn

    0

    常量

    max_cursor

    0

    常量

    min_cursor

    0

    常量

    pull_type

    0

    常量

    type

    0

    常量

    volume

    0.06

    常量

    mas

    0161b6c4a20babcf6829e30950a9f3a577adb04abc0c6da0eeca91

    加密参数

    as

    a105e18ff4e32b1a102320

    加密参数

    ts

    1542462004

    加密参数

    其中mas、as、ts为加密参数,其余的设备和app一旦确定下来,就都是常量了。三个加密参数需要一步一步分析JS文件才能得出这三个加密参数如何生成的。

    解决:

    有万能的GitHub,在此感谢AppSign提供加密签名服务,参照该文档,很快可以得到三个加密参数,和其他参数一起给接口就可以拿到返回的视频流数据了。

    同样,评论接口加密参数也是一样的,相同的办法就可以拿到评论数据了。

    评论url:https://aweme.snssdk.com/aweme/v2/comment/list/

    url参数如下(样例):

    Name

    Value

    Description

    iid

    51050168070

    设备信息

    idfa

    887748FC-0DA1-4984-B87F-F2FC9AC5D14B

    设备信息

    device_type

    iPhone5,2

    设备信息

    os_version

    10.3.3

    设备信息

    screen_Width</td>

    640

    设备信息

    vid

    AECABC99-0F66-4086-86BC-EC4E01B4DEA1

    设备信息

    device_id

    59415024289

    设备信息

    os_api

    18

    设备信息

    device_platform

    iphone

    设备信息

    openudid

    75a4bc255848cd7901e166e5c168b23e3e9394a8

    设备信息

    version_code

    3.1.0

    app信息

    aid

    1128

    app信息

    app_name

    aweme

    app信息

    build_number

    31006

    app信息

    app_version

    3.1.0

    app信息

    channel

    App Store

    app信息

    pass-region

    1

    常量

    js_sdk_version

    1.3.0.1

    常量

    ac

    mobile

    常量

    aweme_id

    6624665048084122888

    视频ID

    count

    10

    评论数

    cursor

    0

    常量

    insert_ids

    0

    常量

    mas

    0161b6c4a20babcf6829e30950a9f3a577adb04abc0c6da0eeca91

    加密参数

    as

    a105e18ff4e32b1a102320

    加密参数

    ts

    1542462004

    加密参数

    原本打算程序放到服务器上一直跑的,想了一下由于没有使用代理池,长时间跑可能会被封IP,而且一直跑对AppSign提供加签的服务器也有一定的压力,最后决定每天爬取1万条视频数据。那么这就涉及到数据库关闭的问题。

    因为我采用的是爬取和存储是分开的线程,而且考虑到减少加签服务器的压力,爬取线程速度较慢,存储线程

    速度快,并且设置两个线程的daemon=True(会随着主线程的结束而结束)。这时候就不能通过queue.join()来控制主线程是否阻塞。因为queue的get速度比put速度要快,这样主程序运行一段时间就会因为queue中待处理的数据为0,从而使queue.join()放通,导致主程序结束,子线程也会随之结束,爬取视频达不到1万条。

    解决:

    在爬取线程的1万条数据完成之后手动给queue发送一个结束标志,存储线程收到结束标志后不做处理,将其发送给主线程,主线程里循环检查queue中数据是否为结束标志,如果是,则关闭数据库连接,跳出循环,结束主程序,子线程也同时结束,程序终止。代码如下:

    本项目大部分的时间花费在解决问题1和2上。最开始抓不到包,怎么都解决不了,查了好长时间才发现是这个问题。三个加密参数也卡了很长时间,最后发现github上有提供加签服务的。以后遇到些复杂的问题,先去github上看看有没有现成的东西。

    项目里还实现了一个附加功能:从抖音的分享链接中下载无水印视频。这个功能的实现,下篇文章会讲到。

    上一篇:抖音养号涨粉引流推广软件系统
    下一篇:微信出大招,“视频号”来了,抖音会颤抖吗?

    © 2016-2020 巨人电商

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信