Python批量下载抖音高清无水印小视频
开发环境:
Python 3.6
Pycharm
浏览器驱动 >>> 和浏览器(谷歌或者火狐) 版本最相近的一个(下载驱动之后和你代码放到同一个文件里面就可以使用)
模块使用:
- requests >>> pip install requests
- selenium >>> pip install selenium
- re
- os
想要学习Python的可以点这里,每晚8点都有免费Python案例的讲解,还有老师在线一对一的解答
本篇文章流程(爬虫基本思路):
一. 数据来源分析
-
确定需求 (我们要爬的内容是什么?)
抖音视频内容 -
通过开发者工具进行抓包分析
I. (F12/鼠标右键点击检查可以打开) 选择network 选择 media 找播放地址
II. 找播放地址来源 >>>
二. 代码实现过程
-
发送请求 对于视频详情页发送请求
-
获取数据 获取网页源代码数据
-
解析数据 提取视频播放地址 以及视频标题
-
下载保存
爬取一个视频
安装所需模块
import requests # 数据请求 第三方模块 pip install requests import re # 正则表达式模块 import os # 文件操作模块 import time # 时间模块 from selenium import webdriver # pip install selenium
发送请求
url = 'https://www.douyin.com/video/6942071509448002846' # headers 请求头 伪装作用 # user-agent: 浏览器的基本信息 headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36' } response = requests.get(url=li_url, headers=headers)
解析数据 通过 re 正则表达式
# 正则表达式匹配出来的内容是列表 # 贪婪模式[我全都要] 非贪婪模式(?) title = re.findall('<title data-react-helmet="true"> (.*?)</title>', response.text, re.S) new_title = change_title(title) # 返回是列表 是没问题的吧 [1] 索引取值 第一个元素索引位置是0 第二个元素索引位置 1 html_data = re.findall('src(.*?)vr%3D%2', response.text)
进行解码
video_url = requests.utils.unquote(html_data)
保存数据
with open(filename + new_title + '.mp4', mode='w') as f: f.write(video_content) # 写入内容 print(title)
创建文件夹
filename = 'video\\' # 文件名字 if not os.path.exists(filename): # 判断如果没有这个文件夹的话 os.mkdir(filename) # 创建这个文件
批量爬取
实例化一个浏览器的对象
driver = webdriver.Chrome() # 访问url地址网址 driver.get('https://www.douyin.com/user/MS4wLjABAAAAY8bNCoKh6fT_I2ZRaCkVB4pcVPIeoC0a9jOWWPUKvJw') # 延时三秒 time.sleep(3) # 下滑操作 drop_down()
模拟滑动操作
def drop_down(): """执行页面滚动的操作""" # javascript for x in range(1, 30, 4): # 在你不断的下拉过程中, 页面高度也会变的 time.sleep(1) j = x / 9 # document.documentElement.scrollTop 指定滚动条的位置 # document.documentElement.scrollHeight 获取浏览器页面的最大高度 js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j driver.execute_script(js)
返回的列表 里面元素是对象
lis = driver.find_elements_by_css_selector('div._927ae3b0dd790b5b62eae61c7d2fa0bc-scss > div:nth-child(2) > ul li') for li in lis: # 调用 find_element_by_css_selector() 方法 li_url = li.find_element_by_css_selector('a').get_attribute('href') driver.quit()
替换特殊字符
def change_title(title): pattern = re.compile(r"[\/\\\:\*\?\"\<\>\|\n]") # '/ \ : * ? " < > |' new_title = re.sub(pattern, "_", title) # 替换为下划线 return new_title