python爬虫Scrapy框架:媒体管道原理学习分析

作者:别呀 时间:2022-11-23 15:07:03 

一、媒体管道

1.1、媒体管道的特性

媒体管道实现了以下特性:

  • 避免重新下载最近下载的媒体

  • 指定存储位置(文件系统目录,Amazon S3 bucket,谷歌云存储bucket)

图像管道具有一些额外的图像处理功能:

  • 将所有下载的图片转换为通用格式(JPG)和模式(RGB)

  • 生成缩略图

  • 检查图像的宽度/高度,进行最小尺寸过滤

1.2、媒体管道的设置


ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 120}      启用
FILES_STORE = '/path/to/valid/dir'   文件管道存放位置
IMAGES_STORE = '/path/to/valid/dir'  图片管道存放位置
FILES_URLS_FIELD = 'field_name_for_your_files_urls'    自定义文件url字段
FILES_RESULT_FIELD = 'field_name_for_your_processed_files'   自定义结果字段
IMAGES_URLS_FIELD = 'field_name_for_your_images_urls'         自定义图片url字段
IMAGES_RESULT_FIELD = 'field_name_for_your_processed_images'      结果字段
FILES_EXPIRES = 90   文件过期时间   默认90天
IMAGES_EXPIRES = 90    图片过期时间   默认90天
IMAGES_THUMBS = {'small': (50, 50), 'big':(270, 270)}     缩略图尺寸
IMAGES_MIN_HEIGHT = 110     过滤最小高度
IMAGES_MIN_WIDTH = 110      过滤最小宽度
MEDIA_ALLOW_REDIRECTS = True    是否重定向

二、ImagesPipeline类简介


#解析settings里的配置字段
def __init__(self, store_uri, download_func=None, settings=None)
#图片下载
def image_downloaded(self, response, request, info)
#图片获取   图片大小的过滤  #缩略图的生成
def get_images(self, response, request, info)
#转化图片格式
def convert_image(self, image, size=None)
#生成媒体请求  可重写
def get_media_requests(self, item, info)
return [Request(x) for x in item.get(self.images_urls_field, [])] #得到图片url  变成请求  发给引擎
#此方法获取文件名  进行改写
def item_completed(self, results, item, info)
#文件路径
def file_path(self, request, response=None, info=None)
#缩略图的存储路径
def thumb_path(self, request, thumb_id, response=None, info=None):

三、小案例:使用图片管道爬取百度图片

(当然不使用图片管道的话也是可以爬取百度图片的,但这还需要我们去分析网页的代码,还是有点麻烦,使用图片管道就可以省去这个步骤了)

3.1、spider文件

注意:由于需要添加所有的请求头,所以我们要重写start_requests函数


import re
import scrapy
from ..items import DbimgItem
class DbSpider(scrapy.Spider):
   name = 'db'
   # allowed_domains = ['xxx.com']
   start_urls = ['https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111110&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E7%8B%97&oq=%E7%8B%97&rsp=-1']
   def start_requests(self):  #因为需要添加所有的请求头,所以我们要重写start_requests函数
       # url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111110&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E7%8B%97&oq=%E7%8B%97&rsp=-1'
       headers = {
           "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
           "Accept-Encoding": "gzip, deflate, br",
           "Accept-Language": "zh-CN,zh;q=0.9",
           "Cache-Control": "max-age=0",
           "Connection": "keep-alive",
           "Cookie": "BIDUPSID=4B61D634D704A324E3C7E274BF11F280; PSTM=1624157516; BAIDUID=4B61D634D704A324C7EA5BA47BA5886E:FG=1; __yjs_duid=1_f7116f04cddf75093b9236654a2d70931624173362209; BAIDUID_BFESS=101022AEE931E08A9B9A3BA623709CFE:FG=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; cleanHistoryStatus=0; H_PS_PSSID=34099_33969_34222_31660_34226_33848_34113_34073_33607_34107_34134_34118_26350_22159; delPer=0; PSINO=6; BA_HECTOR=24ak842ka421210koq1gdtj070r; BDRCVFR[X_XKQks0S63]=mk3SLVN4HKm; userFrom=www.baidu.com; firstShowTip=1; indexPageSugList=%5B%22%E7%8B%97%22%2C%22%E7%8C%AB%E5%92%AA%22%2C%22%E5%B0%8F%E9%80%8F%E6%98%8E%22%5D; ab_sr=1.0.1_OGYwMTZiMjg5ZTNiYmUxODIxOTgyYTllZGMyMzhjODE2ZWE5OGY4YmEyZWVjOGZhOWIxM2NlM2FhZTQxMmFjODY0OWZiNzQxMjVlMWIyODVlZWFiZjY2NTQyMTZhY2NjNTM5NDNmYTFmZjgxMTlkOGYxYTUzYTIzMzA0NDE3MGNmZDhkYTBkZmJiMmJhZmFkZDNmZTM1ZmI2MWZkNzYyYQ==",
           "Host": "image.baidu.com",
           "Referer": "https://image.baidu.com/",
           "sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
           "sec-ch-ua-mobile": "?0",
           "Sec-Fetch-Dest": "document",
           "Sec-Fetch-Mode": "navigate",
           "Sec-Fetch-Site": "same-origin",
           "Sec-Fetch-User": "?1",
           "Upgrade-Insecure-Requests": "1",
           "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36"
       }
       for url in self.start_urls:
           yield scrapy.Request(url,headers=headers,callback=self.parse,dont_filter=True)
   def parse(self, response):
       img_urls = re.findall('"thumbURL":"(.*?)"', response.text)
       # print(img_urls)
       item = DbimgItem()
       item['image_urls'] = img_urls
       yield item

