爬虫学习日记(1)

文章目录


前言

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("视频已经下载好了!!!")

总结

  从本文看,爬虫的代码并不困难、难理解,爬虫重要的是如何从网页的众多数据中获得我们需要的有用信息。

(都看到这里了,如果觉得有用就留下你的赞吧)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LLGululu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值