美文网首页Python 运维爬虫python加油站
爬取mm29全站妹子图片(scrapy版)

爬取mm29全站妹子图片(scrapy版)

作者: 安和然 | 来源:发表于2017-12-03 13:25 被阅读154次

    先看下成果:


    3.jpg

    这是跑了三个小时下载的,还没下完,不过应该可以一直跑。太占硬盘,下载完后就删除了。

    1.jpg

    Scrapy是一个python的爬虫框架,最大的好处是简单,只要把几处代码加上即可。

    items.py

        #定义图片链接和图片名
        imgurl = scrapy.Field()
        imgname = scrapy.Field()
    

    在spider.py,编写抓取规则

    # -*- coding: utf-8 -*-
    import scrapy
    from mm29.items import  Mm29Item
    
    class Mm29picSpider(scrapy.Spider):
        name = 'mm29pic'
        allowed_domains = ['mm29.com']
        url = 'http://www.mm29.com/index/'
        index = 1
        start_urls = ['http://www.mm29.com/index/' + str(index)]
    
        def parse(self, response):
            #获取每一页的MM链接
            node_list = response.xpath("//h2/a[@target='_blank']/@href").extract()
            for node in node_list:
                #回调下载当前页MM所有照片
                yield scrapy.Request(node,callback = self.parse_page)
            for page in range(2, 908):#908为当前mm29网站所有页面数
                #解析下一页所有MM链接
                nextUrl = 'http://www.mm29.com/index/' + str(page)
                yield scrapy.Request(nextUrl, callback = self.parse)
    
        def parse_page(self,response):
            #获取图片链接和名称
            pic_src = response.xpath("//p/img/@src").extract()
            pic_name = response.xpath("//p/img/@alt").extract()
            item = Mm29Item()
            for i in range(0,len(pic_name)):
                print("get"+pic_name[i])
                item["imgname"] = pic_name[i]
                item["imgurl"] = pic_src[i]
                yield item
    

    保存图片有点稍微不一样。Scrapy提供了一个 item pipeline ,来下载属于某个特定项目的图片,比如,当你抓取产品时,也想把它们的图片下载到本地。这条管道,被称作图片管道,在 ImagesPipeline 类中实现,提供了一个方便并具有额外特性的方法,来下载并本地存储图片:

    import PIL
    import scrapy
    from scrapy.pipelines.images import ImagesPipeline
    
    class Mm29Pipeline(ImagesPipeline):#继承ImagesPipeline,是图片保存的一个类
        def get_media_requests(self, item, info):#改写这个方法 get_media_requests
            img_link = item["imgurl"]
            yield scrapy.Request(img_link)
    

    在settings.py里,要启动图片下载

    ITEM_PIPELINES = {
        'mm29.pipelines.Mm29Pipeline': 300,
    }
    

    设置下载目录:

    IMAGES_STORE = 'd:/downloadimg'
    

    我用的是pycharm,为了方便调试,增加一个main.py,在里面加一行:

    #!/usr/bin/python
    
    from scrapy.cmdline import execute
    execute("scrapy crawl mm29pic".split())
    

    运行main.py即可。

    相关文章

      网友评论

      • 知识学者:也准备学习一下爬虫,看来scrapy 比自带的好多了:grin:

      本文标题:爬取mm29全站妹子图片(scrapy版)

      本文链接:https://www.haomeiwen.com/subject/zxuabxtx.html