干货教程:Python采集X音用户作品+调用Aria2下载+fire生成命令行+Vue界面

优采云 发布时间: 2022-10-21 02:25

  干货教程:Python采集X音用户作品+调用Aria2下载+fire生成命令行+Vue界面

  X音采集开源存储库

  介绍

  蟒蛇获取数据 + Vue 编写接口 + Aria2 下载

  根据

  X音各种链接或ID,采集视频通过Web界面工作并将作品下载到本地计算机。

  支持用户主页链接或sec_uid/主题挑战和音乐配乐链接或ID。

  支持下载喜欢列表(如果喜欢列表可见)。

  (1)超过2000本Python电子书(主流和经典书籍应该可用)。

  (2)蟒蛇标准库信息(中文版最完整)。

  (3)项目源代码(四五十个有趣和经典的实践项目和源代码)。

  (4)关于Python基础介绍,爬虫,Web开发和大数据分析(适合白色学习)的视频。

  (5)蟒蛇学习路径(告别不守规矩的学习)。

  当然在学习Python的道路上肯定会困难,没有好的学习资料,怎么去学习呢?

学习Python中有不明白推荐加入交流Q群号:928946953

群里有志同道合的小伙伴,互帮互助, 群里有不错的视频学习教程和PDF!

还有大牛解答!

  使用0x00安装依赖项

  在程序目录中打开命令行,然后输入

   复制代码 隐藏代码

pip install -r requirements.txt

  0x01 使用 UI 界面

  双击打开启动.bat,或打开程序目录中的命令行并输入

   复制代码 隐藏代码

python ui.py

  0x02 直接修改 douyin.py 中的相关参数

  根本不了解Python的朋友使用命令行或操作界面。

  0x03 从命令行使用 exec.py 查看命令列表,或使用 -h 参数查看帮助复制代码背后的代码

  pythonexec.py pythonexec.py -h pythonexec.py 下载 -h pythonexec.py download_batch -h 使用函数名调用程序以复制代码隐藏代码

  --type 指定下载类型,默认值:--类型=用户 --

  limit 指定采集数,默认值:--limit=0(无限制) 例如采集用户的所有作品:复制代码 隐藏代码

  pythonexec.py 下载 python exec.py 下载用户的 secuid 例如采集用户喜欢的前 10 个作品:复制代码 隐藏代码

  pythonexec.py 下载 MS4wJJABAAAAl7TJWJJJRNU11IlllB6Mi5V9VbAsQo1N987guPjctc8--类型=类似 --limit=10pythonexec.py下载用户的安全,例如采集音乐配乐的前10个作品:复制代码 隐藏代码

  蟒蛇 exec.py 下载 --类型=音乐 --限制=

  10 蟒蛇 exec.py 下载音乐 ID --类型=音乐 --limit=10TODO 知识点 X 声音相关 Aria2 相关蟒蛇相关命令行模块火灾相关 UI 模块 pywebview 相关 X 声音 采集部分源代码

   复制代码 隐藏代码

# -*- encoding: utf-8 -*-

'''

@File : douyin.py

@Time : 2021年03月12日 18:16:57 星期五

@Author : erma0

@Version : 1.0

@Link : https://erma0.cn

@Desc : X音用户作品采集

'''

import json

import os

import time

from urllib.parse import parse_qs, urlparse

import requests

from download import Download

class Douyin(object):

"""

X音用户类

采集作品列表

"""

def __init__(self, param: str, limit: int = 0):

"""

初始化用户信息

参数自动判断:ID/URL

"""

self.limit = limit

self.http = requests.Session()

self.url = ''

self.type = 'unknow'

self.download_path = '暂未定义目录'

# ↑ 预定义属性,避免调用时未定义 ↑

self.param = param.strip()

self.sign = 'TG2uvBAbGAHzG19a.rniF0xtrq' # sign可以固定

self.__get_type() # 判断当前任务类型:链接/ID

self.aria2 = Download() # 初始化Aria2下载服务,先不指定目录了,在设置文件名的时候再加入目录

self.has_more = True

self.finish = False

# 字典格式方便入库用id做key/取值/修改对应数据,但是表格都接收数组

self.videosL = [] #列表格式

# self.videos = {} #字典格式

self.gids = {} # gid和作品序号映射

def __get_type(self):

"""

判断当前任务类型

链接/ID

"""

if '://' in self.param: # 链接

self.__url2redirect()

else: # ID

self.id = self.param

def __url2redirect(self):

"""

取302跳转地址

短连接转长链接

"""

