当前位置: 首页 > news >正文

scrapy爬取图片

scrapy 爬取图片

环境准备

  • python3.10
  • scrapy pillow
  • pycharm
简要介绍scrapy
  • Scrapy 是一个开源的 Python 爬虫框架,专为爬取网页数据和进行 Web 抓取而设计。它的主要特点包括:

  • 高效的抓取性能:Scrapy 采用了异步机制,能够高效地进行大规模的网页抓取。

  • 灵活的数据处理:它支持将抓取的数据导出为多种格式,如 JSON、CSV 和 XML。

  • 强大的选择器:Scrapy 提供了基于 XPath 和 CSS 选择器的功能,方便用户从网页中提取数据。

  • 爬虫管理:Scrapy 允许用户定义爬虫的行为(如请求的间隔、错误处理、代理设置等),并支持管理多个爬虫项目。

  • 扩展性:Scrapy 支持插件,可以通过中间件扩展功能,如处理请求、响应等。

  • 内置去重功能:避免重复抓取同一个网页,提高抓取效率。
    Scrapy 适用于构建复杂的 Web 爬虫系统,尤其适用于大规模数据抓取和采集任务。

scrapy爬取图片数据

目标网站还是之前一篇文章中提到的药品网站
点击查看

目标:
  1. 将图片下载到本地
    在这里插入图片描述

  2. 将详情页面的药品全称作为图片的名称
    在这里插入图片描述

提示:

1.本文不进行其它信息的获取,不然会混淆,对学习scrapy造成困难,只简要介绍爬取思路和示例代码,以便你将来对某个类似网站中的图片进行爬取时能够有一定的思路和技巧
2.对于展示的代码,你可能不完全明白,但是你可以先学会如何用,用熟练了,想进一步钻研的,可以访问scrapy的官方文档 进行学习

接下来,马上开始

首先在你要确保你正确安装了scrapy包和pillow包,尤其是pillow,如果不正确安装你可能在运行的时候调度不了管道,下载不了图片(这个问题曾困扰我俩小时,我甚至还看了好多教程,换版本啦,改配置啦,到最后其实发现就是pillow没装好)

1 安装需要的包
pip install scrapy  
pip install pillow
2 创建主文件夹

如果你对命名不感兴趣但是又纠结取什么名字,那我提议起一个scrapy就行了

在这里插入图片描述

3 接下来,打开终端(Terminal)

在这里插入图片描述
然后利用dos命令切换到刚才我们创建的文件中 ,注意,只需要输入cd 然后按 tab键补全(当然,要按照我的步骤来就是这样的)
在这里插入图片描述
在这里插入图片描述
接下来是很重要的,作为scrapy的初学者你需要知道scrapy是一个封装好的爬虫框架,它为我们写python爬虫文件提供了很大的便利,我们只需要在终端里敲两行命令就可以准备好一切所需的文件,其余的只是我们进行修改而已

再终端中输入如下命令

scrapy startproject imgpro

在这里插入图片描述
这行命令运行成功后你会看到上图的提示,先别着急,我们目前最直观的可以看见文件栏里的scrapy文件夹下多了东西
在这里插入图片描述

它们就是刚才那行命令创造出来的,接下来我们的工作并未结束,我们需要生成spider文件,回到刚才的终端下,输入如下命令

 cd .\imgpro\imgpro\spiders\

在这里插入图片描述
然后开始输入生成spider的命令

scrapy genspider picpro www.xxx.com

在这里插入图片描述
然后你就会发现spider文件夹下多了一个文件
在这里插入图片描述
我们主要的数据解析任务就在这里编写 ,点击打开它,我们进行爬虫程序的编写工作
首先你需要将allowed_domains注释掉,还有就是将start_urls换成我们的目标网站的url
https://ypk.39.net/pifu/p1/
在这里插入图片描述
修改后是这样的
在这里插入图片描述
接下来开始数据解析的工作,我们打开网站链接进行xpath元素定位,注意scrapy "天然"支持xpath
首先我们想要得到的是图片,那就得得到图片的链接
在这里插入图片描述
点击复制右边的匹配的数据的第一个图片链接新窗口打开
在这里插入图片描述
可以验证我们是正确的,接下来就是定位详情页面的链接了,接着定位
在这里插入图片描述
这样得到的是我们想要的详情页面的链接,我们可以点开看看
在这里插入图片描述
然后我们要做的是定位到这个详情页面的药品名称
在这里插入图片描述
到此为止,我们的基本工作已经结束了
接下来开始编写代码 ,我会复制编写好的完整代码来进行解释,不用看到就觉得做不到,这样不会提升你的爬取技术

