吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6664|回复: 19
收起左侧

[Python 原创] 【原创】爬取抖音gif表情包

[复制链接]
沧浪之水濯我心 发表于 2022-2-11 23:08
本帖最后由 沧浪之水濯我心 于 2022-2-12 00:12 编辑

某日,我刷到一个表情包视频,下载方法是抖音搜索“渣渣表情包”,输入某id,获取表情包。
我点进去一看,下载表情包还要看广告视频,这我能忍?
直接thor抓包

过程不表,直接说结论:
1.该功能(类似小程序),每个表情包作者都有一个编号,通过搜索编号可以浏览该表情包作者的所有gif
2.通过抓包可以直接获得gif地址
ps:该功能还提供了通过搜索图片标题来获取表情包。

代码思路:
1.我直接循环作者编号(0-999),当然我没测出来该功能所有的作者编号范围
2.从page 0 到 page i获取所有表情包,直到到头没有了
3.(通过表情包标题搜索我也写了个函数,大家可以自行调用以实现)

代码如下:
土豪链接(自行修改后缀为py): 获取抖音表情包.txt (4.27 KB, 下载次数: 75)

[Python] 纯文本查看 复制代码
import urllib.request
import requests
import json
import os
from requests.packages.urllib3.exceptions import InsecureRequestWarning
import socket
#设置超时时间为30s
socket.setdefaulttimeout(30)
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

#请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 aweme_19.4.0 JsSdk/2.0 NetType/4G Channel/App Store ByteLocale/zh Region/CN AppTheme/light BytedanceWebview/d8a21c6 Aweme/19.4.0 Mobile ToutiaoMicroApp/2.40.0.1',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Referer': 'https://tmaservice.developer.toutiao.com/?appid=ttca16bcab552fe68201&version=2.0.0',
    'Connection': 'keep-alive',
    'Host': 'zaza.guojiangdong.com.cn',
}

#通过标题搜索
# def SearchByTitle():
#     keyword = input("请输入表情包标题:\n")
#     data = {
#         'do': 'sousuo',
#         'keyword': keyword,
#         'page': '1',
#         'i': '2',
#         'c': 'entry',
#         'a': 'toutiaoapp',
#         'v': '1.0.0',
#         'm': 'mm_qu'
#     }
#     search_result = requests.post('https://zaza.guojiangdong.com.cn/app/index.php', headers=headers, data=data)
#     js = json.loads(search_result.text)


#通过id搜索,我直接遍历所有,你也可以改一下获取指定作者的表情包
def SearchById():
    # upid = input("请输入表情包up主编号:\n")
    for upid in range(0, 999):
        i = 0
        while i != -1:
            data = {
                'do': 'upimage',
                'upid': upid,
                'tid': '0',
                'page': i,
                'i': '2',
                'c': 'entry',
                'a': 'toutiaoapp',
                'v': '1.0.0',
                'm': 'mm_qu'
            }
            search_result = requests.post('https://zaza.guojiangdong.com.cn/app/index.php', headers=headers, data=data)
            js = json.loads(search_result.text)
            
            #实测第一页和其他页返回的json结构不一样
            try:
                listimg = js[0]['listimg']
            except:
                listimg = js

            try:
                i += 1
                GetGifById(upid, listimg)
            except:
                #报错就说明到底了
                i = -1

#获取gif地址
def GetGifById(upid, js):
    i = 0
    #这句代码是用来判断js是否为空的,不然为空不报错
    code=js[i]['img']
    for name in js:
        img = js[i]['img']
        name = js[i]['name']
        if "https" in img:
            url = img
        else:
            url = "https://zhage1.yayashijue.com/" + img

        GifDownload(upid, name, url)
        i += 1

#获取桌面文件夹
def get_desk_p():
    return os.path.join(os.path.expanduser('~'), "Desktop")

# 在桌面创建表情包文件夹,根据作者编号创建子文件夹,然后下载至该文件夹
def GifDownload(upid, name, url):
    desktop = get_desk_p() + "\\" + "表情包"
    folder_name = str(upid)
    filepath = os.path.join(desktop, folder_name)
    if not os.path.isdir(filepath):
        os.makedirs(filepath)
    img_name = name + ".gif"
    filename = filepath + "\\" + img_name

    try:
        urllib.request.urlretrieve(url, filename)
    except socket.timeout:
        count = 1
        while count <= 2:
            try:
                urllib.request.urlretrieve(url, filename)
                break
            except socket.timeout:
                count += 1
        if count > 2:
            print("downloading this gif fialed!")


if __name__ == "__main__":
    SearchById()


前文提到了还可以通过搜索表情包标题来获取表情包,我写了一个快捷指令,使用本快捷指令会在你的图库创建名为“表情包”的相簿,可以根据标题下载表情包到“表情包”相簿。(限IOS用户)
快捷指令链接:

快捷指令.txt (65 Bytes, 下载次数: 45)

最后放几张爬到的图片






免费评分

参与人数 4吾爱币 +4 热心值 +3 收起 理由
赵安之 + 1 热心回复!
李佑辰 + 1 + 1 用心讨论,共获提升!
yueyunlong + 1 + 1 用心讨论,共获提升!
crazy_hb + 1 + 1 能不能来个。。。那个。。黑丝大长腿的。。。

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 沧浪之水濯我心 发表于 2022-2-12 00:09
又测试了一下,发现urllib.request.urlretrieve偶尔会等待时间过长
解决方法:
import socket
#设置超时时间为30s
socket.setdefaulttimeout(30)

然后将urllib.request.urlretrieve(url, filename)替换为如下代码:


[Python] 纯文本查看 复制代码
    try:
        urllib.request.urlretrieve(url, filename)
    except socket.timeout:
        count = 1
        while count <= 2:
            try:
                urllib.request.urlretrieve(url, filename)
                break
            except socket.timeout:
                count += 1
        if count > 2:
            print("downloading this gif fialed!")
Libra_c 发表于 2022-2-11 23:15
诅咒者之魂 发表于 2022-2-12 01:06
pzm102 发表于 2022-2-12 03:38
感谢分享
richardzxq 发表于 2022-2-12 05:37
谢谢分享!
龍謹 发表于 2022-2-12 07:16
谢谢楼主分享思路,其实偶想扒微信的。
CCQc 发表于 2022-2-12 07:38
感谢分享
李佑辰 发表于 2022-2-12 09:24
不错,不错,学习到了
xia4166 发表于 2022-2-12 09:30
感谢分享!!!下载试试
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 06:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表