2. 爬取网站实训图片并下载

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

Scrapy爬虫之网站图片爬取
2. 爬取网站实训图片并下载


提示:以下是本篇文章正文内容,下面案例可供参考

1.任务描述

本关任务:上一关爬取的是图片链接,本关需要更进一步,将图片下载下来并保存到根目录下的images文件夹中(不存在需新建),并且根据提取的信息对图片进行命名。

2.相关知识

为了完成本关任务,你需要掌握:Scrapy框架的组成。

第一关我们只接触了Scrapy框架的冰山一角,现在我们要开始学习它的整体架构。

下图中文件都是通过命令scrapy startproject 项目文件名scrapy genspider 爬虫文件名自动生成的爬虫框架文件。生成命令第一关有详细介绍。
在这里插入图片描述
对于middlewares.py中间件文件我们暂时用不到,在此不予介绍。/ImgProject/ImgProject/spiders目录下的imgspier.py文件是我们的爬虫主程序,它的生成与使用我们在第一关有接触,重点介绍下面三个文件。

  • items.py;
  • pipelines.py;
  • settings.py。

items.py

设置数据存储模板,用于结构化数据。即:用来存储你从网页中xpath下来的数据。格式如下:

class ImgprojectItem(scrapy.Item):
    img_urls = scrapy.Field() #保存图片链接
    images = scrapy.Field()   #保存图片名字

pipelines.py

数据处理行为。即:设置item里数据的存储方式。

示例如下:

class ImgprojectPipeline(object):
    def process_item(self, item, spider):
        dir_path ='{}'.format(settings.IMAGES_STORE)  #文件夹路径:从配置文件settings中导入定义好的路径
        if not os.path.exists(dir_path):
            os.makedirs(dir_path)
        name = item['images']
        img_url = item['img_urls']
        img_path = dir_path +'/'+ name +'.jpg'  #图片的最终存储路径
        img = requests.get(img_url,headers=settings.DEFAULT_REQUEST_HEADERS)  #对图片的url发出请求,准备下载
        with open(img_path,'wb')as file:  #使用wb方式保存图片
            file.write(img.content)

settings.py

配置文件,如:递归的层数、并发数,延迟下载等。

  • ITEM_PIPELINES里设置了pipelines文件中类的运行顺序,后面跟的数值范围是0-1000,数字越小越优先。此处只有一个类,后面的数字便不做要求,在0-1000的范围内便可。
  • IMAGES_STORE设置了图片存放位置,在根目录的/images文件夹下。
  • DOWNLOAD_DELAY设置了爬虫下载延迟的时间,防止爬取太快被网站拒绝访问。
ITEM_PIPELINES = {
    'ImgProject.pipelines.ImgprojectPipeline': 300,
}
IMAGES_STORE='/images'
DOWNLOAD_DELAY = 0.3

xpath匹配

在我们的爬虫里,用了xpath来提取html里的标签和内容,在这里我将用例子说明xpath的用法。
首先,我们要分析网页源代码,找出我们要获取的数据的位置,如下图红框部分便是图片的部分url链接,我们的任务就是把它提取出来。
在这里插入图片描述
通过观察我们发现,它是class="box"的div下的a标签下的img的src属性的值,我们要得到它,写法如下:

img_srcs = response.xpath('//div[@class='box']/div/a/img/@src').extract()

其中//代表相对路径,[@class="box"]指明了div的class名(选取div时要选有代表性的,能定位到你需要的数据),我们便可以在网页的源码中定位到所有网页图片相似的位置,通过@我们可以获取src属性的值,.extract()返回含有网页图片链接信息的数组。

代码编写过程

  • 首先在settings.py中设置下载通道,下载路径以及下载参数(默认给出settings.py文件,你只需要完成下面的几个过程);
  • 在items.py设置需要用到的数据,将图片的完整链接放入image_urls字段,名字放入images字段;
  • 在主爬虫程序imgspier.py中,因为会用到item存放数据,所以要在开头引入items.py文件中的ImgprojectItem类,from ImgProject.items import ImgprojectItem,被引入的类用之前要实例化一下item = ImgprojectItem()