headers = { # 以前作品需要解析去水印,要用到移动端UA,现在不用了

'User-Agent':

'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/89.0.4389.82'

}

try:

r = self.http.head(self.param, headers=headers, allow_redirects=False)

self.url = r.headers['Location']

except:

self.url = self.param

def __url2id(self):

try:

self.id = urlparse(self.url).path.split('/')[3]

except:

self.id = ''

<p>

def __url2uid(self):

try:

query = urlparse(self.url).query

self.id = parse_qs(query)['sec_uid'][0]

except:

self.id = ''

def get_sign(self):

"""

网页sign算法,现在不需要了,直接固定

"""

self.sign = 'TG2uvBAbGAHzG19a.rniF0xtrq'

return self.sign

def get_user_info(self):

"""

取用户信息

查询结果在 self.user_info

"""

if self.url:

self.__url2uid()

url = 'https://www.iesdouyin.com/web/api/v2/user/info/?sec_uid=' + self.id

try:

res = self.http.get(url).json()

info = res.get('user_info', dict())

except:

info = dict()

self.user_info = info

# 下载路径

username = '{}_{}_{}'.format(self.user_info.get('short_id', '0'),

self.user_info.get('nickname', '无昵称'), self.type)

self.download_path = Download.title2path(username) # 需提前处理非法字符串

def get_challenge_info(self):

"""

取话题挑战信息

查询结果在 self.challenge_info

"""

if self.url:

self.__url2id()

url = 'https://www.iesdouyin.com/web/api/v2/challenge/info/?ch_id=' + self.id

try:

res = self.http.get(url).json()

info = res.get('ch_info', dict())

except:

info = dict()

self.challenge_info = info

# 话题挑战下载路径

username = '{}_{}_{}'.format(self.challenge_info.get('cid', '0'),

self.challenge_info.get('cha_name', '无标题'), self.type)

self.download_path = Download.title2path(username) # 需提前处理非法字符串

def get_music_info(self):

"""

取音乐原声信息

查询结果在 self.music_info

"""

if self.url:

self.__url2id()

url = 'https://www.iesdouyin.com/web/api/v2/music/info/?music_id=' + self.id

try:

res = self.http.get(url).json()

info = res.get('music_info', dict())

except:

info = dict()

self.music_info = info

# 音乐原声下载路径

username = '{}_{}_{}'.format(self.music_info.get('mid', '0'), self.music_info.get('title', '无标题'),

self.type)

self.download_path = Download.title2path(username) # 需提前处理非法字符串

def crawling_users_post(self):

"""

采集用户作品

"""

self.type = 'post'

self.__crawling_user()

def crawling_users_like(self):

"""

采集用户喜欢

"""

self.type = 'like'

self.__crawling_user()

def crawling_challenge(self):

"""

采集话题挑战

"""

self.type = 'challenge'

self.get_challenge_info() # 取当前信息,用做下载目录

# https://www.iesdouyin.com/web/api/v2/challenge/aweme/?ch_id=1570693184929793&count=9&cursor=9&aid=1128&screen_limit=3&download_click_limit=0&_signature=AXN-GQAAYUTpqVxkCT6GHQFzfg

url = 'https://www.iesdouyin.com/web/api/v2/challenge/aweme/'

cursor = '0'

while self.has_more:

params = {

"ch_id": self.id,

"count": "21", # 可调大 初始值:9

"cursor": cursor,

"aid": "1128",

"screen_limit": "3",

"download_click_limit": "0",

"_signature": self.sign

}

try:

res = self.http.get(url, params=params).json()

cursor = res['cursor']

self.has_more = res['has_more']

self.__append_videos(res)

except:

  

print('话题挑战采集出错')

print('话题挑战采集完成')

def crawling_music(self):

"""

采集音乐原声

"""

self.type = 'music'

self.get_music_info() # 取当前信息,用做下载目录

# https://www.iesdouyin.com/web/api/v2/music/list/aweme/?music_id=6928362875564067592&count=9&cursor=18&aid=1128&screen_limit=3&download_click_limit=0&_signature=5ULmIQAAhRYNmMRcpDm2COVC5j

url = 'https://www.iesdouyin.com/web/api/v2/music/list/aweme/'

cursor = '0'

while self.has_more:

params = {

"music_id": self.id,

"count": "21", # 可调大 初始值:9

"cursor": cursor,

"aid": "1128",

"screen_limit": "3",

"download_click_limit": "0",

"_signature": self.sign

}

try:

res = self.http.get(url, params=params).json()

cursor = res['cursor']

self.has_more = res['has_more']

self.__append_videos(res)

except:

print('音乐原声采集出错')

