抖音视频下载爬虫编写的完整过程!爬取app的过程

抖音视频下载爬虫编写的完整过程!爬取app的过程

大家好,又见面了,我是全栈君。

工具:

charles(类似fiddler) chrome debug调试台 jupyter notebook

分析APP情况

准备好charles的手机ssl证书,设置好代理启动charles开始抓取抖音app数据。经过分析可以看到如下结果 输入图片说明

可以获得两个get请求!

https://aweme.snssdk.com/aweme/v1/discover/search/?iid=15735436175&device_id=37063549497&os_api=18&app_name=aweme&channel=App%20Store&idfa=08621BB7-65C3-454D-908A-D02F565D85F1&device_platform=iphone&build_number=15805&vid=6BD753D7-C89A-4BEF-9C3D-7192E26CF330&openudid=ee5f41b63ff4704166b2f2d8920267fcd109136b&device_type=iPhone6,2&app_version=1.5.8&version_code=1.5.8&os_version=11.0.3&screen_width=640&aid=1128&ac=WIFI&count=10&cursor=0&keyword=关键词&type=1&cp=9646915915dce7fbe1&as=a115d95e314449fffd&ts=时间戳

https://aweme.snssdk.com/aweme/v1/aweme/post/?iid=15735436175&device_id=37063549497&os_api=18&app_name=aweme&channel=App%20Store&idfa=08621BB7-65C3-454D-908A-D02F565D85F1&device_platform=iphone&build_number=15805&vid=6BD753D7-C89A-4BEF-9C3D-7192E26CF330&openudid=ee5f41b63ff4704166b2f2d8920267fcd109136b&device_type=iPhone6,2&app_version=1.5.8&version_code=1.5.8&os_version=11.0.3&screen_width=640&aid=1128&ac=WIFI&count=视频数量&max_cursor=0&min_cursor=0&user_id=用户ID&cp=e7329b5ccceae5cbe1&as=a125ee5e8cd3393c4e&ts=时间戳
#以上链接进行了处理以便不能直接访问。

大体逻辑是通过搜索获得用户名列表,在判断用户名列表是不是想要的那位达人,获取他的user_id、count,然后通过第二链接获得用户的分享链接,再通过分享链接页面爬取视频

编写代码

