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

Amazon图片下载器:利用Scrapy库完成图像下载任务

亿牛云.png

概述

本文介绍了如何使用Python的Scrapy库编写一个简单的爬虫程序,实现从Amazon网站下载商品图片的功能。Scrapy是一个强大的爬虫框架,提供了许多方便的特性,如选择器、管道、中间件、代理等。本文将重点介绍如何使用Scrapy的图片管道和代理中间件,以提高爬虫的效率和稳定性。

正文

1. 创建Scrapy项目

首先,我们需要创建一个Scrapy项目,命名为amazon_image_downloader。在命令行中输入以下命令:

scrapy startproject amazon_image_downloader

这将在当前目录下生成一个名为amazon_image_downloader的文件夹,其中包含以下文件和子文件夹:

amazon_image_downloader/scrapy.cfg            # 配置文件amazon_image_downloader/     # 项目的Python模块__init__.pyitems.py          # 项目中的item文件middlewares.py    # 项目中的中间件文件pipelines.py      # 项目中的管道文件settings.py       # 项目的设置文件spiders/          # 存放爬虫代码的目录__init__.py
2. 定义Item类

接下来,我们需要在items.py文件中定义一个Item类,用来存储我们要爬取的数据。在本例中,我们只需要爬取商品图片的URL和名称,所以我们可以定义如下:

import scrapyclass AmazonImageItem(scrapy.Item):# 定义一个Item类,用来存储图片的URL和名称image_urls = scrapy.Field() # 图片的URL列表image_name = scrapy.Field() # 图片的名称
3. 编写爬虫代码

然后,我们需要在spiders文件夹中创建一个名为amazon_spider.py的文件,编写我们的爬虫代码。我们可以使用Scrapy提供的CrawlSpider类来实现自动跟进链接的功能。我们需要指定以下内容:

  • name: 爬虫的名称,用来运行爬虫时使用。
  • allowed_domains: 允许爬取的域名列表,防止爬虫跑到其他网站上。
  • start_urls: 起始URL列表,爬虫会从这些URL开始抓取数据。
  • rules: 规则列表,用来指定如何从响应中提取链接并跟进。
  • parse_item: 解析函数,用来从响应中提取数据并生成Item对象。

我们可以参考Amazon网站的结构和URL规律,编写如下代码:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from amazon_image_downloader.items import AmazonImageItemclass AmazonSpider(CrawlSpider):# 定义一个CrawlSpider类,用来实现自动跟进链接的功能name = 'amazon_spider' # 爬虫的名称allowed_domains = ['amazon.com'] # 允许爬取的域名列表start_urls = ['https://www.amazon.com/s?k=book'] # 起始URL列表rules = (# 定义规则列表,指定如何从响应中提取链接并跟进Rule(LinkExtractor(allow=r'/s\?k=book&page=\d+'), follow=True), # 匹配商品列表页的链接,并跟进Rule(LinkExtractor(allow=r'/dp/\w+'), callback='parse_item'), # 匹配商品详情页的链接,并调用parse_item函数)def parse_item(self, response):# 定义解析函数,从响应中提取数据并生成Item对象item = AmazonImageItem() # 创建一个Item对象item['image_urls'] = [response.xpath('//img[@id="imgBlkFront"]/@src').get()] # 从响应中提取图片的URL,并存入image_urls字段item['image_name'] = response.xpath('//span[@id="productTitle"]/text()').get().strip() # 从响应中提取图片的名称,并存入image_name字段return item # 返回Item对象
4. 配置图片管道和代理中间件

最后,我们需要在settings.py文件中配置图片管道和代理中间件,以实现图片的下载和代理的使用。我们需要修改以下内容:

  • ITEM_PIPELINES: 项目中启用的管道类及其优先级的字典。我们需要启用Scrapy提供的ImagesPipeline类,并指定一个合适的优先级,如300。
  • IMAGES_STORE: 图片管道使用的本地存储路径。我们可以指定一个名为images的文件夹,用来存放下载的图片。
  • IMAGES_URLS_FIELD: 图片管道使用的Item字段,该字段的值是一个包含图片URL的列表。我们需要指定为image_urls,与我们定义的Item类一致。
  • IMAGES_RESULT_FIELD: 图片管道使用的Item字段,该字段的值是一个包含图片信息的列表。我们可以指定为image_results,用来存储图片的路径、校验码、大小等信息。
  • DOWNLOADER_MIDDLEWARES: 项目中启用的下载器中间件类及其优先级的字典。我们需要启用Scrapy提供的HttpProxyMiddleware类,并指定一个合适的优先级,如100。
  • PROXY_POOL: 代理池,用来提供代理IP和端口。我们可以使用亿牛云爬虫代理提供的域名、端口、用户名、密码
  • CONCURRENT_REQUESTS: Scrapy downloader 并发请求(concurrent requests)的最大值。我们可以根据我们的网络和代理的质量,设置一个合适的值,如16。
  • CONCURRENT_REQUESTS_PER_DOMAIN: 对单个网站进行并发请求的最大值。我们可以根据目标网站的反爬策略,设置一个合适的值,如8。
  • DOWNLOAD_DELAY: 下载两个页面之间等待的时间。这可以用来限制爬取速度,减轻服务器压力。我们可以根据目标网站的反爬策略,设置一个合适的值,如0.5秒。

