Scrapy 爬取图片方法二

Scrapy 爬取图片方法二,本章采用系统方法爬取图片,前一章节的方法虽然能爬取下来图片,但是图片的名字是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

看到运行结果如图所示,恭喜你,图像爬取成功!
Scrapy 爬取图片方法二

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程