文章目录
前言
Q1:在手机上发现一个不错的短视频,正准备下载保存,却发现下载不了。
Q2:发现一部不错的具有意义的视频,想拿来做班会题材、会议题材,下载下来却有水印。
我们经常会遇到这些问题,如何解决呢?
全部代码已经上传到 我的gitee库 可自行下载使用
ps:本文章仅供学习 !涉及版权问题 本文章url全部有更改 注意识别 自行更改实验
一、实现步骤
1 网页地址的提取
在视频的分享功能中,有复制链接的按钮可以直接获得网页的分享链接(含有网页地址)。根据对多个分享链接发现,分享链接的格式都是 文字+网址,那么需要先提取网址。可以通过正则表达式提取所需要的网页。如下代码就可以提取到我们需要的网页。
import re
# 涉及版权问题 url全部有更改注意识别
url='3.56 LwF:/ 复制打,看看【xxxx的作品】我这么可爱你不要 要什么?要饭嘛? https://v.douxxx.com/6DNbVfA/'
url = re.search("(?P<url>https?://[^\s]+)", url).group("url")
2 网页重定向解决
提取网址后,输入浏览器发现网址的变化,比如提取网址是:https://v.douxxx.com/6DNbVfA/,
输入浏览器,浏览器加载完毕后却是:https://www.douxxx.com/video/7143157011818073380,
这是因为网页重定向了。geturl()返回检索的资源的URL,通常用于确定是否遵循重定向。
import urllib.request
a = urllib.request.urlopen(url)
red = a.geturl()
3.网站的分析思路
网页加载完毕过后,f12打开开发者工具,因为需要视频的地址链接,所以使用下图工具点击视频的板块对视频元素进行查找。
找到视频元素的位置,发现有网络链接点击一个进去后发现正是我们需要的视频。
点击网络按钮进入抓包界面后,Ctrl+r刷新页面或者点击网站的刷新按钮,就可以开始抓包,如下图71431570的文件就是网页内容文件。
点击进入文档,点击响应,响应下的内容就是网页内容,查看网页内容,发现与刚刚我们打开网页元素里面的内容相差很大,因为动态加载的原因。仅仅用requests爬取网页内容的话就是响应下展示的内容,而不是在元素界面看到的内容,所以需要查找内容。
在元素我们找到了视频的url,我们先通过url在响应内容里寻找一下。响应界面Ctrl+f 输入元素里找到的网页地址发现并没有,如果完整的url找不到,那就去寻找关键片段,只输入//后面的部分内容(如v26-web.douyinvod.com),发现找到几个相关内容,进行对比发现有src前缀的十分像我们寻找的地址。
为什么找不到需要的视频地址,这是因为抖音把地址进行url编码了,复制src后面的内容直到到下一个src前,在网站搜索url解码,粘贴刚刚复制的解码,就发现视频地址出来了。复制地址浏览器输入,正是我们需要的地址。
4.代码实现
import requests # 数据请求库第三方库
import re # 正则模块
# 已经重定向的地址
headers = {
'cookie': '',
'user-agent': ''
}
# 已经重定向的地址
response = requests.get(url=url, headers=headers)
# 获取网页源代码
# print(response.text)
# 正则表达式获得视频信息
href=re.findall('playAddr%22%3A%5B%7B%22src%22%3A%22(.*?)%22%7D%2C%7B%22src%22%3A%22%2F%2Fv3-web', response.text)[0]
# print(href)
# url解码
video_url = requests.utils.unquote(href)
video_url = 'https:' + video_url
# 获取视频的二进制数据
video_content = requests.get(url=video_url, headers=headers).content
# 保存数据
with open('video\\' + title + '.mp4', mode='wb') as f:
f.write(video_content)
print("视频已经下载好了!!!")
header中的cookie和user-agent通过如下图标头内容获得,伪造请求头让网页识别你为用户而不是爬虫。re.findall()便利字符串内容找到符合匹配的内容,返回是一个列表。findall()里面的正则表达式可以理解为:特征点+(.*?)+特征点,其中(.*?)是我们需要的内容。
二、全部代码
import re
import urllib.request
import requests
initial_url = input("请输入复制链接:")
url = re.search("(?P<url>https?://[^\s]+)", initial_url).group("url")
url= urllib.request.urlopen(url)
red_url = url.geturl()
# 伪装请求头方式/请求头参数
headers = {
'cookie': 'your cookie',
'user-agent': 'your user-agent'
}
response = requests.get(url=red_url, headers=headers)
# 获取网页源代码
# print(response.text)
# 解析数据
# 获得标题
title = re.findall('<title data-react-helmet="true">(.*?)</title>', response.text, re.S)[0]
title = title.replace(' ', '_')
title = title.replace('\n', '_')
# print(title)
# 获得视频信息
href = re.findall('playAddr%22%3A%5B%7B%22src%22%3A%22(.*?)%22%7D%2C%7B%22src%22%3A%22%2F%2Fv3-web', response.text)[0]
# print(href)
video_url = requests.utils.unquote(href)
video_url = 'https:' + video_url
# 获取视频的二进制数据
video_content = requests.get(url=video_url, headers=headers).content
# 保存数据
with open('video\\' + title + '.mp4', mode='wb') as f:
f.write(video_content)
print("视频已经下载好了!!!")
总结
从本文看,爬虫的代码并不困难、难理解,爬虫重要的是如何从网页的众多数据中获得我们需要的有用信息。
(都看到这里了,如果觉得有用就留下你的赞吧)