【爬虫】scrapy下载图片问题

scrapy爬虫入门很简单,推荐一个入门中文网站:[http://www.scrapyd.cn/doc/],在此不再赘述

一、 爬取图片时,能够拿到图片的url,但是使用scrapy的pipelines保存图片时,遇到了错误,报警如下:

[scrapy.core.engine] DEBUG: Crawled (404) <GET https://newimg.uumtu.com/Thumb/2019/0417/d026c93782fa0a9014d13a97195902d8.jpg> (refer
er: None)

当你用图片的url直接用浏览器访问时,也会出现访问不到的情况,如下:
【爬虫】scrapy下载图片问题_第1张图片
当从爬虫的目标网站点击连接跳转到该图片时,就不会出现这样的情况。

此时,需要在请求的header里手动添加Referer

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                      '(KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
    'Referer': 'https://www.uumtu.com/weimei/41428_5.html',
}

class ImagespiderPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        yield scrapy.Request(url=item['imgurl'][0], meta={'item': item},headers=headers)

Referer的值,一般可以是你要爬取的网站的随便一个页面的url(一般不可能网站自己不认识自己的url),例如,我要保存的图片的url为https://newimg.uumtu.com/Thumb/2019/0422/c85e0cccaded41ab058f4a616ec104c4.jpg,那么我可以把Referer设置为https://www.uumtu.com/weimei/41428_5.html(该网站的一个页面)

二、Referer的作用

  • 防盗链
    假如在www.google.com里有一个www.baidu.com链接,那么点击这个www.baidu.com,它的header信息里就有:
Referer : http://www.google.com

假如www.baidu.com只允许自己的网站访问自己的图片服务器,那么www.baidu.com图片服务器每次取到Referer来判断一下是不是我自己的域名www.baidu.com,如果是就继续访问,不是就拦截。

  • 防止恶意请求
    这个就不多说了,我们爬取网站的过程,本身就是一种恶意的请求。

你可能感兴趣的:(爬虫)