Referer
一、referer是什么:
-
图片防盗链的技术应该还有其他的,目前了解到的是浏览器的referer,其实这是错误的拼写,正确是应该是referrer。不过现在可以看到Chrome的开发者工具里,还是显示的是前者,拼写不重要,重要的是理解它的含义。
-
简单来讲,referer的作用就是记录你在访问一个目标网站时,在访问前你的原网站的地址,
比如用Chrome从知乎的某个板块到另外一个,那么你在的这个网站就是原网站,按F12,选中Network选项,从页面内进入一个网站,可以从这个网站的header即头信息中,看到referer就是原来的那个网站。 -
但是!!!!!!!!从头信息中可以看到Referer-policy的字样,它的规则是:点我,查看referer-policy的详细规则。
-
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Referrer-Policy
-
一般网站的policy都是 no-referrer-when-downgrade,它的演示在上述网站里很清晰了,这里不再赘述。
-
这里要注意的是,由于Chrome默认是打开网页时,原地打开,也就是不弹出新窗口,这样才可以用F12监控referer,比如qq浏览器,打开网页是跳出,也不能看到referer的(这里也许是我自己不懂怎么看,如果可以的话,烦请评论告知。)
-
注:想要Chrome不原地打开,也就是打开新窗口的方法是win10下, ctrl+鼠标左键点击网页。
二、无referer
- 很简单,根据referer的作用可以知道,把网页地址复制到浏览器新页面的地址栏里,进行直接访问,这样的话就不会有referer,同样地,浏览器刷新也不会有referer。这里牵涉到python爬虫中防盗链的问题。
三、referer的作用
- 由于referer是请求网页中,也就是发起HTTP请求中header的一部分,所以可以用来做网页的图片防盗链!
- 比如一个网页的图,想用python下载到自己的电脑里,用urllib.request或者requests第三方库访问图片时,爬不下来。
- 这是因为python提交request申请的时候,就类似于在浏览器中的空地址栏里键入这个网页然后访问,根据上面说的,无referer,这时网站的设置比如是要求有referer,且referer的网站必须是你进来之前的网站,也就是这个图片的主页。
四、破解referer反爬虫的办法
方法很简单! 既然要求你传入图片主页面的referer,在构造header的时候,传入Referer参数(注意R要大写),它的值为与这个图片链接相关的网站,或者这个图片链接地址的原网站就可以了,听起来很生涩,下面上代码。
from fake_useragent import UserAgent
#fake_useragent的介绍见我另一篇博文
#伪装成浏览器
ua = UserAgent()
headers = {'User-Agent':ua.random} #一般网站伪装成这样也就够了,但是如果想爬图片,图片反盗链的话。如下
#其实很好理解,就是告诉你要下载的那个图片页面,我是从主页面来的,现在把数据给我。
headers = {'User-Agent':ua.random,'Referer':'这里放入图片的主页面'}
#然后在后续requests中传入header即可
案例:
import requests
# https://movie.douban.com/explore
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
'Referer': 'https://movie.douban.com/explore',
}
url = 'https://m.douban.com/rexxar/api/v2/movie/recommend?refresh=0&start=0&count=20&selected_categories=%7B%7D&uncollect=false&tags='
res = requests.get(url, headers=headers)
print(res.json())
items = res.json()['items']
for m in items:
print(m.get('title'))
五、一些说明
- 当然了,不是所有网站都有图片防盗链的,所以很多时候大可不必这么复杂,普通的图片爬取下载推荐用request 模块来做,这样代码结构简单易懂,逻辑更清晰。
- 如果遇到防盗链的图片,一般思路就是先爬到所有图片的地址.jpg —–>将它们储存在列表中 —–>遍历访问图片地址,然后用 ‘wb’的格式打开文件写入,文件名根据图片地址动态改变。
六、爬虫之UserAgent的获得方法
1.页面地址栏
- 直接在页面的地址栏里键入about:version,进去页面后,用户代理后面就是UserAgent
2.在网页界面
- 按F12——>选中Network——>此时刷新网页——>然后在Network下面的All里找到当前网页的地址——>选中Headers——>拉到下面可以看到User-Agent
3.代码获取
-
在cmd命令行里用pip安装fake_useragent,代码如下,复制到命令行里安装。
#导入模块 pip install fake_useragent #代码加载随机UA from fake_useragent import UserAgent import random fake_ua=UserAgent() # 构建UserAgent()对象 headers = {'User-Agent':fake_ua.random} #用random来随机取得用户代理。 #运行效果 print(headers) #{'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.0 Safari/530.5'} #{'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; fr-fr) AppleWebKit/525.1+ (KHTML, like Gecko) Version/3.0.4 Safari/523.10'}
4.浏览器直接搜索
- 网上的各种UA版本都有,随便粘一个。
七、实战案例:下载电影封面
-
代码
import random import time import requests # https://movie.douban.com/explore headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36', 'Referer': 'https://movie.douban.com/explore', } url = 'https://m.douban.com/rexxar/api/v2/movie/recommend?refresh=0&start=0&count=20&selected_categories=%7B%7D&uncollect=false&tags=&ck=DvZ3' res = requests.get(url, headers=headers) items = res.json()['items'] # 循环获取下载 i = 0 for m in items: title = m["title"] # 进行图片的下载 res = requests.get(m['pic']['large'], headers=headers) with open(f'./imgs/{title}.jpg', 'wb') as f: f.write(res.content) print(title, '下载完成!') # 给一个自省时间 防止给服务器造成太大的压力 避免服务器崩溃或者当前被封 time.sleep(random.randint(1, 4)) i += 1