修改后的settings.py文件如下:

# Scrapy settings for amazon_image_downloader projectassistant = 'amazon_image_downloader'SPIDER_MODULES = ['amazon_image_downloader.spiders']
NEWSPIDER_MODULE = 'amazon_image_downloader.spiders'# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'amazon_image_downloader (+http://www.yourdomain.com)'# Obey robots.txt rules
ROBOTSTXT_OBEY = False# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 300, # 启用图片管道,并指定优先级为300
}# Configure images pipeline
# See https://docs.scrapy.org/en/latest/topics/images.html
IMAGES_STORE = 'images' # 指定图片管道使用的本地存储路径为images文件夹
IMAGES_URLS_FIELD = 'image_urls' # 指定图片管道使用的Item字段为image_urls
IMAGES_RESULT_FIELD = 'image_results' # 指定图片管道使用的Item字段为image_results# Configure downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 100, # 启用代理中间件,并指定优先级为100
}# Configure proxy pool
# 亿牛云代理 https://www.16yun.cn
PROXY_POOL = ['http://username:password@domain:port', # 使用亿牛云爬虫代理提供的域名、端口、用户名、密码'http://username:password@domain:port',...
]# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
#}# Configure item exporters
## Configure concurrent requests and download delay
# See https://docs.scrapy.org/en/latest/topics/settings.html
CONCURRENT_REQUESTS = 16 # 设置Scrapy downloader 并发请求的最大值为16
CONCURRENT_REQUESTS_PER_DOMAIN = 8 # 设置对单个网站进行并发请求的最大值为8
DOWNLOAD_DELAY = 0.5 # 设置下载两个页面之间等待的时间为0.5秒

结语

本文介绍了如何使用Python的Scrapy库编写一个简单的爬虫程序,实现从Amazon网站下载商品图片的功能。我们使用了Scrapy的图片管道和代理中间件,以提高爬虫的效率和稳定性。我们还使用了多线程技术,提高采集速度。这个爬虫程序只是一个示例,你可以根据你的具体需求进行修改和优化,感谢你的阅读。

相关文章:

Amazon图片下载器:利用Scrapy库完成图像下载任务

概述 本文介绍了如何使用Python的Scrapy库编写一个简单的爬虫程序,实现从Amazon网站下载商品图片的功能。Scrapy是一个强大的爬虫框架,提供了许多方便的特性,如选择器、管道、中间件、代理等。本文将重点介绍如何使用Scrapy的图片管道和代理…...

Unity中Shader的Pass的复用

文章目录 前言一、怎么实现Pass的复用1、给需要引用的Pass给定特定的名字2、在需要引用 Pass 的Shader中,在Pass的平行位置使用 UsePass "ShaderPath PassName" 二、实现一个没被遮挡的部分显示模型原本的样子,遮挡部分显示模型的XRay效果1、…...

vue内容自适应方法

Vue中可以通过以下几种方式实现内容自适应: 使用CSS媒体查询:使用CSS媒体查询可以根据屏幕大小来动态改变元素的样式。例如,可以设置一个div元素在屏幕宽度小于600px时宽度为100%,在屏幕宽度大于600px时宽度为50%。 使用Vue的计算…...

RustDay05------Exercise[41-50]

41.使用模块的函数 mod 是用于创建模块的关键字。模块是一种组织代码的方式,它可以包含函数 (fn)、结构体 (struct)、枚举 (enum)、常量 (const)、其他模块 (mod) 等。模块用于组织和封装代码,帮助将代码分割成可管理的单元。模块可以形成层次结构&…...

C语言实现通讯录(超详细)

1.实现怎样一个通讯录 实现一个通讯录联系人信息:1.可以保存100个人的信息名字2.添加联系人年龄3.删除指定联系人性别4.查找指定联系人电话5.修改指定联系人住址6.排序联系人7.显示所有联系人信息 2.通讯录的实现 2.1创建两个源文件和一个头文件 首先我们创建con…...

【Python机器学习】零基础掌握MinCovDet协方差估计

