scrapy下载图片遇到反盗链的设置,解决方法两种

scrapy下载图片遇到反盗链的设置,解决方法两种

原创,转载请标记

方法一,启用ImagesPipeline

说明,使用系统带的下载中间件

更改设置文件setting.py

ITEM_PIPELINES = {

'scr1.pipelines.MyImagesPipeline':300

}

安装 pillow,因为scrapy中间件使用了 pil

pip install pillow

下载图片时,发生下载不了原图,只是一些反盗链的图,

启用了ImagesPipeline,

在item中添加个image_urls = scrapy.Field()

image_paths=scrapy.Field()

在piplines.py添加

from scrapy.pipelines.images import ImagesPipeline

from scrapy.exceptions import DropItem

from scrapy.http import Request

headers = {

"User-Agent":'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like

"Referer":"xxxx.xxxx.com", #加入referer 为下载的域名网站

}

class MyImagesPipeline(ImagesPipeline):

def get_media_requests(self, item, info):

for image_url in item['image_urls']:

yield Request(image_url,headers = headers)

def item_completed(self, results, item, info):

image_paths = [x['path'] for ok, x in results if ok]

if not image_paths:

raise DropItem("Item contains no images")

item['image_paths'] = image_paths

return item


第二种:自定义函数中直接下载

我发现反盗链是由于Request中没有包含referer,所以网站返回盗链图片,当给网站提交一个referer后既可以下载(初学,是不是还有好多种防盗方法啊?)


使用 urllib2

import urllib2

在类中定义一个headers

headers = {

"Referer":"http://www.baidu.comxxx", #把我直接引用的是百度,或者是爬行的本网址就可以

}

在下载函数里就可以先初始一个Request,后用urllib2.urlopen打开这个Request对象就可以了(看了原始函数才明白这个对象)

for i in range(0,len(imgsrc)): #循环取链接

self.loger.info(u'下载%s',imgsrc[i]) #scrapy 日志记录

with open('p/%s.jpg'%imgtitle[i],'wb') as f: #创建文件对象准备写入,还可以更精简

src_req = urllib2.Request(imgsrc[i],headers = self.headers) #创建request对象

f.write(urllib2.urlopen(src_req).read()) #用Request对象返回数据作为对象写入文件


第二种方法的速度不及第一种,文件名灵活,当然了,第一种也是可以改文件名的,我为初学,遇到这个问题有百度与知乎半天,没有明确案例,就把解决方法写上,备用,真的很初级,大神们直接略过。

发布于 2017-04-10