• scrapy图片-爬取哈利波特壁纸


    话不多说,直接开始,直接放上整个程序过程

    1、创建工程和生成spiders就不用说了,会用scrapy的都知道。

    2、items.py

    class HarryItem(scrapy.Item):
        # define the fields for your item here like:
        img_url = scrapy.Field()
        img_name = scrapy.Field()

    3、pipelines.py

        

    import os
    from  harry.settings import IMAGES_STORE as IMGS
    from scrapy.pipelines.images import ImagesPipeline
    from scrapy import Request
    class HarryPipeline(object):
        def process_item(self, item, spider):
            return item
    class HarryDownLoadPipeline(ImagesPipeline):
        def get_media_requests(self, item, info):
            for imgurl in item['img_url']:
                yield Request(imgurl)
    #以下代码为自定义图片名称的新增代码
    #    def item_completed(self, results, item, info):
    #        print ('******the results is********:',results)
    #        os.rename(IMGS + '/' + results[0][1]['path'], IMGS + '/' + item['img_name'])
    #    def __del__(self):
    #            #完成后删除full目录
    #            os.removedirs(IMGS + '/' + 'full')    

    4、settings.py

    BOT_NAME = 'harry'
    SPIDER_MODULES = ['harry.spiders']
    NEWSPIDER_MODULE = 'harry.spiders'
    ROBOTSTXT_OBEY = False
    IMAGES_URLS_FIELD = "img_url"  # 对应item里面设定的字段,取到图片的url
    IMAGES_STORE = 'E:/harrypotter'
    ITEM_PIPELINES = {
        'harry.pipelines.HarryDownLoadPipeline': 300,
    }

    5、最主要的爬虫组件hr.py

    # -*- coding: utf-8 -*-
    import scrapy
    from  harry.items import HarryItem
    from scrapy import Request
    
    class HrSpider(scrapy.Spider):
        name = 'hr'
        allowed_domains = ['www.ivsky.com']
        sts=[]
        st='http://www.ivsky.com/bizhi/harry_potter5_v3477/pic_1018'
        for x in range(6,24):
            if x<10:
                sts.append(st+'0'+str(x)+'.html')
            else:
                sts.append(st+str(x)+'.html')
        start_urls = sts
    
        def parse(self, response):
            item=HarryItem()
            urls=response.xpath('//div[@id="pic_con"]/div/img[@id="imgis"]/@src').extract()
        
    names=response.xpath('//div[@id="pic_con"]/div/img[@id="imgis"]/@src').extract()[0].split('/')[-1]

          item['img_name']=names

          print ('links is :--',' ',urls)

            item['img_url']=urls
            yield item

    6、执行爬虫

      进入到工程路径,比如我的是harry这个路径中,执行 scrapy crawl hr     #hr 是我设置的爬虫名称

    7、总结

      此次爬虫,有两方面的小收获。

       收获①这个网站的网页设置很奇怪,用google浏览器F12打开看到图片链接结构是div/div/a/img/@src,但用 这个结构去爬取,发现链接都是空的(这也就是我的spiders中故意设置一  行print ('links is :--',' ',urls)的原因了,可以看到爬取过程的log,图片链接有没有正常爬取到)。所以直接邮件查看网页源代码,发现了猫腻,以下两张图片做对比可以发现实际只有div/div/img/@src这个结构才能真正获取到图片链接。怀疑是网站的程序猿将tag搞错<img> 和</a>配对了,在“查看网页源代码”可以看到是这样。

    图片一:F12查看的结构

    图片二、右键“查看网页源代码”

       收获②

    如果有些网页是类似下面数字翻页的,而且下一页中的链接不容易提取到的,那么可以用以下将要爬取的图片页面链接全部放置在start_urls这个list中
    www.ivsky.com/bizhi/harry_potter5_v3477/pic_101808.html
    www.ivsky.com/bizhi/harry_potter5_v3477/pic_101809.html
    www.ivsky.com/bizhi/harry_potter5_v3477/pic_101811.html

    class HrSpider(scrapy.Spider):
        name = 'hr'
        allowed_domains = ['www.ivsky.com']
        sts=[]
        st='http://www.ivsky.com/bizhi/harry_potter5_v3477/pic_1018'
        for x in range(6,24):
            if x<10:
                sts.append(st+'0'+str(x)+'.html')
            else:
                sts.append(st+str(x)+'.html')
        start_urls = sts

    欢迎大家留言讨论,转载请注明出处。

  • 相关阅读:
    CSS布局设计
    Gulp自动化构建工具的简单使用
    雅虎前端优化的35条军规
    CSS预编译器less简单用法
    java 数据相除
    idea 配置文件中文显示问题
    postgresql 表触发器
    postgresql 自定义函数
    postgresql 自定义聚合函数
    CentOS 6.5 yum安装mysql5.6或其他版本【默认yum只能安装mysql 5.1】 by jason
  • 原文地址:https://www.cnblogs.com/mrtop/p/10180072.html
Copyright © 2020-2023  润新知