先看下成果:

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

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即可。
网友评论