【Scrapy 文件和图片】scrapy自定义的图片下载通道基本实例、构成、实例

       scrapy除了官方内置的下载通道外,还可以自定义下载通道来使用。

       其核心原理就是通过图像的自定义管道对官方管道scrapy.pipelines.images.ImagesPipeline进行覆盖。
       常常使用的三个内置的函数:file_path()、get_media_requests()、item_completed()
(1)file_path(self,request,response = None,info = None )
       每个下载的项目调用一次此方法。它返回源自指定的文件的下载路径 response。此外此方法还接收原始 request和 info。您可以重写此方法以自定义每个文件的下载路径。

       图片会以hashlib.sha1加密的方式命名保存
(2)get_media_requests(item,info )
       必须为每个图像URL返回一个请求。
(3)item_completed(results,item,info )
        ImagesPipeline.item_completed()当对单个项目的所有图像请求均已完成(下载完成或由于某些原因失败)时,将调用该方法。
默认情况下,该item_completed()方法返回该项目。

以下是官方实例:

在爬虫文件中添加:

import scrapy
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem

class MyImagesPipeline(ImagesPipeline):

    def get_media_requests(self, item, info):
        for image_url in item['image_urls']:
            yield scrapy.Request(image_url)
#一般自定义会用 get_media_requests方法中把数据传进来.
    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

在setting.py文件中添加:

ITEM_PIPELINES = {
    'myproject.pipelines.MyImagesPipeline': 300
}
IMAGES_STORE = '/path/to/valid/dir'#文件存储位置

 

借鉴网站:https://blog.csdn.net/cnmnui/article/details/99850055

自己实验成功的python实例项目

1.https://www.52pojie.cn/thread-1086937-1-1.html

学习到的内容,自定义管道,如果不想用images_url这种默认的字段下载,要在setting文件中使用IMAGES_URLS_FIELD = "字段名"。

(1)get_media_requests函数可以添加自定义的Request的请求,意味着可以添加请求头。

(2)使用item_completed函数来定义下载路径来定义文件名称。

(3)import os以及os字段来具体定义下载路径。

(4)使用shutil这个系统自定义字段来实现文件的复制和移动。

#shutil来实现文件的复制和移动
#复制文件:
shutil.copyfile("oldfile","newfile") #oldfile和newfile都只能是文件
shutil.copy("oldfile","newfile") #oldfile只能是文件夹,newfile可以是文件,也可以是目标目录
 
#复制文件夹:
shutil.copytree("olddir","newdir") #olddir和newdir都只能是目录,且newdir必须不存在
 
#重命名文件(目录)
os.rename("oldname","newname") #文件或目录都是使用这条命令
 
#移动文件(目录)
shutil.move("oldpos","newpos") 
shutil.move("D:/知乎日报/latest/一张优惠券,换你的通讯录信息,你愿意吗?.pdf", "D:/知乎日报/past/")

(5)os.path.exists()就是判断括号里的文件是否存在的意思,括号内的可以是文件路径。
         os.rename() 方法用于重命名文件或目录

2.http://goldzl.cn/thread-4606-1-1.html,重新写一下

主要是爬虫文件文友失效,因为网页内容过期了。

import scrapy
from imagedemo3.items import Imagedemo3Item

class PhotoSpider(scrapy.Spider):
    name = 'photo'
    allowed_domains = ['meishij.com']
    start_urls = ['https://www.meishij.net/chufang/diy/langcaipu/']

    def parse(self, response):
        item = Imagedemo3Item()
        image_urls = response.xpath('//div[@class="listtyle1"]/a/img/@src').extract()
        image_name = response.xpath('//div[@class="listtyle1"]/a/img/@alt').extract()
        for i in range(0, len(image_name)):
            item['image_urls'] = image_urls[i]
            item['image_name'] = image_name[i]
            yield item

学习的内容(1)怎么自定义下载图片的内容,使用pipeline管道file_path字段,来定义,在这其中可以筛选一些乱码。

首先定义存储图片名字的字段,用request提交上去。

    def get_media_requests(self, item, info):
#这里要把image_urls字段提交上去,用meta来提交
        image_url = item['image_urls']
        yield scrapy.Request(image_url,meta={'name':item['image_name']})

    def file_path(self, request, response=None, info=None):
        name = request.meta['name'] # 接收上面meta传递过来的图片名称                                       
        name = re.sub(r'[?\\*|“<>:/]', '', name) # 过滤windows字符串,不经过这么一个步骤,你会发现有乱码或无法下载
        filename= name +'.jpg' #添加图片后缀名
        return filename

