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

先看下成果:


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("http://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("http://p/img/@src").extract()
        pic_name = response.xpath("http://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即可。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容