首先是picpro.py文件

import scrapyfrom ..items import ImgproItem #导入我们改写的items.py文件中的ImgproItemclass PicproSpider(scrapy.Spider):name = "picpro"# allowed_domains = ["www.xxx.com"]start_urls = ["https://ypk.39.net/pifu/p1/"]model_url = "https://ypk.39.net/pifu/p%d/" #设置模板链接,方便我们访问多页page_number = 2#定义解析详情页的方法	def detail_parse(self, response):meta = response.metaitem = meta['item']title = response.xpath('//div[@class="drug-layout-r-stor"]/h1').extract_first().split('>')[1].split('<')[0]# print(title)item['title'] = titleyield itemdef parse(self, response):li_lst = response.xpath('//ul[@class="drugs-ul"]/li')for li in li_lst:title = li.xpath('./a/@title').extract_first()img_src = li.xpath('./a/img/@src').extract_first()detail_url = li.xpath('./a/@href').extract_first()print(img_src)# tips:实例化item对象item = ImgproItem()item['img_src'] = img_srcyield scrapy.Request(meta={'item': item}, url=detail_url, callback=self.detail_parse)if self.page_number <= 2: #注意:这里只爬取前两页看看效果new_url = self.model_url % self.page_numberself.page_number += 1yield scrapy.Request(url=new_url, callback=self.parse)

其次是item.py文件,我们需要对想要获得的图片链接以及药品的详情页标题

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass ImgproItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()# passtitle = scrapy.Field()img_src = scrapy.Field()

然后是修改piplines.py文件

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
import scrapy
from itemadapter import ItemAdapterfrom scrapy.pipelines.images import ImagesPipeline
class ImgproPipeline(ImagesPipeline):def get_media_requests(self, item, info):img_src = item['img_src']# important:请求传参,将item中的图片名称传递给file_path# important:meta会将自身传递给file_pathyield scrapy.Request(url=img_src,meta={'title':item['title']}) #tips:用的还是请求传参def file_path(self,request,response = None,info = None,*,item= None,):# tips:返回图片的名称# important:接收请求传参过来的数据title = request.meta['title']+'.jpg'print(f'{title}保存成功')return titledef item_completed(self, results, item, info):return item

重要的还有改写settings.py文件

# Scrapy settings for imgpro project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     https://docs.scrapy.org/en/latest/topics/settings.html
#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://docs.scrapy.org/en/latest/topics/spider-middleware.htmlBOT_NAME = "imgpro"SPIDER_MODULES = ["imgpro.spiders"]
NEWSPIDER_MODULE = "imgpro.spiders"# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = "imgpro (+http://www.yourdomain.com)"
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"# Obey robots.txt rules
ROBOTSTXT_OBEY = False
LOG_LEVEL = 'ERROR'# important:新增图片的保存路径配置
IMAGES_STORE='./drugs'
# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16# Disable cookies (enabled by default)
#COOKIES_ENABLED = False# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False# Override the default request headers:
#DEFAULT_REQUEST_HEADERS = {
#    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
#    "Accept-Language": "en",
#}# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
#    "imgpro.middlewares.ImgproSpiderMiddleware": 543,
#}# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
#    "imgpro.middlewares.ImgproDownloaderMiddleware": 543,
#}# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    "scrapy.extensions.telnet.TelnetConsole": None,
#}# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {"imgpro.pipelines.ImgproPipeline": 300,
}# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = "httpcache"
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = "scrapy.extensions.httpcache.FilesystemCacheStorage"# Set settings whose default value is deprecated to a future-proof value
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
FEED_EXPORT_ENCODING = "utf-8"
以上的都结束后我们便可以开始,你直接复制也是可以的

回到终端下,输入

scrapy crawl imgpro  

在这里插入图片描述

接下来等程序跑完,我们就可以看到多出来了我们定义的保存路径以及图片