print('音乐原声采集完成')

def __crawling_user(self):

"""

采集用户作品/喜欢

"""

self.get_user_info() # 取当前用户信息,昵称用做下载目录

max_cursor = 0

# https://www.iesdouyin.com/web/api/v2/aweme/like/?sec_uid=MS4wLjABAAAAaJO9L9M0scJ_njvXncvoFQj3ilCKW1qQkNGyDc2_5CQ&count=21&max_cursor=0&aid=1128&_signature=2QoRnQAAuXcx0DPg2DVICdkKEY&dytk=

# https://www.iesdouyin.com/web/api/v2/aweme/post/?sec_uid=MS4wLjABAAAAaJO9L9M0scJ_njvXncvoFQj3ilCKW1qQkNGyDc2_5CQ&count=21&max_cursor=0&aid=1128&_signature=DrXeeAAAbwPmb.wFM3e63w613m&dytk=

url = 'https://www.iesdouyin.com/web/api/v2/aweme/{}/'.format(self.type)

while self.has_more:

params = {

"sec_uid": self.id,

"count": "21",

"max_cursor": max_cursor,

"aid": "1128",

"_signature": self.sign,

"dytk": ""

}

try:

res = self.http.get(url, params=params).json()

max_cursor = res['max_cursor']

self.has_more = res['has_more']

self.__append_videos(res)

except:

print('作品采集出错')

print('作品采集完成')

def __append_videos(self, res):

"""

数据入库

"""

if res.get('aweme_list'):

for item in res['aweme_list']:

info = item['statistics']

info.pop('forward_count')

info.pop('play_count')

info['desc'] = Download.title2path(item['desc']) # 需提前处理非法字符串

info['uri'] = item['video']['play_addr']['uri']

info['play_addr'] = item['video']['play_addr']['url_list'][0]

info['dynamic_cover'] = item['video']['dynamic_cover']['url_list'][0]

info['status'] = 0 # 下载进度状态;等待下载:0,下载中:0.xx;下载完成:1

# 列表格式

self.videosL.append(info)

# 字典格式

# self.videos[info['aweme_id']] = info

# 此处可以直接添加下载任务,不过考虑到下载占用网速,影响采集过程,所以采集完再下载

if self.limit:

more = len(self.videos) - self.limit

if more >= 0:

# 如果给出了限制采集数目,超出的删除后直接返回

self.has_more = False

# 列表格式

self.videosL = self.videosL[:self.limit]

# 字典格式

# for i in range(more):

# self.videos.popitem()

# return

else: # 还有作品的情况下没返回数据则进入这里

print('未采集完成,但返回作品列表为空')

def download_all(self):

"""

作品抓取完成后,统一添加下载任务

可选择在外部注册回调函数,*敏*感*词*下载任务状态

"""

for id, video in enumerate(self.videosL):

# for id, video in self.videos.items():

gid = self.aria2.download(url=video['play_addr'],

filename='{}/{}_{}.mp4'.format(self.download_path, video['aweme_id'],

video['desc'])

# ,options={'gid': id} # 指定gid

)

self.gids[gid] = id # 因为传入gid必须16位,所以就不指定gid了,另存一个字典映射

print('下载任务投递完成')</p>

  教程:优采云·万能文章采集器v2.16.0.0破解版下载

  优采云 通用文章采集器v2.16.0.0破解版

  优采云通用文章采集器v2.16.0.0破解版,是站长必备的工具之一,强烈建议使用,方便采集和整理数据。

  优采云 通用文章采集器 v2.16.2.0.zip

  

  优采云通用文章采集器是一个简单易用的文章采集工具软件。优采云 通用文章采集器 v2.16.2.0 更新日志 采集列表页 URL 函数添加了高级参数(两个值之间用空格分隔,如果值 1 为空,则自动使用值 2)。 优采云 全能文章采集器的截图

  优采云 通用文章采集器v2.17.7.0破解版

  优采云通用文章采集器特点: 1.依托优采云软件独有的通用体识别智能算法,任何网页正文的自动提取准确率均可达到95%以上。其次,只需输入关键词,您就可以采集百度新闻和网页,搜狗新闻和网页,360度新闻和网页,Google新闻...

  优采云万能文章采集器V2.18.3.0(破解版)。

  

  优采云通用文章采集器 V2.18.3.0(破解版),这是网站管理员必备采集工具。

  优采云·爱站数据采集器v3.8.0.0破解版

  优采云·爱站数据采集器v3.8.0.0破解版,是站长必备的工具之一,强烈建议使用,方便采集和整理数据。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线