今天,我在做Python网络爬虫时(web spider),正在爬取哔哩哔哩的某一个视频,发现一个致命问题,就是单纯在headers中加入UA(user-Agent)是不够的,也就是说,我的爬虫没有足够的权限全访问此网站,所以,我的headers还少了一些东西。
headers = { #'Accept-Encoding':'', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36' }
我首先想到的是Referer防盗链,简单的来说,防盗链就是告诉哔哩哔哩的服务器,我是从哔哩哔哩官网跳转过来的,而不是从别的地方跳转,所以,以此来蒙掉哔哩哔哩服务器,以便获取数据。
但我,找了一圈后,却并没有找到Referer防盗链,这下可就尴尬了,到是多了一些之前从未见过的数据
例如:
-
sec-ch-ua:
"Chromium";v="21", " Not;A Brand";v="99"
-
sec-ch-ua-mobile:
?0
-
sec-ch-ua-platform:
"Windows
所以我怀疑,我的浏览器已经更新了,或者发生了其他错误,将我的Referer给弄没了,但其实,Referer还存在,只是我们看不到而已,所以,现在的问题,就成了
如何将Rederer重新显示出来
于是,我查阅了大量资料,观看了大量的CSDN的文章,总结出以下一点好用的方法:
1.在html的head标签中加入:
<meta name="Referrer" content="origin" />
那么我,问题又来了,我该怎么加?
一开始我毫无思绪,烦躁不已,但我当我冷静后,重新审视这个问题,我终于明白这其中奥妙。
那么,接下来,请跟着我的步骤走下去,慢慢的走,不要心急,慢慢揭开那神秘的面纱。
1。选择你要爬取的页面或者视频,在空白处右键,选择“查看网页源代码”(不同浏览器,这里会不一样。)
2.打开后,在鼠标右键,选择“网页另存为”,这样,我们在电脑中获得了一个以“.html”为后缀的html代码
3.更改后缀,将后缀".html"更改为“.txt”,以便我们添加<meta name="Referrer" content="origin" />
4.打开改好的文档。注意!!,一定要在<head>标签中加入<meta name="Referrer" content="origin" />,我们以下面某页面源代码为例:
<!-- saved from url=(0086)https://www.bilibili.com/video/BV1oY411p7Yr?vd_source=b305ecdc9ae3bd6e7c27b55794f9edd9 -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body><div class="line-gutter-backdrop"></div><form autocomplete="off"><label class="line-wrap-control">自动换行<input type="checkbox" aria-label="自动换行"></label></form><table><tbody><tr><td class="line-number" value="1"></td><td class="line-content"><span class="html-doctype"><!DOCTYPE html></span><span class="html-tag"><html <span class="html-attribute-name">lang</span>="<span class="html-attribute-value">zh-Hans</span>"></span><span class="html-tag"><head <span class="html-attribute-name">itemprop</span>="<span class="html-attribute-value">video</span>" <span class="html-attribute-name">itemscope</span> <span class="html-attribute-name">itemtype</span>="<span class="html-attribute-value">http://schema.org/VideoObject</span>"></span><span class="html-tag"><meta <span class="html-attribute-name">name</span>="<span class="html-attribute-value">format-detection</span>"
我们需要在head标签中加入<meta name="Referrer" content="origin" />
所以,更改为以下形式:
<!-- saved from url=(0086)https://www.bilibili.com/video/BV1oY411p7Yr?vd_source=b305ecdc9ae3bd6e7c27b55794f9edd9 -->
<html><head><meta name="Referrer" content="origin" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body><div class="line-gutter-backdrop"></div><form autocomplete="off"><label class="line-wrap-control">自动换行<input type="checkbox" aria-label="自动换行"></label></form><table><tbody><tr><td class="line-number" value="1"></td><td class="line-content"><span class="html-doctype"><!DOCTYPE html></span><span class="html-tag"><html <span class="html-attribute-name">lang</span>="<span class="html-attribute-value">zh-Hans</span>"></span><span class="html-tag"><head <span class="html-attribute-name">itemprop</span>="<span class="html-attribute-value">video</span>" <span class="html-attribute-name">itemscope</span> <span class="html-attribute-name">itemtype</span>="<span class="html-attribute-value">http://schema.org/VideoObject</span>"></span><span class="html-tag"><meta <span class="html-attribute-name">name</span>="<span class="html-attribute-value">format-detection</span>"
5.更改好后,在将文档后缀更改为html,双击运行后即可。
这样当我们在回到我们要爬取的页面时,在按F12打开开发者工具时,在找到我们的数据包,即可发现,Referer就出现了。
那么,当我加上Referer后,我的爬虫代码也就通过了,什么,你想看我爬哔哩哔哩的爬虫的代码?? 满足你!
import requests import re import json import pprint import os filename = '哔哩哔哩//' if not os.path.exists(filename): os.makedirs(filename) url = 'https://www.bilibili.com/video/BV1oY411p7Yr?vd_source=b305ecdc9ae3bd6e7c27b55794f9edd9' headers = { #'Accept-Encoding':'', 'Referer': 'https://www.bilibili.com/video/BV1oY411p7Yr?vd_source=b305ecdc9ae3bd6e7c27b55794f9edd9', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36' } response = requests.get(url=url,headers=headers).text #print(response) #数据解析: html_data = re.findall('<script>window.__playinfo__=(.*?)</script>',response)[0] #获取标题 title = re.findall('<title data-vue-meta="true">(.*?)i</title>',response)[0] #print(html_data) json_data = json.loads(html_data) #print(json_data) pprint.pprint(json_data) audio_url = json_data['data']['dash']['audio'][0]['baseUrl'] video_url = json_data['data']['dash']['video'][0]['baseUrl'] print(audio_url) print(video_url) response2 = requests.get(url=audio_url,headers=headers).content response3 = requests.get(url=video_url,headers=headers).content with open(filename+title+'.mp3',mode='wb') as f: f.write(response2) with open(filename+title+'.mp4',mode='wb') as f: f.write(response3) print("爬去完成!")
最后,如果,本文章有帮到你,那么请你送我一个免费的赞,好么QWQ(打字不易)