Python爬虫实战:批量下载亚马逊商品图片

简介: Python爬虫实战:批量下载亚马逊商品图片
  1. 引言
    在电商数据分析、竞品调研或价格监控等场景中,爬取亚马逊商品图片是一项常见需求。然而,亚马逊(Amazon)作为全球最大的电商平台之一,具有严格的反爬机制,直接爬取可能会遇到IP封锁、验证码等问题。
    本文将介绍如何使用Python爬虫技术批量下载亚马逊商品图片,涵盖以下内容:
    ● 目标分析:确定爬取亚马逊商品图片的策略
    ● 技术选型:选择合适的爬虫库(Requests、BeautifulSoup、Selenium等)
    ● 反爬绕过:设置合理的请求头、代理IP、延迟策略
    ● 图片下载:解析HTML并批量存储图片
    ● 完整代码实现:提供可运行的Python代码
  2. 技术选型与准备工作
    2.1 工具与库
    ● Python 3.x(推荐3.8+)
    ● Requests:发送HTTP请求获取网页内容
    ● BeautifulSoup(bs4):解析HTML,提取图片URL
    ● Selenium(可选):应对动态加载的页面
    ● Fake UserAgent:随机生成User-Agent,减少被封锁风险
    ● 代理IP(可选):防止IP被封
    2.2 安装依赖
  3. 爬取亚马逊商品页面的策略
    亚马逊的反爬机制较为严格,直接使用requests可能会被拒绝访问。因此,我们需要:
  4. 模拟浏览器请求:设置合理的User-Agent和Referer
  5. 降低请求频率:避免短时间内高频访问
  6. 使用代理IP(可选):防止单一IP被封锁
  7. 处理动态加载内容(可选):部分图片可能由JavaScript加载,需用Selenium
  8. 实现步骤
    4.1 获取亚马逊商品页面
    首先,我们尝试用requests获取商品页面的HTML。
    ```import requests
    from bs4 import BeautifulSoup
    from fake_useragent import UserAgent

设置随机User-Agent

ua = UserAgent()
headers = {
'User-Agent': ua.random,
'Accept-Language': 'en-US,en;q=0.9',
'Referer': 'https://www.amazon.com/'
}

目标商品URL(示例:亚马逊上的某款手机)

url = "https://www.amazon.com/dp/B09G9FPHY6" # 替换为目标商品URL

try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # 检查请求是否成功
print("成功获取页面!")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
exit()

解析HTML

soup = BeautifulSoup(response.text, 'html.parser')

4.2 解析图片URL
亚马逊的商品图片通常存储在<img>标签中,我们需要找到正确的src或data-src属性。
```# 查找所有图片标签
image_tags = soup.find_all('img', {'class': 'a-dynamic-image'})

# 提取图片URL
image_urls = []
for img in image_tags:
    src = img.get('src') or img.get('data-src')
    if src and 'http' in src:  # 确保是有效的URL
        image_urls.append(src)

print(f"找到 {len(image_urls)} 张图片")

4.3 下载图片并存储
使用requests下载图片并保存到本地文件夹。
```import os

创建存储目录

output_dir = "amazon_images"
os.makedirs(output_dir, exist_ok=True)

下载图片

for i, img_url in enumerate(image_urls[:10]): # 限制下载前10张
try:
img_data = requests.get(img_url, headers=headers, timeout=10).content
with open(f"{outputdir}/image{i+1}.jpg", 'wb') as f:
f.write(imgdata)
print(f"下载成功: image
{i+1}.jpg")
except Exception as e:
print(f"下载失败 {img_url}: {e}")

4.4 完整代码
```import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import os

# 代理配置
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

# 代理格式:http://用户名:密码@代理地址:端口
proxyMeta = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
proxies = {
    "http": proxyMeta,
    "https": proxyMeta,
}

# 设置随机User-Agent
ua = UserAgent()
headers = {
    'User-Agent': ua.random,
    'Accept-Language': 'en-US,en;q=0.9',
    'Referer': 'https://www.amazon.com/'
}

# 目标商品URL
url = "https://www.amazon.com/dp/B09G9FPHY6"  # 替换为目标商品URL

# 获取页面(带代理)
try:
    response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
    response.raise_for_status()
    print("成功获取页面!")
except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
    exit()

# 解析HTML
soup = BeautifulSoup(response.text, 'html.parser')

# 提取图片URL
image_tags = soup.find_all('img', {'class': 'a-dynamic-image'})
image_urls = []
for img in image_tags:
    src = img.get('src') or img.get('data-src')
    if src and 'http' in src:
        image_urls.append(src)

print(f"找到 {len(image_urls)} 张图片")

# 下载图片(带代理)
output_dir = "amazon_images"
os.makedirs(output_dir, exist_ok=True)

for i, img_url in enumerate(image_urls[:10]):  # 限制下载前10张
    try:
        img_data = requests.get(img_url, headers=headers, proxies=proxies, timeout=10).content
        with open(f"{output_dir}/image_{i+1}.jpg", 'wb') as f:
            f.write(img_data)
        print(f"下载成功: image_{i+1}.jpg")
    except Exception as e:
        print(f"下载失败 {img_url}: {e}")
  1. 进阶优化
    使用Selenium处理动态加载内容
    如果目标页面的图片是JavaScript动态加载的,可以使用Selenium模拟浏览器行为:
    ```from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    import time

设置无头浏览器

options = Options()
options.add_argument('--headless') # 无界面模式
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=options)

访问页面

driver.get(url)
time.sleep(3) # 等待JS加载

获取页面源码

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

后续解析和下载逻辑相同...

driver.quit()
```

  1. 法律与道德提醒
    ● 遵守亚马逊的Robots协议(https://www.amazon.com/robots.txt)
    ● 避免高频访问,防止IP被封
    ● 仅用于学习研究,不得用于商业爬取
  2. 结语
    本文介绍了如何使用Python爬虫批量下载亚马逊商品图片,涵盖请求模拟、HTML解析、反爬策略和图片存储。通过合理设置请求头、代理IP和延迟策略,可以有效降低被封锁的风险。
    适用场景:
    ● 电商数据分析
    ● 竞品图片采集
    ● 自动化商品监控
    进一步优化方向:
    ● 结合OCR识别图片中的文字(如价格、规格)
    ● 构建分布式爬虫提高效率
    ● 使用Scrapy框架进行更复杂的爬取任务
相关文章
|
2月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
409 7
|
2月前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
2月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
2月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
352 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
2月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
2月前
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
Python API接口实战指南:从入门到精通
|
2月前
|
存储 分布式计算 测试技术
Python学习之旅:从基础到实战第三章
总体来说,第三章是Python学习路程中的一个重要里程碑,它不仅加深了对基础概念的理解,还引入了更多高级特性,为后续的深入学习和实际应用打下坚实的基础。通过这一章的学习,读者应该能够更好地理解Python编程的核心概念,并准备好应对更复杂的编程挑战。
131 12
|
2月前
|
数据采集 人工智能 JSON
Prompt 工程实战:如何让 AI 生成高质量的 aiohttp 异步爬虫代码
Prompt 工程实战:如何让 AI 生成高质量的 aiohttp 异步爬虫代码
|
2月前
|
数据采集 存储 JSON
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
|
2月前
|
存储 数据采集 监控
Python文件操作全攻略:从基础到高级实战
本文系统讲解Python文件操作核心技巧,涵盖基础读写、指针控制、异常处理及大文件分块处理等实战场景。结合日志分析、CSV清洗等案例,助你高效掌握文本与二进制文件处理,提升程序健壮性与开发效率。(238字)
367 1

推荐镜像

更多