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
看到运行结果如图所示,恭喜你,图像爬取成功!