开发者社区> 问答> 正文

scrapy 下载百度新闻图片错误?报错

报错日志如下:

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 错误

应该是网站的防爬策略,怎么解决呢

 

展开
收起
爱吃鱼的程序员 2020-06-08 12:36:09 721 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    这个问题解决了,分析浏览器请求,发现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

     

    2020-06-08 12:36:22
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
AIOps-百度的思考与实践 立即下载
百度外卖从IDC到云端服务迁移历程 立即下载
百度研发工具集的应用实践——打造持续交付路上的“三堵墙” 立即下载