首页 > 其他分享 >Scrapy 中间件

Scrapy 中间件

时间:2024-03-07 14:47:58浏览次数:12  
标签:配置文件 title url self 中间件 scrapy item Scrapy

1. 爬取图片

  • 使用 ImagePipeLines 需要安装 Pillow

  • 环境安装:pip install Pillow

爬虫文件:

import scrapy

from ..items import DeepimgproItem
class ImgSpider(scrapy.Spider):
    name = 'img'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['https://pic.netbian.com/4kmeinv/']
    #通用的url模板
    url_model = 'https://pic.netbian.com/4kmeinv/index_%d.html'
    page_num = 2
    def parse(self, response):
        #解析出了图片的名称和详情页的url
        li_list = response.xpath('//*[@id="main"]/div[3]/ul/li')
        for li in li_list:
            title = li.xpath('./a/b/text()').extract_first() + '.jpg'
            detail_url = 'https://pic.netbian.com'+li.xpath('./a/@href').extract_first()
            item = DeepimgproItem()
            item['title'] = title
            #需要对详情页的url发起请求,在详情页中获取图片的下载链接
            yield scrapy.Request(url=detail_url,callback=self.detail_parse,meta={'item':item})
        if self.page_num <= 2:
            new_url = format(self.url_model%self.page_num)
            self.page_num += 1
            yield scrapy.Request(url=new_url,callback=self.parse)
    #解析详情页的数据
    def detail_parse(self,response):
        meta = response.meta
        item = meta['item']
        img_src = 'https://pic.netbian.com'+response.xpath('//*[@id="img"]/img/@src').extract_first()
        item['img_src'] = img_src

        yield item

 

管道:

import scrapy
from itemadapter import ItemAdapter

from scrapy.pipelines.images import ImagesPipeline
class DeepimgproPipeline(ImagesPipeline):
    # def process_item(self, item, spider):
    #     return item
    def get_media_requests(self, item, info):
        img_src = item['img_src']
        #请求传参,将item中的图片名称传递给file_path方法
        #meta会将自身传递给file_path
        print(item['title'],'保存下载成功!')
        yield scrapy.Request(url=img_src,meta={'title':item['title']})
    def file_path(self, request, response=None, info=None, *, item=None):
        #返回图片的名称
        #接收请求传参过来的数据
        title = request.meta['title']
        return title
    def item_completed(self, results, item, info):
        return item

 

items文件:

import scrapy

class DeepimgproItem(scrapy.Item):
    # define the fields for your item here like:
    title = scrapy.Field()
    img_src = scrapy.Field()

 

配置文件:

ROBOTSTXT_OBEY = False
LOG_LEVEL = 'ERROR'
IMAGES_STORE = 'ImgLibs'
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.109 Safari/537.36'
CONCURRENT_REQUESTS = 32
ITEM_PIPELINES = {
   'deepImgPro.pipelines.DeepimgproPipeline': 300,
}

 

2. 提高scrapy的爬取效率

  • 增加并发:
    • 默认scrapy开启的并发线程为16个,可以适当进行增加。在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100。
  • 降低日志级别:
    • 在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为WORNING或者ERROR即可。在配置文件中编写:LOG_LEVEL = ‘ERROR’
  • 禁止cookie:
    • 如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:COOKIES_ENABLED = False
  • 禁止重试:
    • 对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:RETRY_ENABLED = False
  • 减少下载超时:
    • 如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:DOWNLOAD_TIMEOUT = 10 超时时间为10s

 

标签:配置文件,title,url,self,中间件,scrapy,item,Scrapy
From: https://www.cnblogs.com/smile1/p/18058828

相关文章

  • 消息中间件RabbitMQ的原理和使用
    一、什么是MQMQ是MessageQueue的简写,表示消息队列的意思,它是一种用于在应用程序之间传递消息的技术。多用于分布式系统之间进行通信,作为消息中间件使用。MQ的作用有应用解耦、异步提速、流量削峰填谷,当然也有缺点,加入MQ消息中间件会额外增加系统的外部依赖,是系统稳定性降低,同......
  • .Net Core(七) 管道和中间件
    简介管道.NETCore中的管道是一个用于处理HTTP请求的组件。它是ASP.NETCore应用程序的核心部分,负责将传入的HTTP请求传递给适当的处理程序并生成响应。管道由一系列中间件组成,每个中间件都可以对请求或响应进行操作,然后将其传递给下一个中间件或终止请求处理。中间件......
  • 数据库系列:大厂使用数据库中间件解决什么问题?
    相关文章数据库系列:MySQL慢查询分析和性能优化数据库系列:MySQL索引优化总结(综合版)数据库系列:高并发下的数据字段变更数据库系列:覆盖索引和规避回表数据库系列:数据库高可用及无损扩容数据库系列:使用高区分度索引列提升性能数据库系列:前缀索引和索引长度的取舍数据库系列:My......
  • 中间件
    代码#Defineherethemodelsforyourspidermiddleware##Seedocumentationin:#https://docs.scrapy.org/en/latest/topics/spider-middleware.htmlimportrandomfromscrapyimportsignals#usefulforhandlingdifferentitemtypeswithasingleinterfac......
  • scrapy—图片解析(图片懒加载)
    笔记-图片数据爬取之ImagesPipeline-基于scrapy爬取字符串类型的数据和爬取图片类型的数据区别?-字符串:只需要基于xpth进行解析且提交管道进行持久化存储-图片:xpath解析出图片src属性值。单独的对图片地址发起请求获取图片二进制类型的数据-Imag......
  • scrapy——分别存储在文本文件和mysql数据库中
    笔记如何将爬取到的数据一份存储到本地一份存储到数据库?-创建一个管道类-爬虫文件提交到的item指挥给管道文件中的第一个被执行的管道类接收-process_item方法中的returnitem表示将item提交给下一个管道类在pipelines类中加入MysqlPiplines类#Defineyour......
  • scrapy——基于管道持久化存储
    笔记-基于管道:-编码流程-数据解析-在item类中定义相关的属性-将解析的数据封装到item对象中-将item类型的对象提交给管道进行持久化存储-在管道类的process_item中要将其接收到的item对象中存储的数据进行持久化存储......
  • scrapy——终端持久化存储
    笔记-基于终端指令:-要求:只可以将parse方法的返回值存储到本地的文本文件中scrapycrawldou-o./douban.csv-注意:持久化存储的类型只可以是'json','jsonlines','jsonl','jl','csv','xml','marshal','pickle'这些......
  • scrapy
    scrapy框架-什么是框架-就是集成了很多功能并且具有很强通用性的一个项目模板-如何学习框架-专门学习框架封装的各种功能的详细用法-什么是scrapy-爬虫中封装好的一个明星框架。-功能:高性能的持久化存储,异步的数据下载,高性能的数据解析,分布式......
  • scrapy数据解析
    importscrapyclassDouSpider(scrapy.Spider):name="dou"#allowed_domains=["www.douban.com"]start_urls=["https://www.douban.com/doulist/113652271/"]defparse(self,response):div_=response......