爬虫2.4-scrapy框架-图片分类下载

目录

  • scrapy框架-图片下载

    • 1 传统下载方法:
    • 2 scrapy框架的下载方法
    • 3 分类下载完整代码

scrapy框架-图片下载

python小知识:

map函数:将一个可迭代对象的每个值,依次交给一个函数处理,返回一个生成器。

urls = uibox.xpath(".//ul/li/a/img/@src").getall()
urls = list(map(lambda url: ‘https:‘+url, urls))

urls本身是一个列表,使用map函数,将urls中的每一项传递给url ,并让url执行‘https:’+url的操作。 lambda则是一个无名函数,方便一行内写完函数。最后用list函数将map返回的生成器转成列表

1 传统下载方法:

pipelines.py
def process_item(self, item, spider):
    category = item[‘category‘]  # 一个字符串
    urls = item[‘urls‘]  # 一个列表
    local_path = os.path.abspath(‘.‘) # 获取绝对路经
    os.mkdir(r‘{}\images\{}‘.format(local_path, category)) #分类创建images/category文件夹
    for url in urls:
        filename = url.split(‘_‘)[-1]  # 获取图片名
        request.urlretrieve(url, ‘{}\images\{}\{}‘.format(local_path, category, filename))  # 将图片下载到/images/category/filename

缺点是非异步,图片是一张一张按顺序下载的,数量较大时效率低

2 scrapy框架的下载方法

scrapy.pipelines中提供了两个下载文件的子类

一个是scrapy.pipelines.files 中的FilesPipeline,另一个是scrapy.pipelines.images 中的ImagesPipeline

其中ImagesPipeline专门用于下载图片,是继承自FilesPipeline

ImagesPipeline使用方法

1)在items.py中定义好image_urls和images,image_urls是用来存储需要下载的图片的url,需要给一个列表,images中需要保存图片的属性,如下载路径、url、图片的校验码等

2)当图片下载完成后,会把文件下载的相关信息存储到item中的images属性中。

3)在配置文件settings.py中配置IMAGES_STROE,这个配置是用来设置图片下载路径的

4)启动pipeline,在ITEM_PIPELINES中注释原来的pepeline设置‘scrapy.pipelines.images.ImagesPipeline‘:1

FilesPipeline使用方法类似

定义好file_urls和file,设置好FILES_STORE,以及ITEM_PIPELINES中的scrapy.pipelines.files.FilesPipeline:1

2.1 将图片全部下载到full文件夹下

本来高高兴兴来到实验室,2分钟就把需要整的步骤整完了,如何折腾了一个小时都没想通为什么爬虫无法执行parse()函数,各种百度,最后对比之前写的爬虫发现,我睡了午觉起来迷迷糊糊将start_urls 改成了start_image_urls 这样的话scrapy框架一检查,没有开始点啊,那直接就结束了。。。。

1)修改setttings.py 注释掉原来的ITEM_PIPELINES中的内容,添加‘scrapy.pipelines.images.ImagesPipeline‘: 1

并添加图片存储路径IMAGES_STORE = os.path.join(os.path.abspath(‘.‘), ‘images‘)

~ settings.py
ITEM_PIPELINES = {
   # ‘bmw.pipelines.BmwPipeline‘: 300,
 ‘scrapy.pipelines.images.ImagesPipeline‘: 1
}
IMAGES_STORE = os.path.join(os.path.abspath(‘.‘), ‘images‘)  # 爬虫项目根目录/images

2)修改items.py 添加或修改 image_urls和images

image_urls = scrapy.Field()
images = scrapy.Field()

3)修改[spider.py] yield image_urls

item = BmwItem(category=category, image_urls=image_urls)  # 重点在于image_urls
yield item

执行,得到结果:./images/full 目录下下载了一堆没有分类的图片

这个时候就想怎么讲图片分类下载好,比如车身图片(实验代码以汽车之家宝马5x图片进行下载)就在/images/车身,内部图片在/images/内部,这样强迫症才舒服

2.2 将图片分类到不同目录

这里就需要重写scrapy.pipelines.images.ImagesPipeline里面的一些方法了。

这里需要注意:parse()函数中yield 抛出的数据格式为 category: ‘xxx’ image_urls: [‘url‘, ‘url‘....] images: ‘‘