class DouYin(object):
    def __init__(self):
        print(sys.getdefaultencoding(),"抖音下载!")
        #urllib3连接错误时抛出exceptions.SSLError 
        http = urllib3.PoolManager(cert_reqs = 'CERT_REQUIRED', ca_certs = certifi.where())
    
    #获得总分享视频url地址,返回视频名字,视频数,分享视频链接列表
    def get_video_url(self,nickname):
        video_name = []
        video_urls = []
        user_agent = 'Aweme/1.5.8 (iPhone; iOS 11.0.3; Scale/2.00)'
        header = {'User-Agent':user_agent}
        search_url = "https://aweme.snssdk.com/aweme/v1/discover/search/?iid=15735436175&device_id=37063549497&os_api=18&app_name=aweme&channel=App%20Store&idfa=08621BB7-65C3-454D-908A-D02F565D85F1&device_platform=iphone&build_number=15805&vid=6BD753D7-C89A-4BEF-9C3D-7192E26CF330&openudid=ee5f41b63ff4704166b2f2d8920267fcd109136b&device_type=iPhone6,2&app_version=1.5.8&version_code=1.5.8&os_version=11.0.3&screen_width=640&aid=1128&ac=WIFI&count=10&cursor=0&keyword={0}&type=1&cp=9646915915dce7fbe1&as=a115d95e314449fffd&ts={1}".format(quote(nickname),int(time.time()))   
        print(search_url)
        req = http.request('GET',search_url)
        html = json.loads(req.data.decode('utf-8'))
        for each in html['user_list']:
            if each['user_info']['nickname'] == nickname:
                aweme_count = each['user_info']['aweme_count']
                user_id = each['user_info']['uid']
        user_url = 'https://aweme.snssdk.com/aweme/v1/aweme/post/?iid=15735436175&device_id=37063549497&os_api=18&app_name=aweme&channel=App%20Store&idfa=08621BB7-65C3-454D-908A-D02F565D85F1&device_platform=iphone&build_number=15805&vid=6BD753D7-C89A-4BEF-9C3D-7192E26CF330&openudid=ee5f41b63ff4704166b2f2d8920267fcd109136b&device_type=iPhone6,2&app_version=1.5.8&version_code=1.5.8&os_version=11.0.3&screen_width=640&aid=1128&ac=WIFI&count={0}&max_cursor=0&min_cursor=0&user_id={1}&cp=e7329b5ccceae5cbe1&as=a125ee5e8cd3393c4e&ts={2}'.format(aweme_count,user_id,int(time.time()))
        r = http.request('GET',user_url,headers = header)
        htm = json.loads(r.data.decode('utf-8'))
        for each in htm['aweme_list']:
            share_desc = each['share_info']['share_desc']
            if '抖音-原创音乐短视频社区'  == share_desc:
                print(each)
                video_names.append(each[cha_list][0]['cha_name']+'.mp4')
            else:
                video_names.append(share_desc+'.mp4')
            video_url.append(each['share_info']['share_url'])
        return video_names,video_urls,aweme_count
    
    #获得下载视频地址
    def get_download_url(self,video_url):
        #video_url = 'https://www.douyin.com/share/video/6479379598709624078/?region=CN&mid=6477398356422789901'
        req = http.request('GET',video_url).data.decode('utf-8')
        video_url_data = re.findall('var data = \[(.*?)\];', str(req))[0]
        video_html = json.loads(video_url_data)
        download_url = video_html['video']['real_play_addr']
        return download_url
       
     #下载视频   
    def vedio_download(self,video_name,video_url):
        size = 0
        with closing(http.request('GET',video_url,preload_content=False)) as response:
            chunk_size = 1024
            content_size =int(response.headers['content-length'])
            if response.status == 200:
                print('[文件大小]:%0.2f MB' % (content_size / chunk_size / 1024))
                with open(filename,'wb') as file:
                    for data in response.stream(chunk_size):
                        file.write(data)
                        size +=len(data)
                        file.flush()

                    sys.stdout.flush()
                response.release_conn()
    def run(self,nickname):
        vedio_names, video_urls, aweme_count = self.get_video_url(nickname)
        if nickname not in os.listdir():
            os.mkdir(nickname)
        print("视频下载中:\n")
        for num in range(aweme_count):
            video_url = self.get_download_url(video_url[num])
            self.video_download(video_names[num],video_url)
            
if __name__ == '__main__':
    douyin =DouYin()
    nickname = r'王同学'
    douyin.run(nickname)

浏览器老是崩溃,更多参考详情我的博客吧https://www.nigaea.com/dataanalysis/170.html

转载于:https://my.oschina.net/at5/blog/1556756

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108080.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微信公众平台开发入门教程[2020版]

    微信公众平台开发入门教程[2020版]在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序、MySQL数据库、计算机网络通讯、及HTTP/XML/CSS/JS等基础。我们将使用微信公众账号方倍工作室作为讲解的例子,二维码见左侧。本系列教程将引导你完成如下任务:创建新浪云计算平台应用 启用微信公众平台开发模式 体验常用接收消息及发送消息类型 了解数据收发原理及消息格式第一章申请服务器资源创建新浪云计算应用申请账号我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+MySQL数据库作为程.

    2022年6月6日
    257
  • keil中debug的使用_keil 多线程

    keil中debug的使用_keil 多线程在点这个之前要先烧写一次程序,不然这一次修改后的程序没有烧进单片机里然后在debug模式下点运行,然后再点停止如果代码有问题就会停在有问题的地方不断循环多试几次如果都停在同一个地方就是那里的代码有问题…

    2022年10月15日
    2
  • linux ftp命令大全,linux ftp命令详解[通俗易懂]

    linux ftp命令大全,linux ftp命令详解[通俗易懂]1.连接ftp服务器格式:ftp[hostname|ip-address]a)在linux命令行下输入:ftp192.168.1.1b)服务器询问你用户名和密码,分别输入用户名和相应密码,待认证通过即可。c)也可以先输入ftpftp>d)然后在输入要连接的IPftp>open192.168.1.12.下载文件下载文件通常用get和mget这两条命令。a)get格式:get…

    2022年9月21日
    2
  • Spring+Quartz实现定时任务的配置方法[通俗易懂]

    Spring+Quartz实现定时任务的配置方法[通俗易懂]<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.spring

    2022年5月24日
    35
  • Java回顾之序列化

    Java回顾之序列化

    2021年8月23日
    53
  • 用或启用Windows自动更新命令行

    用或启用Windows自动更新命令行

    2022年3月2日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号