提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Scrapy爬虫之网站图片爬取
2. 爬取网站实训图片并下载
提示:以下是本篇文章正文内容,下面案例可供参考
本关任务:上一关爬取的是图片链接,本关需要更进一步,将图片下载下来并保存到根目录下的images文件夹中(不存在需新建),并且根据提取的信息对图片进行命名。
为了完成本关任务,你需要掌握:Scrapy框架的组成。
第一关我们只接触了Scrapy框架的冰山一角,现在我们要开始学习它的整体架构。
下图中文件都是通过命令scrapy startproject 项目文件名
和scrapy genspider 爬虫文件名
自动生成的爬虫框架文件。生成命令第一关有详细介绍。
对于middlewares.py中间件文件我们暂时用不到,在此不予介绍。/ImgProject/ImgProject/spiders目录下的imgspier.py文件是我们的爬虫主程序,它的生成与使用我们在第一关有接触,重点介绍下面三个文件。
设置数据存储模板,用于结构化数据。即:用来存储你从网页中xpath下来的数据。格式如下:
class ImgprojectItem(scrapy.Item):img_urls = scrapy.Field() #保存图片链接images = scrapy.Field() #保存图片名字
数据处理行为。即:设置item里数据的存储方式。
示例如下:
class ImgprojectPipeline(object):def process_item(self, item, spider):dir_path ='{}'.format(settings.IMAGES_STORE) #文件夹路径:从配置文件settings中导入定义好的路径if not ists(dir_path):os.makedirs(dir_path)name = item['images']img_url = item['img_urls']img_path = dir_path +'/'+ name +'.jpg' #图片的最终存储路径img = (img_url,headers=settings.DEFAULT_REQUEST_HEADERS) #对图片的url发出请求,准备下载with open(img_path,'wb')as file: #使用wb方式保存图片file.t)
配置文件,如:递归的层数、并发数,延迟下载等。
ITEM_PIPELINES = {'ImgProject.pipelines.ImgprojectPipeline': 300,
}
IMAGES_STORE='/images'
DOWNLOAD_DELAY = 0.3
在我们的爬虫里,用了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()返回含有网页图片链接信息的数组。
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'] = "127.0.0.1" + img_src #把图片链接拼贴完整放到img_urls中item['images'] = name #把图片名字放到images中yield item #把得到的item返回到pipelines.py中
首先,通过审查元素,观察图片链接的代码规律;然后,点击代码文件旁边的三角符号,如下图所示,分别选择items.py、pipelines.py和主爬虫imgspier.py三个文件,补充 Begin-End 区间的代码,最终能成功将网站的图片下载到images文件夹,并且将图片命名为对应的数字。
代码完成后点击测评,当评测出现 Django 启动失败时,重新评测即可。爬虫运行完成后,会在根目录下生成images文件夹,在本平台进入命令行,找到相应目录:cd /images,通过命令ls,可以查看images文件夹的内容,如下图所示。
预期输出:
爬取成功
imgspier.py
#-*- coding: utf-8 -*-
import scrapy
from ImgProject.items import ImgprojectItemclass ImgspierSpider(scrapy.Spider):name = 'imgspier'allowed_domains = ['127.0.0.1']start_urls = ['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']="127.0.0.1:8080"+img_src #把图片链接拼贴完整放到img_urls中#127.0.0.1后加:8080item['images']=name #把图片名字放到images中yield item #把得到的item返回到pipelines.py中#********** End **********#
items.py
import scrapyclass ImgprojectItem(scrapy.Item):#********** Begin **********#img_urls=scrapy.Field() #保存图片链接 images=scrapy.Field() #保存图片名字 #********** End **********#
pipelines.py
import os,requests
from ImgProject import settingsclass ImgprojectPipeline(object):def process_item(self, item, spider):#********** Begin **********#dir_path='{}'.format(settings.IMAGES_STORE) #文件夹路径:从配置文件settings中导入定义好的路径if not ists(dir_path):os.makedirs(dir_path)name=item['images']img_url=item['img_urls']img_path=dir_path+'/'+name+'.jpg' #图片的最终存储路径img(img_url,headers=settings.DEFAULT_REQUEST_HEADERS) #对图片的url发出请求,准备下载with open(img_path,'wb') as f: #使用wb方式保存图片f.t)#********** End **********#
本文发布于:2024-02-05 07:04:34,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170726955364248.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |