Python爬虫 --- 2.5 Scrapy之汽车之家爬虫实践

目的

Scrapy框架为文件和图片的下载专门提供了两个Item Pipeline 它们分别是:

FilePipeline

ImagesPipeline

这里主要介绍ImagesPipeline!!

目标分析:

这次我们要爬的是 汽车之家:car.autohome.com.cn

最近喜欢吉利博越,所以看了不少这款车的资料。。。。

我们就点开博越汽车的图片网站:

https://car.autohome.com.cn/pic/series/3788.html

传统的Scrapy框架图片下载

Scrapy 框架的实施:

  1. 创建scrapy项目和爬虫:

    $ scrapy startproject Geely
    $ cd Geely
    $ scrapy genspider BoYue car.autohome.com.cn
    
  2. 编写items.py:

    import scrapy
    
    class GeelyItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        
        # 存储图片分类
        catagory = scrapy.Field()
        
        # 存储图片地址
        image_urls = scrapy.Field()
        
        # ImagesPipeline 
        images = scrapy.Field()
    
  3. 编写Spider:

    获取高清图片:

    通过分析缩略图和高清图的url,我们发现缩略图只是多了t_罢了

    缩略图地址:

    https://car3.autoimg.cn/cardfs/product/g25/M09/B0/61/t_autohomecar__wKgHIlpxMgyAWYh2AAaCZ2odx24585.jpg

    高清图地址:

    https://car3.autoimg.cn/cardfs/product/g25/M09/B0/61/autohomecar__wKgHIlpxMgyAWYh2AAaCZ2odx24585.jpg

    # -*- coding: utf-8 -*-
    import scrapy
    
    #导入CrawlSpider模块 需改写原来的def parse(self,response)方法
    from scrapy.spiders import CrawlSpider ,Rule
    
    #导入链接提取模块
    from scrapy.linkextractors import LinkExtractor 
    from Geely.items import GeelyItem
    
    class BoyueSpider(CrawlSpider):
        name = 'BoYue'
        allowed_domains = ['car.autohome.com.cn']
        start_urls = ['https://car.autohome.com.cn/pic/series/3788.html']
    
        #如需要进行页面解释则使用callback回调函数 因为有下一页,所以我们需要跟进,这里使用follow令其为True
        rules = {
            Rule(LinkExtractor(allow=r'https://car.autohome.com.cn/pic/series/3788.+'), callback= 'parse_page', follow=True),
        } 
    
        def parse_page(self, response):
            catagory = response.xpath('//div[@class = "uibox"]/div/text()').get()
            srcs = response.xpath('//div[contains(@class,"uibox-con")]/ul/li//img/@src').getall()
    
            #map(函数,参数二),将参数二中的每个都进行函数计算并返回一个列表
            srcs = list(map(lambda x:x.replace('t_',''),srcs))
            srcs = list(map(lambda x:response.urljoin(x),srcs))
            yield GeelyItem(catagory=catagory, image_urls = srcs)
    
  4. 编写PIPELINE:

    import os
    from urllib import request
    
    class GeelyPipeline(object):
    
        def __init__(self):
            #os.path.dirname()获取当前文件的路径,os.path.join()获取当前目录并拼接成新目录
            self.path = os.path.join(os.path.dirname(__file__), 'images')
    
            # 判断路径是否存在
            if not os.path.exists(self.path):  
                os.mkdir(self.path)
    
        def process_item(self, item, spider):
    
            #分类存储
            catagory = item['catagory']
            urls = item['image_urls']
    
            catagory_path = os.path.join(self.path, catagory)
    
            #如果没有该路径即创建一个
            if not os.path.exists(catagory_path): 
                os.mkdir(catagory_path)
    
            for url in urls:
                #以_进行切割并取最后一个单元
                image_name = url.split('_')[-1] 
                request.urlretrieve(url,os.path.join(catagory_path,image_name))
    
            return item
    
  5. 编写settings.py

    BOT_NAME = 'Geely'
    
    SPIDER_MODULES = ['Geely.spiders']
    NEWSPIDER_MODULE = 'Geely.spiders'
    
    # Obey robots.txt rules
    ROBOTSTXT_OBEY = False
    
    ITEM_PIPELINES = {
       'Geely.pipelines.GeelyPipeline': 1,
    }
    
  6. 让项目跑起来:

    $ scrapy crawl BoYue
    
  7. 结果展示:

使用Images_pipeline进行图片下载

使用步骤:

  1. 定义好一个item,然后定义两个属性 image_urls 和 images。 image_urls是用来存储需要下载的文件的url链接,列表类型;

  2. 当文件下载完成后,会把文件下载的相关信息存储到item的images属性中。例如:下载路径,下载url 和文件的效验码;

  3. 再配置文件settings.py中配置FILES_STORE,指定文件下载路径;

  4. 启动pipeline,在ITEM_PIPELINES中设置自定义的中间件!!!

具体步骤

在上面的基础上修改

  1. 修改settings.py

    ITEM_PIPELINES = {
       # 'Geely.pipelines.GeelyPipeline': 1,
       # 'scrapy.pipelines.images.ImagesPipeline': 1,
       'Geely.pipelines.GeelyImagesPipeline': 1,
    }
    
    #工程根目录
    project_dir = os.path.dirname(__file__)
    #下载图片存储位置
    IMAGES_STORE = os.path.join(project_dir, 'images')
    
  2. 改写pipelines,py

    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    
    import os
    from urllib import request
    
    from scrapy.pipelines.images import ImagesPipeline
    from Geely import settings
    
    # class GeelyPipeline(object):
    
    #     def __init__(self):
    #         #os.path.dirname()获取当前文件的路径,os.path.join()获取当前目录并拼接成新目录
    #         self.path = os.path.join(os.path.dirname(__file__), 'images')
    
    #         # 判断路径是否存在
    #         if not os.path.exists(self.path):  
    #             os.mkdir(self.path)
    
    #     def process_item(self, item, spider):
    
    #         #分类存储
    #         catagory = item['catagory']
    #         urls = item['image_urls']
    
    #         catagory_path = os.path.join(self.path, catagory)
    
    #         #如果没有该路径即创建一个
    #         if not os.path.exists(catagory_path): 
    #             os.mkdir(catagory_path)
    
    #         for url in urls:
    #             #以_进行切割并取最后一个单元
    #             image_name = url.split('_')[-1] 
    #             request.urlretrieve(url,os.path.join(catagory_path,image_name))
    
    #         return item
    
    # 继承ImagesPipeline
    class GeelyImagesPipeline(ImagesPipeline):
    
        # 该方法在发送下载请求前调用,本身就是发送下载请求的
        def get_media_requests(self, item, info):
    
            # super()直接调用父类对象
            request_objects = super(GeelyImagesPipeline, self).get_media_requests(item, info)
            for request_object in request_objects:
                request_object.item = item
            return request_objects
    
        def file_path(self, request, response=None, info=None):
    
            path = super(GeelyImagesPipeline, self).file_path(request, response, info)
    
            # 该方法是在图片将要被存储时调用,用于获取图片存储的路径
            catagory = request.item.get('catagory')
        
            # 拿到IMAGES_STORE
            images_stores = settings.IMAGES_STORE
            catagory_path = os.path.join(images_stores, catagory)
            
            #判断文件名是否存在,如果不存在创建文件
            if not os.path.exists(catagory_path): 
                os.mkdir(catagory_path)
    
            image_name = path.replace('full/','')
            image_path = os.path.join(catagory+'/',image_name)
            
            return image_path
    
  3. 让项目跑起来:

    $ scrapy crawl BoYue
    

将会得到与原来相同的结果!!!!

此文章同时同步到我的个人博客緣來來來 » Python爬虫 --- 2.5 Scrapy之汽车之家爬虫实践

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • scrapy学习笔记(有示例版) 我的博客 scrapy学习笔记1.使用scrapy1.1创建工程1.2创建爬虫模...
    陈思煜阅读 12,588评论 4 46
  • 学习python时,爬虫是一种简单上手的方式,应该也是一个必经阶段。本项目用Scrapy框架实现了抓取豆瓣top2...
    豌豆花下猫阅读 1,089评论 0 6
  • 1 安装Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘...
    superzhan阅读 1,394评论 0 11
  • 奇迹真的发生在了我的身上,感恩我的天使李茹,感恩我的朋友,感恩我的家人,感恩所以帮助我的人,谢谢你们!谢谢,谢谢,...
    Aries_e074阅读 308评论 0 0
  • 每个人的生命中都有一个特殊的时刻,他就是为此而生。这个特殊的机遇,如果他能够把握,将使他得以完成自己的使命—一个只...
    truth旭阅读 218评论 0 0