forked from Jack-Cherish/python-spider
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdouyin.py
More file actions
125 lines (116 loc) · 4.23 KB
/
Copy pathdouyin.py
File metadata and controls
125 lines (116 loc) · 4.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
from contextlib import closing
import requests, json, time, re, os, sys, types
class DouYin(object):
def __init__(self):
"""
抖音App视频下载
"""
#SSL认证
try:
import urllib3.contrib.pyopenssl
urllib3.contrib.pyopenssl.inject_into_urllib3()
except ImportError:
pass
def get_video_urls(self, nickname):
"""
获得视频播放地址
Parameters:
nickname:查询的用户名
Returns:
video_names: 视频名字列表
video_urls: 视频链接列表
aweme_count: 视频数量
"""
video_names = []
video_urls = []
search_url = 'http://api.amemv.com/aweme/v1/discover/search/?cursor=0&keyword=%s&count=10&type=1&retry_type=no_retry&iid=15777917428&device_id=34692364858&ac=wifi&channel=xiaomi&aid=1128&app_name=aweme&version_code=157&version_name=1.5.7&device_platform=android&ssmix=a&device_type=MI+5&device_brand=Xiaomi&os_api=24&os_version=7.0&uuid=861945034132187&openudid=dc451556fc0eeadb&manifest_version_code=157&resolution=1080*1920&dpi=480&update_version_code=1572&ts=%d&app_type=normal' % (nickname, int(time.time()))
req = requests.get(url = search_url)
html = json.loads(req.text)
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']
# print('粉丝数:',each['user_info']['follower_count'])
user_url = 'http://api.amemv.com/aweme/v1/aweme/post/?user_id=%s&max_cursor=0&count=%s&retry_type=no_retry&iid=15777917428&device_id=34692364858&ac=wifi&channel=xiaomi&aid=1128&app_name=aweme&version_code=157&version_name=1.5.7&device_platform=android&ssmix=a&device_type=MI+5&device_brand=Xiaomi&os_api=24&os_version=7.0&uuid=861945034132187&openudid=dc451556fc0eeadb&manifest_version_code=157&resolution=1080*1920&dpi=480&update_version_code=1572&ts=%d&app_type=normal' % (user_id, aweme_count, int(time.time()))
req = requests.get(url = user_url)
html = json.loads(req.text)
for each in html['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_urls.append(each['share_info']['share_url'])
return video_names, video_urls, aweme_count
def get_download_url(self, video_url):
"""
获得视频播放地址
Parameters:
video_url:视频播放地址
Returns:
download_url: 视频下载地址
"""
req = requests.get(url = video_url)
bf = BeautifulSoup(req.text, 'lxml')
script = bf.find_all('script')[-1]
video_url_js = re.findall('var data = \[(.+)\];', str(script))[0]
video_html = json.loads(video_url_js)
download_url = video_html['video']['play_addr']['url_list'][0]
return download_url
def video_downloader(self, video_url, video_name):
"""
视频下载
Parameters:
None
Returns:
None
"""
size = 0
with closing(requests.get(video_url, stream=True)) as response:
chunk_size = 1024
content_size = int(response.headers['content-length'])
if response.status_code == 200:
print(' [文件大小]:%0.2f MB' % (content_size / chunk_size / 1024))
with open(video_name, "wb") as file:
for data in response.iter_content(chunk_size = chunk_size):
file.write(data)
size += len(data)
file.flush()
sys.stdout.write(' [下载进度]:%.2f%%' % float(size / content_size * 100))
sys.stdout.flush()
def run(self, nickname):
"""
运行函数
Parameters:
None
Returns:
None
"""
self.hello()
video_names, video_urls, aweme_count = self.get_video_urls(nickname)
if nickname not in os.listdir():
os.mkdir(nickname)
print('视频下载中:\n')
for num in range(aweme_count):
print(' ' + video_names[num])
video_url = self.get_download_url(video_urls[num])
self.video_downloader(video_url, os.path.join(nickname.strip(), video_names[num]))
print('')
def hello(self):
"""
打印欢迎界面
Parameters:
None
Returns:
None
"""
print('*' * 100)
print('\t\t\t\t抖音App视频下载小助手')
print('*' * 100)
if __name__ == '__main__':
douyin = DouYin()
nickname = r'徐浪浪and芒果琳'
douyin.run(nickname)