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

网络爬虫

浏览数:206

2019-8-26

先看下成果:


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即可。

作者:安和然