【Scrapy学习心得】爬虫实战三(异步下载宝马5系高清图片)

2023-12-29 20:58

本文主要是介绍【Scrapy学习心得】爬虫实战三(异步下载宝马5系高清图片),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【Scrapy学习心得】爬虫实战三(异步下载宝马5系高清图片)

声明:仅供技术交流,请勿用于非法用途,如有其它非法用途造成损失,和本博客无关

目录

  • 【Scrapy学习心得】爬虫实战三(异步下载宝马5系高清图片)
      • 一、配置环境
      • 二、准备工作
      • 三、分析网页
      • 四、爬取数据
      • 五、保存数据(同步下载图片)
      • 六、保存数据(异步下载图片)
  • 写在最后

爬取的网站:汽车之家的宝马5系所有高清图片 点击跳转

一、配置环境

  • python3.7
  • pycharm
  • Scrapy1.7.3
  • win10
  • pymysql

二、准备工作

  • cmd命令行中进入需要创建项目的目录运行scrapy startproject hehe
  • 创建成功后继续执行cd hehe
  • 然后执行scrapy genspider bmw car.autohome.com.cn
  • 最后在spider文件夹下可以看到刚创建的bmw.py爬虫文件

三、分析网页


不难发现,宝马5系的那些车身外观啊、中控方向盘啊等等分类都在这个uiboxdiv标签中,除了全景看车那个,我这都把各个分类中每张图片对应的高清url地址都要拿到,我先把每个分类的url地址给拿到,

然后再通过翻页拿到全部图片的高清图片地址,就可以轻松拿到所有宝马5系的高清图片了,完美!

先放上爬取的部分高清图片

所以总共我要爬取的内容有:

  • 分类的名称以及其具体的url地址
  • 所有高清图片

查找元素的那些操作我就不放上来了,因为没什么难度的,会来学scrapy框架的同学肯定是跟我一样那些什么requests啊,urllib啊,selenium啊等等都是用腻了才来的,是吧

四、爬取数据

下面先定义item.py文件:

import scrapyclass HeheItem(scrapy.Item):title = scrapy.Field() #分类名称url = scrapy.Field()   #分类的具体地址gq_url = scrapy.Field()  #高清图片的地址image_urls = scrapy.Field()   #真正要去请求的获取高清图片的地址

下面直接放上bmw.py的代码:

# -*- coding: utf-8 -*-
import scrapy
from copy import deepcopy
from hehe.items import HeheItemclass BmwSpider(scrapy.Spider):name = 'bmw'allowed_domains = ['car.autohome.com.cn']start_urls = ['https://car.autohome.com.cn/pic/series/65.html#pvareaid=3454438']def parse(self, response):uibox_list=response.xpath('//div[@class="uibox"]')[1:]  #去掉全景观车for uibox in uibox_list:item=HeheItem()item['title']=uibox.xpath('./div[@class="uibox-title"]/a/text()').get()item['url'] = uibox.xpath('./div[@class="uibox-title"]/a/@href').get()item['url']=response.urljoin(item['url'])#下面去请求进入到分类的地址当中yield scrapy.Request(item['url'],callback=self.parse_list,meta={'item':deepcopy(item)})def parse_list(self,response):item=response.meta['item']li_list=response.xpath('//div[@class="uibox-con carpic-list03 border-b-solid"]/ul/li')for li in li_list:item['gq_url']=response.urljoin(li.xpath('./a/@href').get())#下面去请求进入高清图片的地址当中yield scrapy.Request(item['gq_url'],callback=self.parse_gq,meta={'item':deepcopy(item)})#下面进行翻页的操作next_page=response.xpath('//a[@class="page-item-next"]/@href').get()if next_page != 'javascript:void(0);':  #当有下一页的时候才去翻页next_page=response.urljoin(next_page)yield scrapy.Request(next_page,callback=self.parse_list,  #翻页操作时的callback函数是自己meta={'item':item})def parse_gq(self,response):item=response.meta['item']item['image_urls']=response.xpath('//img[@id="img"]/@src').getall()item['image_urls']=[response.urljoin(item['image_urls'][0])]  #需要把它改成一个列表,不然后面用urlretrieve会报错yield item

五、保存数据(同步下载图片)

这里先用传统的保存图片的方法来保存,修改pipeline.py文件如下:

# -*- coding: utf-8 -*-
import os
from urllib.request import urlretrieve  #用来下载图片class HehePipeline(object):def __init__(self):   #下面是创建保存图片的文件夹imagesself.path=os.path.join(os.path.dirname(os.path.dirname(__file__)),'images')if not os.path.exists(self.path):os.mkdir(self.path)def process_item(self, item, spider):if spider.name == 'bmw':cate=item['title']url=item['image_urls']cate_path=os.path.join(self.path,cate)#按分类来保存图片if not os.path.exists(cate_path):os.mkdir(cate_path)name=url.split('__')[-1] #取url后面部分来作为图片的名称urlretrieve(url, os.path.join(cate_path, name))

现在我们的爬虫大致已经是写完了,不过我还要修改一下setting.py文件的一些设置,需要增加的语句有:

LOG_LEVEL='WARNING' #设置日志输出级别
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'  #设置请求头
ROBOTSTXT_OBEY = False  #把这个设置成False,就不会去请求网页的robots.txt,因为不改为False的话,scrapy就会去访问该网站的robots.txt协议,如果网站没有这个协议,那么它就不会去访问该网站,就会跳过,进而爬不到数据
ITEM_PIPELINES = {'hehe.pipelines.HehePipeline': 300,
}

最后在cmd中先进入到这个项目的根目录下,即有scrapy.cfg文件的目录下,然后输入并运行scrapy crawl bmw,最后静静等待就行了,不过下载的速度的确是有点慢

六、保存数据(异步下载图片)

然后这里采用scrapy内置的pipeline来进行保存图片,用这个来保存图片呢有下面几个好处:

  1. scrapy本身就有url去重的功能,所以就不会出现重复下载同一张图片的情况
  2. 它采用的是异步下载,下载速度大大提高
  3. 而且它还会自动把图片保存为合适的格式
  4. 等等等等

下面在pipeline.py文件中添加一个类,代码如下:

# -*- coding: utf-8 -*-
import os
from scrapy.pipelines.images import ImagesPipeline  #使用scrapy自带的pipeline
from hehe import settings #导入配置文件#只需重新复写以下两个方法就行
class HahaPipeline(ImagesPipeline):def get_media_requests(self, item, info):request_objs=super(HahaPipeline,self).get_media_requests(item,info)for request_obj in request_objs:request_obj.item=itemreturn request_objsdef file_path(self, request, response=None, info=None):#这个方法是图片将要被存储的时候调用,来获取图片的存储路径path=super(HahaPipeline,self).file_path(request,response,info)cate=request.item.get('title')images_store=settings.IMAGES_STORE  #获取配置文件当中的文件路径,如果不存在,会自动创建cate_path=os.path.join(images_store,cate)if not os.path.exists(cate_path):os.mkdir(cate_path)name=path.replace('full/','')  #去掉scrapy中这个pipeline自己定义的文件夹路径,这里你们可以去看看源码就知道了images_path=os.path.join(cate_path,name) #重新定义文件夹路径return images_path #返回自定义的图片存放路径

同样需要在setting.py文件中设置修改pipeline才能把这个新的pipeline给生效,如下添加一行并把之前的给注释掉,并且增加保存文件的路径一行:

import os
IMAGES_STORE=os.path.join(os.path.dirname(os.path.dirname(__file__)),'images')
ITEM_PIPELINES = {# 'hehe.pipelines.HehePipeline': 300,'hehe.pipelines.HahaPipeline': 300,
}

把之前下载的图片删除,重新运行一遍这个爬虫,会发现速度明显比之前要快得多,这就是异步下载的威力啊哈哈

写在最后

怎么说呢,当你试过这两种下载图片的方法之后,你会恍然大悟,会喜欢上scrapy框架,但是,其实那些异步下载啊、多线程啊什么的,如果有能力自己敲代码也是能够实现的,但是,我又觉得,既然scrapy已经帮你弄好了一整套可用的东西,你非要去自己编写,那不就是重复造轮子么,除非你想发展为爬虫架构师的那种级别,一般我们还是用别人的东西,学会用别人的东西就已经很不错了我觉得。而且我又觉得,当我们使用的多了之后,估计自然而然地也就清楚地知道那些框架是怎么回事了吧

这篇关于【Scrapy学习心得】爬虫实战三(异步下载宝马5系高清图片)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/550708

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W