Scrapy 爬取图片方法二,本章采用系统方法爬取图片,前一章节的方法虽然能爬取下来图片,但是图片的名字是scrapy 根据某些规则(哈希) 为我们命名的,但是我们想用图片原本的名字进行命名时,这种方法就明显不行了, 这时就需要另外一种办法来解决。
下面将以站长素材网为例,爬取图标,并根据名字保存下来。

编辑 Spider
前面已经介绍了如何创建scapy的方法,这里不再赘述,还是和前一章节,使用xpath提取我们想要的数据。
创建爬虫项目
scrapy startproject chinaz
创建爬虫
scrapy genspider tubiao sc.chinaz.com
通过xpath提取数据,这里我们需要两个数据,一个是标题,一个是每一个图片的链接地址
import scrapy
from ..items import ChinazItem
class TubiaoSpider(scrapy.Spider):
    name = 'tubiao'
    allowed_domains = ['sc.chinaz.com']
    start_urls = ['http://sc.chinaz.com/tubiao/']
    def parse(self, response):
        href_list = response.xpath('//div[@class="text_left"]//li/span/a/@href').extract()
        for href in href_list:
            yield scrapy.Request(url=href, callback=self.get_info)
    def get_info(self, response):
        div_list = response.xpath('//div[@class="all_wrap"]//div[@class="left"]')
        for div in div_list:
            title = div.xpath('.//div[2]/h2/a/text()').extract_first('')
            src_list = div.xpath('.//div[@class="png_pic"]/img/@src').extract()
            for src in src_list:
                item = ChinazItem()
                item['title'] = title
                item['src'] = [src]
                yield item
配置settings
在settings.py里进行设置,大致在67行前后的位置
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
#    'chinaz.pipelines.ChinazPipeline': 300,
     'chinaz.pipelines.ChinazPipeline': 1,
}
IMAGES_STORE = 'images'
编辑 pipelines
关于下载的函数, 我们进入到pipelines.py 文件进行修改(也可以全部重写),但是函数的名字是固定的。
import scrapy
from scrapy.pipelines.images import ImagesPipeline
class ChinazPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        yield scrapy.Request(url=item['src'][0],meta={'item':item})
    def file_path(self, request, response=None, info=None):
        item = request.meta['item']
        # 设置图片的路径为  类型名称/url地址
        # 这是一个图片的url: http://pics.sc.chinaz.com/Files/pic/icons128/7065/z1.png
        # 这句代码的意思是先取出图片的url,[0]表示从列表转成字符串
        # split分割再取最后一个值,这样写是让图片名字看起来更好看一点
        image_name = item['src'][0].split('/')[-1]
        path = item['title'] + image_name
        return path
查看运行结果
命令行执行指令运行爬虫
crapy crawl tubiao
看到运行结果如图所示,恭喜你,图像爬取成功!

极客教程