3.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Scrapy 中,管道是一个异步执行的框架,用于处理爬取到的项目。管道可以被用来将爬取到的数据进行持久化存储,例如将数据保存到文件或数据库中。 要使用多条管道,你需要在 Scrapy 项目的 `settings.py` 文件中设置 `ITEM_PIPELINES` 变量。例如,如果你想要使用两条管道,你可以这样设置: ```python ITEM_PIPELINES = { 'myproject.pipelines.Pipeline1': 300, 'myproject.pipelines.Pipeline2': 400, } ``` 在这个例子中,`Pipeline1` 和 `Pipeline2` 是你自己定义的管道类,你需要在你的 Scrapy 项目中创建这些类。数字(例如 `300` 和 `400`)表示管道的优先级,数字越小优先级越高。 下面是一个使用多条管道的示例: ```python # pipelines.py class Pipeline1: def process_item(self, item, spider): # 处理 item return item class Pipeline2: def process_item(self, item, spider): # 处理 item return item # settings.py ITEM_PIPELINES = { 'myproject.pipelines.Pipeline1': 300, 'myproject.pipelines.Pipeline2': 400, } ``` 在这个例子中,当一个项目流经管道时,它会先进入 `Pipeline1`,然后再进入 `Pipeline2`。 ### 回答2: Scrapy是一个使用Python编写的开源网络爬虫框架,可以用于快速和高效地从网页中提取数据。在Scrapy中,管道(Pipeline)是用于对爬取的数据进行处理和存储的组件。下面是一个关于如何使用Scrapy的多条管道进行下载的示例。 首先,我们需要在Scrapy项目的settings.py文件中配置管道。假设我们有两个管道类,分别是Pipeline1和Pipeline2,我们将它们添加到ITEM_PIPELINES设置中并为每个管道分配一个优先级。 ``` ITEM_PIPELINES = { 'myproject.pipelines.Pipeline1': 300, 'myproject.pipelines.Pipeline2': 800, } ``` 接下来,我们需要定义这两个管道类,它们可以分别对下载的数据进行处理和存储。 Pipeline1的示例代码如下: ```python class Pipeline1(object): def process_item(self, item, spider): # 处理item # ... return item ``` Pipeline2的示例代码如下: ```python class Pipeline2(object): def process_item(self, item, spider): # 存储item # ... return item ``` 在这个示例中,我们可以看到每个管道类中都定义了一个process_item方法,用于处理接收到的item。这些方法可以进行数据清洗、格式转换、存储到数据库或者发送到其他系统等操作。 处理item的顺序将根据设置的优先级进行执行。在我们的示例中,先执行Pipeline1再执行Pipeline2。 最后,在Scrapy的Spider文件中,当爬虫返回item时,这些item将会按照设置的优先级被管道类依次处理和存储。 总结来说,Scrapy的多条管道下载示例中,我们通过配置settings.py文件和定义相应的管道类,实现对爬取到的数据进行处理和存储。这种灵活的管道机制使得我们可以根据需求自由定制数据的处理流程,提高数据处理的效率和灵活性。 ### 回答3: Scrapy是一个强大的Python网络爬虫框架,它可以在一个项目中使用多个管道同时进行数据的处理和存储。下面是一个示例程序,展示了如何使用多个管道进行多条数据的下载。 首先,在创建Scrapy项目后,需要在项目的settings.py文件中进行相应的配置。在ITEM_PIPELINES设置中,可以定义多个管道的优先级,数字越小,优先级越高。例如: ``` ITEM_PIPELINES = { 'myproject.pipelines.MyPipeline1': 300, 'myproject.pipelines.MyPipeline2': 400, } ``` 接下来,在项目中创建对应的管道类。例如,我们创建两个管道:MyPipeline1和MyPipeline2。 MyPipeline1: ``` class MyPipeline1(object): def process_item(self, item, spider): # 管道1的处理逻辑 return item ``` MyPipeline2: ``` class MyPipeline2(object): def process_item(self, item, spider): # 管道2的处理逻辑 return item ``` 在上述的process_item方法中,你可以根据自己的需求编写数据的处理逻辑,例如存储数据到数据库或者文件。 然后,在spiders目录中创建一个爬虫文件,定义自己的爬虫类,并在爬虫类中重写parse方法,通过yield关键字返回多个Item。 示例爬虫文件: ``` import scrapy from myproject.items import MyItem class MySpider(scrapy.Spider): name = 'myspider' start_urls = ['http://example.com'] def parse(self, response): # 爬虫逻辑 yield MyItem(data='data1') yield MyItem(data='data2') ``` 最后,在命令行中运行爬虫命令`scrapy crawl myspider`即可启动爬虫程序,并且数据会经过定义的多个管道进行处理。 总结来说,Scrapy通过在settings.py文件中配置并定义多个管道类,可以实现对多条数据的下载和处理。每个管道类用于对数据进行特定的处理,具体的逻辑可以根据实际需求进行自定义

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值