在电商数据分析、竞品调研或价格监控等场景中,爬取亚马逊商品图片是一项常见需求。然而,亚马逊(Amazon)作为全球最大的电商平台之一,具有严格的反爬机制,直接爬取可能会遇到IP封锁、验证码等问题。
本文将介绍如何使用Python爬虫技术批量下载亚马逊商品图片,涵盖以下内容:
亚马逊的反爬机制较为严格,直接使用requests
可能会被拒绝访问。因此,我们需要:
User-Agent
和Referer
首先,我们尝试用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')
亚马逊的商品图片通常存储在<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)} 张图片")
使用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"{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}")
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}")
使用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()
本文介绍了如何使用Python爬虫批量下载亚马逊商品图片,涵盖请求模拟、HTML解析、反爬策略和图片存储。通过合理设置请求头、代理IP和延迟策略,可以有效降低被封锁的风险。
适用场景:
进一步优化方向:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。