admin管理员组文章数量:1606556
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 1.任务描述
- 2.相关知识
- items.py
- pipelines.py
- settings.py
- xpath匹配
- 代码编写过程
- 3.编程要求
- 4.测试说明
- 5.笔者答案
- 通过截图
- 总结
前言
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 **********#
通过截图
总结
- 爬取网站实训图片并下载
版权声明:本文标题:2. 爬取网站实训图片并下载 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728500341a1161099.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论