直接说结论:
原因:
部分网站为了防盗链(站外下载),会验证请求来源,也就是请求头信息里所带的Referer字段,对于外来访问或字段为空,则拒绝访问。
比如我练习用的豆瓣图书,会验证请求是否来源于主站。
解决:
F12查看请求标头中Referer字段值,而后和UA一样加在头信息字典里,传递给requests.get()的headers参数。
详情:
学爬虫第二天,在进行整页图片爬取时碰到的问题。
跟着学习的b站视频up提供的练习网站关闭,改爬了豆瓣图书的书本封面图。
import requests, re, time
if __name__ == '__main__':
url = 'https://book.douban.com/'
headers = {'User-Agent':''}
page_text = requests.get(url = url, headers = headers).text
#正则匹配所有封面图片
rex = '<li>.*?<div class="cover">.*?<img src="(.*?)".*?</li>'
img_src_list = re.findall(rex, page_text, re.S)
#遍历正则截取的source字串,依次get每张图片
for src in img_src_list[:5]: #方便测试只爬前5张
time.sleep(0.3)
filename = src.split('/')[-1]
with open(filename, 'wb') as f:
f.write(requests.get(url = src, headers = headers).content)
#完毕
print('Done.')
处理过报错后能够正常运行,但保存下来的图片无法打开:
站内搜了一些同样的问题,普遍提到content属性错用成text属性、指定了错误的url、后缀名有误等,检查了这些确保无误后,还是没法解决。
注意到保存下来的文件很小(仅20B),把后缀改成.txt后是这样:
显然不是我认为的“不支持此文件格式”,应该是在向豆瓣请求图片的时候出了问题,只给我响应了一串报错码。
于是尝试直接粘贴了我正则匹配出来的src字串,访问发现确实加载不出图片,F12后如下:
于是在站内搜索到了一篇访问图片出现403 Forbidden的解决办法(因为是VIP文章只看了个头,我是穷鬼),其中提到了防盗链,以及http的一个请求头字段referer。
接下来就好解决了,从站内点开图片并F12确认一下标头:
是有一个Referer对应豆瓣图书主站的,于是在headers里加上:
headers = {
'User-Agent':''
'Referer':'https://book.douban.com/' #加在这里
}
解决!୧(๑•̀◡•́๑)૭