在这里插入图片描述
随便点开几个看看,发现都是成功的
在这里插入图片描述
scrapy 爬取图片的大致流程就是如此,其天然支持xpath,且作为一个框架极大简化了爬虫流程,并且其本质是多线程的,爬取速度非常之快,它可以做的不至于此,本案例只是作为其爬取图片的演示,希望能对你学习有所帮助。
请添加图片描述

相关文章:

scrapy爬取图片

scrapy 爬取图片 环境准备 python3.10scrapy pillowpycharm 简要介绍scrapy Scrapy 是一个开源的 Python 爬虫框架&#xff0c;专为爬取网页数据和进行 Web 抓取而设计。它的主要特点包括&#xff1a; 高效的抓取性能&#xff1a;Scrapy 采用了异步机制&#xff0c;能够高效…...

在 Vue 项目中使用地区级联选

在 Vue 项目中使用地区级联选择的完整流程&#xff1a; 1.安装依赖包&#xff0c;这个包提供了中国省市区的完整数据。 npm install element-china-area-data --save 2.导入数据 import { regionData } from element-china-area-data 这个包提供了几种不同的数据格式&#…...

【简博士统计学习方法】第1章:1. 统计学习的定义与分类

自用笔记 1. 统计学习的定义与分类 1.1 统计学习的概念 统计学习&#xff08;Statistical Machine Learning&#xff09;是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科。 以计算机和网络为平台&#xff1b;以数据为研究对象&#xff1b;以…...

利用 Python 脚本批量创建空白 Markdown 笔记

文章目录 利用 Python 脚本批量创建空白 Markdown 笔记1 背景介绍2 需求描述3 明确思路4 具体实现4.1. 遍历 toc.md 文件&#xff0c;收集文件名和对应的文件内容4.2. 实现文件批量生成逻辑4.3. 补全缺失的工具函数4.4. 进一步补全工具函数中的工具函数 5 脚本运行6 注意事项 利…...

【Qt】C++11 Lambda表达式

