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 scrapy

from ..items import ImgproItem #导入我们改写的items.py文件中的ImgproItem


class 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.meta
        item = meta['item']
        title = response.xpath('//div[@class="drug-layout-r-stor"]/h1').extract_first().split('>')[1].split('<')[0]
        # print(title)
        item['title'] = title
        yield item

    def 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_src
            yield scrapy.Request(meta={'item': item}, url=detail_url, callback=self.detail_parse)
        if self.page_number <= 2: #注意:这里只爬取前两页看看效果
            new_url = self.model_url % self.page_number
            self.page_number += 1
            yield 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.html

import scrapy


class ImgproItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # pass
    title = 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 ItemAdapter

from 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_path
        yield 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 title
    def 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.html

BOT_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,且作为一个框架极大简化了爬虫流程,并且其本质是多线程的,爬取速度非常之快,它可以做的不至于此,本案例只是作为其爬取图片的演示,希望能对你学习有所帮助。
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/952109.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python学opencv|读取图像(二十八)使用cv2.warpAffine()函数平移图像

【1】引言 前序已经对图像操作进行了广泛的学习&#xff0c;包括读取、放大缩小&#xff0c;改变BGR通道值等&#xff0c;相关链接包括且不限于&#xff1a; python学opencv|读取图像-CSDN博客 python学opencv|读取图像&#xff08;三&#xff09;放大和缩小图像_python(1)使…

【数据库】四、数据库管理与维护

文章目录 四、数据库管理与维护1 安全性管理2 事务概述3 并发控制4 备份与恢复管理 四、数据库管理与维护 1 安全性管理 安全性管理是指保护数据库&#xff0c;以避免非法用户进行窃取数据、篡改数据、删除数据和破坏数据库结构等操作 三个级别认证&#xff1a; 服务器级别…

如何定位导致 Django 错误的文件

在 Django 开发中&#xff0c;当发生错误时&#xff0c;定位问题所在的文件和代码行是调试的重要步骤。以下是一些常用的方法和技巧来定位导致 Django 错误的文件&#xff1a; 1、问题背景 在项目中使用了 shrink 工具尝试运行 collect static 时&#xff0c;出现 TemplateSyn…

JavaSE——网络编程

一、InetAddress类 InetAddress是Java中用于封装IP地址的类。 获取本机的InetAddress对象&#xff1a; InetAddress localHost InetAddress.getLocalHost();根据指定的主机名获取InetAddress对象&#xff08;比如说域名&#xff09; InetAddress host InetAddress.getByNa…

在Windows环境下搭建无人机模拟器

最近要开发无人机地面站&#xff0c;但是没有无人机&#xff0c;开发无人机对我来说也是大姑娘坐花轿——头一回。我们要用 MAVLink 和无人机之间通信&#xff0c;看了几天 MAVLink&#xff0c;还是不得劲儿&#xff0c;没有实物实在是不好弄&#xff0c;所以想先装一个无人机模…

安科瑞 Acrel-1000DP 分布式光伏监控系统在工业厂房分布式光伏发电项目中的应用

吕梦怡 18706162527 摘 要&#xff1a;常规能源以煤、石油、天然气为主&#xff0c;不仅资源有限&#xff0c;而且会造成严重的大气污染&#xff0c;开发清洁的可再生能源已经成为当今发展的重要任务&#xff0c;“节能优先&#xff0c;效率为本”的分布式发电能源符合社会发…

NAT 代理服务器

文章目录 1. NAT2. 内网穿透3. 内网打洞4. 代理服务器正向代理服务器反向代理服务器 5. DNS6. ICMP7.测试内网穿透 1. NAT 在ip协议章节&#xff0c;我们说报文转发给路由器时&#xff0c;由于私有IP地址不能出现在公网中&#xff0c;路由器会将报文源IP地址替换为路由器的WAN…

Python数据可视化-Pandas

文章目录 一. Pandas数据可视化简介二. Pandas 单变量可视化1. 柱状图2. 折线图3. 面积图4. 直方图5. 饼图 三. Pandas 双变量可视化1. 散点图2. 蜂巢图3. 堆叠图4. 折线图 一. Pandas数据可视化简介 pandas库是Python数据分析的核心库 它不仅可以加载和转换数据&#xff0c;还…