xpath抓取到需要的数据,通过yield返回item,传递到pipeline.py文件中处理这些从网页获取的数据。提取数字作为图片的名称,如下图所示。
在这里插入图片描述

 def parse(self, response):
       img_srcs = response.xpath('//div[@class='box']/div/a/img/@src').extract()  #匹配到图片的部分链接
       for img_src in img_srcs:  #for循环遍历列表
             name = img_src.split('/')[-1].split('.')[0]    #提取图片名字
           item = ImgprojectItem()  #实例化类
           item['img_urls'] = "http://127.0.0.1" + img_src  #把图片链接拼贴完整放到img_urls中
           item['images'] = name  #把图片名字放到images中
           yield item  #把得到的item返回到pipelines.py中
  • 因为在pipelines.py中用到了settings里的设置,所以在开头需要导入它from ImgProject import
    settings。还涉及到了文件的读写操作,所以还要导入import os模块。根据你所需要的模块在文件开头进行导入,不然会报错;
  • 以上四个文件完成后,便可运行爬虫。

3.编程要求

首先,通过审查元素,观察图片链接的代码规律;然后,点击代码文件旁边的三角符号,如下图所示,分别选择items.py、pipelines.py和主爬虫imgspier.py三个文件,补充 Begin-End 区间的代码,最终能成功将网站的图片下载到images文件夹,并且将图片命名为对应的数字。

4.测试说明

代码完成后点击测评,当评测出现 Django 启动失败时,重新评测即可。爬虫运行完成后,会在根目录下生成images文件夹,在本平台进入命令行,找到相应目录:cd /images,通过命令ls,可以查看images文件夹的内容,如下图所示。
在这里插入图片描述

预期输出:

爬取成功

5.笔者答案

imgspier.py

#-*- coding: utf-8 -*-
import scrapy
from ImgProject.items import ImgprojectItem

class ImgspierSpider(scrapy.Spider):
   name = 'imgspier'
   allowed_domains = ['127.0.0.1']
   start_urls = ['http://127.0.0.1:8080/imgs/']

   def parse(self, response):
       #********** Begin **********#
       img_srcs = response.xpath('//div/a/img/@src').extract()
       # img_srcs = response.xpath('//div[@class='box']/div/a/img/@src').extract()
       for img_src in img_srcs:  #for循环遍历列表
           name=img_src.split('/')[-1].split('.')[0]    #提取图片名字
           item=ImgprojectItem()  #实例化类
           item['img_urls']="http://127.0.0.1:8080"+img_src  #把图片链接拼贴完整放到img_urls中
           #127.0.0.1后加:8080
           item['images']=name  #把图片名字放到images中
           yield item  #把得到的item返回到pipelines.py中
       #********** End **********#

items.py

import scrapy

class ImgprojectItem(scrapy.Item):
   #********** Begin **********#
   img_urls=scrapy.Field() #保存图片链接   
   images=scrapy.Field()  #保存图片名字      
   #********** End **********#

pipelines.py

import os,requests
from ImgProject import settings

class ImgprojectPipeline(object):
   def process_item(self, item, spider):
       #********** Begin **********#
       dir_path='{}'.format(settings.IMAGES_STORE)  #文件夹路径:从配置文件settings中导入定义好的路径
       if not os.path.exists(dir_path):
           os.makedirs(dir_path)
       name=item['images']
       img_url=item['img_urls']
       img_path=dir_path+'/'+name+'.jpg'  #图片的最终存储路径
       img=requests.get(img_url,headers=settings.DEFAULT_REQUEST_HEADERS)  #对图片的url发出请求,准备下载
       with open(img_path,'wb') as f:  #使用wb方式保存图片
           f.write(img.content)
       #********** End **********#

通过截图

在这里插入图片描述

在这里插入图片描述

总结

  1. 爬取网站实训图片并下载
  • 21
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值