先看下成果:
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即可。