3.2、items文件


import scrapy
class DbimgItem(scrapy.Item):
   # define the fields for your item here like:
   # name = scrapy.Field()
   image_urls = scrapy.Field()

3.3、settings文件


ROBOTSTXT_OBEY = False
#打开我们写的管道
ITEM_PIPELINES = {
  # 'dbimg.pipelines.DbimgPipeline': 300,
   'dbimg.pipelines.ImgPipe': 300,
}
#图片存放位置
IMAGES_STORE = 'D:/python test/爬虫/scrapy6/dbimg/imgs'

3.4、pipelines文件


import os
from itemadapter import ItemAdapter
from scrapy.pipelines.images import ImagesPipeline
import settings
"""
def item_completed(self, results, item, info):
   with suppress(KeyError):
       ItemAdapter(item)[self.images_result_field] = [x for ok, x in results if ok]
   return item
"""
class ImgPipe(ImagesPipeline):
   num=0
   #重写此函数修改获取的图片的名字  不然图片名称就是一串数字字母
   def item_completed(self, results, item, info):
       images_path = [x['path'] for ok, x in results if ok]
       #print('results: ',results)   先查看下results的数据格式,然后才能获取到我们需要的值
       for image_path in images_path:
           os.rename(settings.IMAGES_STORE + "/" + image_path, settings.IMAGES_STORE + "/" + str(self.num) + ".jpg")
           self.num += 1

结果:

python爬虫Scrapy框架:媒体管道原理学习分析

来源:https://blog.csdn.net/qq_46485161/article/details/118857291

标签:python,爬虫,Scrapy框架,媒体管道
0
投稿

猜你喜欢

  • Python迭代器iterator生成器generator使用解析

    2023-11-17 18:50:24
  • Python命令行参数定义及需要注意的地方

    2022-09-16 02:34:39
  • 在TensorFlow中屏蔽warning的方式

    2023-05-08 10:54:19
  • python实现解数独程序代码

    2021-05-16 18:39:43
  • go sync.Once实现高效单例模式详解

    2024-02-05 05:49:37
  • 解决jupyter加载文件失败的问题

    2022-07-21 19:17:05
  • Python pyinotify模块实现对文档的实时监控功能方法

    2023-04-15 08:13:52
  • asp如何向前端显示用户请求的信息?

    2010-06-09 18:52:00
  • 处理及遍历XML文档DOM元素属性及方法整理

    2024-05-13 10:39:38
  • Python win32com 操作Exce的l简单方法(必看)

    2022-12-04 10:20:36
  • Swin Transformer模块集成到YOLOv5目标检测算法中实现

    2021-09-10 21:09:49
  • PHP实现mysqli批量执行多条语句的方法示例

    2024-05-05 09:31:35
  • Python字符串格式化输出代码实例

    2021-11-09 16:44:22
  • Python字符串的全排列算法实例详解

    2023-04-30 17:01:05
  • 详解Python的Django框架中manage命令的使用与扩展

    2021-01-04 05:09:27
  • SQL Server 中导入导出数据三方法比较

    2009-01-21 14:22:00
  • SQL中varchar和nvarchar的基本介绍及其区别

    2024-01-16 22:16:53
  • python中update的基本使用方法详解

    2021-12-22 03:57:40
  • oracle 查询表名以及表的列名

    2009-07-26 09:33:00
  • Python标准库学习之psutil内存详解

    2023-09-14 21:33:35
  • asp之家 网络编程 m.aspxhome.com