所以在之后操作时,每次抛出的image_urls 都对应着同一个category

1)继承ImagesPipeline,并改写一些返回值

from bmw import settings  # bmw是项目名
import os  # 2)中需要用到
class BMWImagesPipeline(ImagesPipeline):  # 新定义一个子类,继承ImagesPipeline
    def get_media_requests(self, item, info):
        request_objs = super(BMWImagesPipeline, self).get_media_requests(item, info)
        for request_obj in request_objs:
            request_obj.item = item  # 为每个request_obj对象添加item属性,里面包含了category
        return request_objs  # 父类中必须返回这个列表,给其他函数使用

get_media_requests函数原本返回的是[Request(x) for x in item.get(self.images_urls_field, [])],即返回了一个Request(url)的列表,这里改造一下,使用super重复父类中的方法,得到一个返回值,并添加了item属性,方便下一步使用。

2)重写file_path()方法

def file_path(self, request, response=None, info=None):
    # path获取父类中file_path方法返回的值即‘full/hash.jpg‘ hash是图片的哈希值
    path = super(BMWImagesPipeline, self).file_path(request, response, info)
    #request即前一个函数返回的列表中的每一项,所以有item属性
    category = request.item.get(‘category‘)
    images_store = settings.IMAGES_STORE  # IMAGES_STORE是需要下载到的路径,例如c:/images
    category_path = os.path.join(images_store, category) # 创建每个种类的路径并判断是否已存在
    if not os.path.exists(category_path):
        os.mkdir(category_path)
    image_name = path.replace(‘full/‘, ‘‘)  # 去掉原本的‘full/‘ 只留下文件名
    image_path = os.path.join(category_path, image_name)
    # 图片完整的路径和文件名c:/images/aaa/js451v88225F45sd42f4y4.jpg
    return image_path

3)修改settings.py中的配置

ITEM_PIPELINES = {
   # ‘bmw.pipelines.BmwPipeline‘: 300, 注释掉原有的pipeline
    ‘bmw.pipelines.BMWImagesPipeline‘: 1
}
IMAGES_STORE = os.path.join(os.path.abspath(‘.‘), ‘images‘)  # 添加图片保存地址

完工,重写之后每个图片的路径就包含了自己的种类,下载完成后目录格式如下:

images
   车头
       41312r322r2234.jpg
       1425flj5l2.jpg
   车身
   。。

3 分类下载完整代码

项目名:bmw 爬虫名:bmw5x

bmw5x.py

import scrapy
from bmw.items import BmwItem