1. 举例 connect(ui->pushButton, &QPushButton::clicked, [](bool checked){//具体代码qDebug() << "Hello" << checked;}); 2. 详情 //完整形式 [ capture ] ( params ) opt -> ret { body; }; capture 是捕获列表params 是参数表opt 是函数…...

怎样提高服务器中的数据传输速度?

服务器中的数据传输速度会影响着用户的体验感&#xff0c;当企业中的数据传输速度出现卡顿或者是过慢时&#xff0c;用户不能及时浏览到所需的内容&#xff0c;给用户造成不好的体验感&#xff0c;那么企业该怎样才能提高服务器中的数据传输速度呢&#xff1f; 服务器之间如何传…...

Vue 封装公告滚动

文章目录 需求分析1. 创建公告组件Notice.vue2. 注册全局组件3. 使用 需求 系统中需要有一个公告展示&#xff0c;且这个公告位于页面上方&#xff0c;每个页面都要看到 分析 1. 创建公告组件Notice.vue 第一种 在你的项目的合适组件目录下&#xff08;比如components目录&a…...

JVM实战—12.OOM的定位和解决

大纲 1.如何对系统的OOM异常进行监控和报警 2.如何在JVM内存溢出时自动dump内存快照 3.Metaspace区域内存溢出时应如何解决(OutOfMemoryError: Metaspace) 4.JVM栈内存溢出时应如何解决(StackOverflowError) 5.JVM堆内存溢出时应该如何解决(OutOfMemoryError: Java heap s…...

【python翻译软件V1.0】

如果不想使用密钥的形式&#xff0c;且需要一个直接可用的中英文翻译功能&#xff0c;可以使用一些免费的公共 API&#xff0c;如 opencc 或其他无需密钥的库&#xff0c;或直接用 requests 获取翻译结果。 其中&#xff0c;我可以给你一个简单的代码示例&#xff0c;使用 tra…...

Spring Boot中的依赖注入是如何工作

Spring Boot 中的依赖注入&#xff08;Dependency Injection&#xff0c;简称 DI&#xff09;是通过 Spring 框架的核心机制——控制反转&#xff08;Inversion of Control&#xff0c;IOC&#xff09;容器来实现的。Spring Boot 基于 Spring Framework&#xff0c;在应用中自动…...

ubuntu22.04 编译安装libvirt 10.x

环境安装 sudo apt-get update -y sudo apt-get install qemu-system-x86 bridge-utils libyajl-dev -y sudo apt-get install build-essential autoconf automake libtool -y sudo apt-get install libxml2-dev libxslt1-dev libgnutls28-dev libpciaccess-dev libnl-3-de…...

[fastadmin] 第三十四篇 FastAdmin 商城模块标签使用详解

FastAdmin 商城模块标签使用详解 一、标签基本语法 1.1 基础语法格式 {shop:goodslist flag"参数值" id"变量名" row"数量"}<!-- 循环内容 --> {/shop:goodslist}1.2 常用参数说明 flag: 商品标记筛选id: 循环变量名row: 显示数量 1.…...

(2024,LLaVA-Bench (Wilder),LLaVA-NeXT,LLaMA3,Qwen-1.5,语言模型扩展)

LLaVA-NeXT: Stronger LLMs Supercharge Multimodal Capabilities in the Wild 目录 1. 简介 2. 探索大规模语言模型的能力极限 3. LLaVA-Bench (Wilder)&#xff1a;日常生活视觉聊天基准 4. Benchmark 结果 1. 简介 我们通过引入近期更强大的开源大语言模型&#xff08;…...

IPEX-LLM开发项目过程中的技术总结和心得

IPEX-LLM开发项目过程中的技术总结和心得 在人工智能快速发展的时代&#xff0c;高效地开发和部署大语言模型&#xff08;LLM&#xff09;已成为技术人员的必备技能。在我们的项目中&#xff0c;我们采用了 Intel Extension for PyTorch&#xff08;简称 IPEX&#xff09;和 L…...

HTTP/HTTPS ②-Cookie || Session || HTTP报头

这里是Themberfue 上篇文章介绍了HTTP报头的首行信息 本篇我们将更进一步讲解HTTP报头键值对的含义~~~ ❤️❤️❤️❤️ 报头Header ✨再上一篇的学习中&#xff0c;我们了解了HTTP的报头主要是通过键值对的结构存储和表达信息的&#xff1b;我们已经了解了首行的HTTP方法和UR…...

【软考】软件设计师

「学习路线」&#xff08;推荐该顺序学习&#xff0c;按照先易后难排序&#xff09; 1、上午题—计算机系统&#xff08;5~6分&#xff09;[1.8; ] 2、上午题—程序设计语言&#xff08;固定6分&#xff09;[1.9; ] 3、下午题—试题一&#xff08;15分&#xff09; 4、上午题—…...

K8s Pod OOMKilled,监控却显示内存资源并未打满

1. 问题现象 pod一直重启&#xff0c;通过grafana查看&#xff0c;发现内存使用率并没有100%。 2. 排查过程 2.1 describe查看pod最新一次的状态 可以明显看到&#xff0c;最近一次的重启就是因为内存不足导致的。 2.2 describe 查看node节点状态 找到原因了&#xff0c;原来…...

C++ 原子变量

C 原子变量 文章目录 C 原子变量1. 原子变量是什么&#xff1f;2. 原子操作的特点3. 原子变量的作用1. 多线程安全的共享数据访问2. 替代锁机制3. 实现低级同步算法 4. 原子变量的常见操作5. 内存顺序&#xff08;Memory Ordering&#xff09;内存顺序控制在原子变量中的作用如…...

linux网络 | http结尾、理解长连接短链接与cookie

前言&#xff1a;本节是http章节的最后一部分&#xff0c;主要解释一些小概念。讲解到了HTTP的方法&#xff0c;表单&#xff0c; 重定向等等。 现在废话不多说&#xff0c; 开始我们的学习吧。 ps&#xff1a;本节内容都是概念&#xff0c; 知道就行&#xff0c; 友友们放心观…...

金融项目实战 02|接口测试分析、设计以及实现

目录 ⼀、接口相关理论 二、接口测试 1、待测接口&#xff1a;投资业务 2、接口测试流程 3、设计用例理论 1️⃣设计方法 2️⃣工具 4、测试点提取 5、测试用例 ⼀、接口相关理论 1、ui功能测试和接⼝测试那个先执⾏&#xff1f;为什么&#xff1f; 结论&#xff1a…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...