报错日志如下:
2017-07-12 21:26:48 [scrapy.pipelines.files] WARNING: File (code: 403): Error downloading file from <GET http://t10.baidu.com/it/u=1495155540,1076493806&fm=55&s=BF904F831EEF3E8C6781B5210300E0F1&w=121&h=81&img.JPEG> referred in <None>
2017-07-12 21:26:48 [scrapy.core.scraper] WARNING: Dropped: Item contains no images
红色部分,是自己写的代码
def item_completed(self, results, item, info):
if item.__class__.__name__ != 'NewsImagesItem':
return item
image_path = [x['path'] for ok,x in results if ok]
if not image_path:
raise DropItem('Item contains no images')
imagePipiline 配置都没有错误,日志里显示图片已经开始下载
图片地址也没有错误,部分图片是可以下载下来的
另外:图片地址在浏览器里多次尝试也会出现403 Forbidden 错误
应该是网站的防爬策略,怎么解决呢
这个问题解决了,分析浏览器请求,发现header里面都是设置了referer的,在pipeline 里request的时间,加上header.referer即可。
HTTPReferer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTPReferer中统计出每天有多少用户点击我主页上的链接访问他的网站。
代码如下:
#自定义imagepipeline
classNewsImagesPipeline(ImagesPipeline):
defget_media_requests(self,item,info):
ifitem.__class__.__name__!='NewsImagesItem':
return
forimage_urlinitem['image_urls']:
yieldRequest(url=image_url,headers={'Referer':item['header_referer']})
defitem_completed(self,results,item,info):
ifitem.__class__.__name__!='NewsImagesItem':
returnitem
image_path=[x['path']forok,xinresultsifok]
ifnotimage_path:
raiseDropItem('Itemcontainsnoimages')
item['image_paths']=image_path
returnitem
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。