class Bmw5xSpider(scrapy.Spider):
    name = ‘bmw5x‘
    allowed_domains = [‘car.autohome.com.cn‘]
    start_urls = [‘https://car.autohome.com.cn/pic/series/65.html#pvareaid=2042209‘]

    def parse(self, response):
        uiboxs = response.xpath("//div[@class=‘uibox‘]")[1:]
        for uibox in uiboxs:
            category = uibox.xpath("./div/a/text()").get()
            image_urls = uibox.xpath(".//ul/li/a/img/@src").getall()
            image_urls = list(map(lambda url: ‘https:‘+url, image_urls))
            item = BmwItem(category=category, image_urls=image_urls)
            yield item

items.py

import scrapy
class BmwItem(scrapy.Item):
    category = scrapy.Field()
    image_urls = scrapy.Field()
    images = scrapy.Field()

pipelines.py

import os
from scrapy.pipelines.images import ImagesPipeline
from bmw import settings

class BMWImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        request_objs = super(BMWImagesPipeline, self).get_media_requests(item, info)
        for request_obj in request_objs:
            request_obj.item = item
        return request_objs

    def file_path(self, request, response=None, info=None):
        path = super(BMWImagesPipeline, self).file_path(request, response, info)
        category = request.item.get(‘category‘)
        images_store = settings.IMAGES_STORE
        category_path = os.path.join(images_store, category)
        if not os.path.exists(category_path):
            os.mkdir(category_path)
        image_name = path.replace(‘full/‘, ‘‘)
        image_path = os.path.join(category_path, image_name)
        return image_path

settings.py

import os
ROBOTSTXT_OBEY = False
DEFAULT_REQUEST_HEADERS = {
  ‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘,
  ‘Accept-Language‘: ‘en‘,
  ‘User-Agent‘: ‘xxx‘,
  ‘Referer‘: ‘xxx‘,
  ‘Cookie‘: ‘xxx‘
}
ITEM_PIPELINES = {
    ‘bmw.pipelines.BMWImagesPipeline‘: 1
}
IMAGES_STORE = os.path.join(os.path.abspath(‘.‘), ‘images‘)

原文地址:https://www.cnblogs.com/bitterzZ/p/10202197.html

时间: 2024-10-19 05:25:57

爬虫2.4-scrapy框架-图片分类下载的相关文章

Python爬虫进阶之Scrapy框架安装配置

Python爬虫进阶之Scrapy框架安装配置 初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此整理如下. Windows 平台: 我的系统是 Win7,首先,你要有Python,我用的是2.7.7版本,Python3相仿,只是一些源文件不同. 官网文档:http://doc.scrapy.org/en/latest/intro/install.html,最权威哒,下面是我的亲身体验过程. 1

爬虫学习 10.scrapy框架简介和基础应用

爬虫学习 10.scrapy框架简介和基础应用 今日概要 scrapy框架介绍 环境安装 基础使用 今日详情 一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板.对于框架的学习,重点是要学习其框架的特性.各个功能的用法即可. 二.安装 Linux: ``pip3 install scrapy Windows: ``a. p

爬虫学习 12.scrapy框架之递归解析和post请求

爬虫学习 12.scrapy框架之递归解析和post请求 今日概要 递归爬取解析多页页面数据 scrapy核心组件工作流程 scrapy的post请求发送 今日详情 1.递归爬取解析多页页面数据 - 需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储 - 需求分析:每一个页面对应一个url,则scrapy工程需要对每一个页码对应的url依次发起请求,然后通过对应的解析方法进行作者和段子内容的解析. 实现方案: 1.将每一个页码对应的url存放到爬虫文件的起始url列表(start_

第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

第三百三十四节,web爬虫讲解2-Scrapy框架爬虫-Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻标题和rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息,那么这种一般都是 js 的 Ajax 动态请求生成的信息 我们以百度新闻为列: 1.分析网站 首先我们浏览器打开百度新闻,在网页中间部分找一条新闻信息 然后查看源码,看看在源码里是否有

python爬虫----(2. scrapy框架)

Scrapy框架,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. 刚开始学习这个框架.不太好评论.只是感觉这个框架有些Java的感觉,需要太多的其他模块的支持. (一)创建 scrapy 项目 # 使用 scrapy startproject scrapy_test ├── scrapy_test │   ├── scrapy.cfg │   └── scrapy_test │

python爬虫----(6. scrapy框架,抓取亚马逊数据)

利用xpath()分析抓取数据还是比较简单的,只是网址的跳转和递归等比较麻烦.耽误了好久,还是豆瓣好呀,URL那么的规范.唉,亚马逊URL乱七八糟的.... 可能对url理解还不够. amazon ├── amazon │   ├── __init__.py │   ├── __init__.pyc │   ├── items.py │   ├── items.pyc │   ├── msic │   │   ├── __init__.py │   │   └── pad_urls.py │  

python爬虫----(4. scrapy框架,官方文档以及例子)

官方文档: http://doc.scrapy.org/en/latest/ github例子: https://github.com/search?utf8=%E2%9C%93&q=scrapy 剩下的待会再整理...... 买饭去......       --2014年08月20日19:29:20 python爬虫----(4. scrapy框架,官方文档以及例子)

python爬虫----(5. scrapy框架,综合应用及其他)

在分析和处理选择内容时,还需注意页面的JS可能会修改DOM树结构. (一)GitHub的使用 由于之前使用Win,没使用过shell的.目前只是了解.以后再补充.找到几个不错的教程 GitHub超详细图文攻略 http://blog.csdn.net/vipzjyno1/article/details/22098621 Github修改提交 http://www.360doc.com/content/12/0602/16/2660674_215429880.shtml 以后再补充!!!!! (二

第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies

第三百三十三节,web爬虫讲解2-Scrapy框架爬虫-Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于start_urls,start_requests()返回的请求会替代start_urls里的请求 Request()get请求,可以设置,url.cookie.回调函数 FormRequest.from_response()表单post提交,第一个必须参数,上一次响应cookie的response对象,其