【NLP 18、新词发现和TF·IDF】

目录 一、新词发现 1.新词发现的衡量标准 ① 内部稳固 ② 外部多变 2.示例 ① 初始化类 NewWordDetect ② 加载语料信息&#xff0c;并进行统计 ③ 统计指定长度的词频及其左右邻居字符词频 ④ 计算熵 ⑤ 计算左右熵 ​编辑 ⑥ 统计词长总数 ⑦ 计算互信息 ⑧ 计算每个词…

【Elasticsearch】配置分片分配到指定节点

配置分片分配到指定节点 参考文章&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/shard-allocation-filtering.html 两种方式&#xff1a;根据节点属性分配和根据节点名称分配。 测试环境 tar xvf elasticsearch-7.17.25-linux-x86_64.tar.gz…

1. Doris分布式环境搭建

一. 环境准备 本次测试集群采用3台机器hadoop1、hadoop2、hadoop3, Frontend和Backend部署在同一台机器上&#xff0c;Frontend部署3台组成高可用&#xff0c;Backend部署3个节点&#xff0c;组成3副本存储。 主机IP操作系统FrontendBackendhadoop1192.168.47.128Centos7Foll…

计算机毕业设计Python机器学习农作物健康识别系统 人工智能 图像识别 机器学习 大数据毕业设计 算法

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

gesp(C++四级)(11)洛谷:B4005:[GESP202406 四级] 黑白方块

gesp(C四级)&#xff08;11&#xff09;洛谷&#xff1a;B4005&#xff1a;[GESP202406 四级] 黑白方块 题目描述 小杨有一个 n n n 行 m m m 列的网格图&#xff0c;其中每个格子要么是白色&#xff0c;要么是黑色。对于网格图中的一个子矩形&#xff0c;小杨认为它是平衡的…

在Mac上使用 Docker 构建一个 noVNC 环境并运行 MyCobot

本文展示了Mycobot 280 M5 上的 Mycobot 280 M5 moveit2 模拟环境&#xff0c;以及详细介绍了使用 Docker 在 macOS&#xff08;arm64&#xff09;上构建 moveit2 环境的步骤。 一、引言 这篇文章主要内容是关于如何在 Ros2 环境中构建在 Mac 上模拟 Mycobot 280 M5 的环境。 …

c语言提供后端,提供页面显示跳转服务

后端代码: #define SERVER_IP_ADDR "0.0.0.0" // 服务器IP地址 #define SERVER_PORT 8080 // 服务器端口号 #define BACKLOG 10 #define BUF_SIZE 8192 #define OK 1 #define ERROR 0#include <stdio.h> #include <stdlib.h> #include <st…

AnaConda下载PyTorch慢的解决办法

使用Conda下载比较慢&#xff0c;改为pip下载 复制下载链接到迅雷下载 激活虚拟环境&#xff0c;安装whl&#xff0c;即可安装成功 pip install D:\openai.wiki\ChatGLM2-6B\torch-2.4.1cu121-cp38-cp38-win_amd64.whl

Sentinel服务保护 + Seata分布式事务

服务保护 【雪崩问题】微服务调用链路中某个服务&#xff0c;引起整个链路中所有微服务都不可用。 【原因】&#xff1a; 微服务相互调用&#xff0c;服务提供者出现故障。服务调用这没有做好异常处理&#xff0c;导致自身故障。调用链中所有服务级联失败&#xff0c;导致整个…

六、Angular 发送请求/ HttpClient 模块

一、应用 HttpClient 模块 angular/common/http 中的 HttpClient 类基于浏览器提供的 XMLHttpRequest 接口。要想使用 HtpClient 模块&#xff0c;就要先导入 Anqular 的 HttpClientModule。大多数 Web 应用程序都会在根模块 AppModule 中导入它。 编辑 src/app/app.module.ts…

CompletableFuture // todo

相比较所有代码都在主线程执行&#xff0c;使用Future的好处&#xff1a;利用服务器多核、并发的优势。 不足&#xff1a; 开启没有返回值的异步线程&#xff1a; 1、runAsync 使用lambda表达式&#xff1a; 开启有返回值的异步线程&#xff1a; 1、supplyAsync 异步任务中的…

css面试常考布局(圣杯布局、双飞翼布局、三栏布局、两栏布局、三角形)

两栏布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…