如何更精准地评估资产的风险和收益? 在投资领域,资产的风险和收益评估是至关重要的。传统的协方差矩阵虽然在某种程度上能反映资产间的关联性,但也存在一定的局限性。例如如果样本数量较少,传统的协方差矩阵可能会出现偏差,从而影响投资决策。 假设现在有一个投资组合,…...

2023年【四川省安全员A证】模拟试题及四川省安全员A证作业模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 2023年四川省安全员A证模拟试题为正在备考四川省安全员A证操作证的学员准备的理论考试专题,每个月更新的四川省安全员A证作业模拟考试祝您顺利通过四川省安全员A证考试。 1、【多选题】36V照明适用的场所条…...

Flask项目log的集成

一、引入log 在项目的init.py文件中: import logging from logging.handlers import RotatingFileHandlerfrom flask_wtf.csrf import CSRFProtect from flask import Flask from flask_sqlalchemy import SQLAlchemy from redis import StrictRedis from flask_s…...

Open3D(C++) 最小二乘拟合平面(拉格朗日乘子法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。 一、算法原理 设拟合出的平面方程为: a x + b y + c...

c语言练习93:环形链表的约瑟夫问题

环形链表的约瑟夫问题 环形链表的约瑟夫问题_牛客题霸_牛客网 描述 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是…...

从入门到进阶 之 ElasticSearch 文档、分词器 进阶篇

🌹 以上分享 ElasticSearch 文档、分词器 进阶篇,如有问题请指教写。🌹🌹 如你对技术也感兴趣,欢迎交流。🌹🌹🌹 如有需要,请👍点赞💖收藏&#…...

亚马逊云科技多项新功能与服务,助力各种规模的组织拥抱生成式 AI

从初创企业到大型企业,各种规模的组织都纷纷开始接触生成式 AI 技术。这些企业希望充分利用生成式 AI,将自身在测试版、原型设计以及演示版中的畅想带到现实场景中,实现生产力的大幅提升并大力进行创新。但是,组织要怎样才能在企业…...

网站布局都有哪些?

网站布局是指网页中各元素的布局方式,以下是一些常见的网站布局: 栅格布局:将页面分成一个个小格子,再把内容放到对应的格子中。这种布局有利于提高网页的视觉一致性和用户体验,是网站设计中最常用的布局方式之一。流…...

第17章 MQ(一)

17.1 谈谈你对MQ的理解 难度:★ 重点:★★ 白话解析 MQ也要有一跟主线,先理解它是什么,从三个方面去理解就好了:1、概念;2、核心功能;3、分类。 1、概念:MQ(Message Queue),消息队列,是基础数据结构中“先进先出”的一种数据结构。指把要传输的数据(消息)放在队…...

LeetCode算法刷题(python) Day41|09动态规划|理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

目录 动规五部曲LeetCode 509. 斐波那契数LeetCode 70. 爬楼梯LeetCode 746. 使用最小花费爬楼梯 动规五部曲 确定dp数组以及下标的含义确定递归公式dp数组如何初始化确定遍历顺序举例推导dp数组 LeetCode 509. 斐波那契数 力扣题目链接 本题最直观是用递归方法 class Sol…...

Spring(四)

1、Spring6整合JUnit 1、JUnit4 User类: package com.songzhishu.spring.bean;import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;/*** BelongsProject: Spring6* BelongsPackage: com.songzhishu.spring.bean*…...

2023-10-8讯飞大模型部署2024秋招后端一面(附详解)

1 mybatis的mapper是什么东西 在MyBatis中,mapper是一个核心概念,它起到了桥梁的作用,连接Java对象和数据库之间的数据。具体来说,mapper可以分为以下两个部分: Mapper XML文件: 这是一个XML文件&#xff…...

如何为 Elasticsearch 创建自定义连接器

了解如何为 Elasticsearch 创建自定义连接器以简化数据摄取过程。 作者:JEDR BLASZYK Elasticsearch 拥有一个摄取工具库,可以从多个来源获取数据。 但是,有时你的数据源可能与 Elastic 现有的提取工具不兼容。 在这种情况下,你可…...

Debian11 安装 OpenJDK8

1. 下载安装包 wget http://snapshot.debian.org/archive/debian-security/20220210T090326Z/pool/updates/main/o/openjdk-8/openjdk-8-jdk_8u322-b06-1~deb9u1_amd64.deb wget http://snapshot.debian.org/archive/debian-security/20220210T090326Z/pool/updates/main/o/op…...

[Machine Learning][Part 6]Cost Function代价函数和梯度正则化

目录 拟合 欠拟合 过拟合 正确的拟合 解决过拟合的方法:正则化 线性回归模型和逻辑回归模型都存在欠拟合和过拟合的情况。 拟合 来自百度的解释: 数据拟合又称曲线拟合,俗称拉曲线,是一种把现有数据透过数学方法来代入一条…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...