
import requests
from bs4 import BeautifulSoup
def get_product_title(url):
"""
一个基础的函数,用于获取单个亚马逊页面的商品标题。
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
'Accept-Language': 'en-US,en;q=0.9'
}
try:
response = requests.get(url, headers=headers, timeout=15)
# 确保请求成功
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# 通过ID查找标题元素,这是相对稳定的方式
title_element = soup.find('span', id='productTitle')
if title_element:
return title_element.get_text(strip=True)
else:
return "未能找到商品标题"
except requests.exceptions.RequestException as e:
return f"请求失败: {e}"
except AttributeError:
return "解析HTML时出错,可能页面结构已改变"
# --- 主程序 ---
if __name__ == '__main__':
test_url = 'Page Not Found'
title = get_product_title(test_url)
print(f"采集结果: {title}")
代码实战:在Requests中接入代理
假设您从代理服务商处获得了一个住宅代理,格式通常为 username:password@proxy_host:proxy_port。
import requests
# 代理服务商提供的认证信息和地址
proxy_config = {
'user': 'your_proxy_username',
'pass': 'your_proxy_password',
'host': 'gate.smartproxy.com',
'port': '7000'
}
# 构建适用于requests的代理URL
proxy_url = f"http://{proxy_config['user']}:{proxy_config['pass']}@{proxy_config['host']}:{proxy_config['port']}"
proxies = {
'http': proxy_url,
'httpshttps': proxy_url,
}
# 在请求时传入proxies参数
# ... 其他代码如url, headers ...
url = 'https://www.amazon.com/dp/B09G9F4Y96'
headers = {'User-Agent': '...'}
try:
print("正在通过住宅代理网络发送请求...")
response = requests.get(url, headers=headers, proxies=proxies, timeout=20)
response.raise_for_status()
print("代理请求成功!")
# ... 后续解析
except requests.exceptions.ProxyError as e:
print(f"代理错误,请检查代理配置或网络: {e}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
<!-- end list -->
Python
# 此为演示逻辑的伪代码/简化代码,非直接运行版本
import requests
import time
def solve_amazon_captcha(api_key, page_url, sitekey):
# 1. 提交任务到2Captcha
submit_res = requests.post('http://2captcha.com/in.php', data={
'key': api_key,
'method': 'userrecaptcha',
'googlekey': sitekey,
'pageurl': page_url,
'json': 1
}).json()
if submit_res['status'] == 1:
task_id = submit_res['request']
print(f"验证码任务已提交, ID: {task_id}")
else:
print(f"提交失败: {submit_res['request']}")
return None
# 2. 轮询结果
while True:
time.sleep(10)
result_res = requests.get(f"http://2captcha.com/res.php?key={api_key}&action=get&id={task_id}&json=1").json()
if result_res['status'] == 1:
print("成功破解验证码!")
return result_res['request'] # 返回g-recaptcha-response token
elif result_res['request'] == 'CAPCHA_NOT_READY':
print("仍在破解中,请稍候...")
else:
print(f"破解失败: {result_res['request']}")
return None
注意: 这只是一个演示流程,真实的逻辑要复杂得多,包括完整的错误处理和提交回亚马逊的步骤。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
def get_dynamic_content_with_selenium(url):
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 无头模式
options.add_argument('user-agent=Mozilla/5.0...')
driver = webdriver.Chrome(options=options)
try:
driver.get(url)
# 等待评论区加载出来,最多等待15秒
# 这是一个专业的做法,确保在解析前内容已存在
wait = WebDriverWait(driver, 15)
wait.until(EC.visibility_of_element_located((By.ID, "reviews-medley-footer")))
print("动态内容加载完毕!")
# 获取渲染后的完整HTML并用BeautifulSoup解析
soup = BeautifulSoup(driver.page_source, 'html.parser')
# 现在可以解析动态加载的内容了
total_reviews = soup.find('span', {'data-hook': 'total-review-count'}).text
return f"评论总数: {total_reviews}"
finally:
driver.quit() # 每次用完必须关闭,否则会产生大量僵尸进程
# ... 主程序 ...
if __name__ == '__main__':
dynamic_url = 'https://www.amazon.com/dp/B09G9F4Y96'
result = get_dynamic_content_with_selenium(dynamic_url)
print(result)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70043924/viewspace-3087181/ ,如需转载,请注明出处,否则将追究法律责任。