在实际数据采集实践中,许多目标网站(例如 Amazon)都会采用 Cloudflare 等防护措施,防止机器人和非正常流量。本文将分享一个故障场景下的排查与改进方案,讲述如何利用无头浏览器、请求签名技术以及爬虫代理 IP来实现数据采集。
本文结构如下:
Cloudflare 防护主要依赖以下几方面来辨识是否为正常用户请求:
传统的 HTTP 请求难以满足上述条件,因此本文引入了无头浏览器技术。通过 Selenium 模拟完整的浏览器行为,可以获取到 Cloudflare 设置的 Cookie,再结合自定义的请求签名算法(例如 MD5 散列计算),将签名附加到请求中,从而绕过防护。同时,采用爬虫代理技术,利用代理 IP、用户名和密码等信息,确保请求来源的多样性,进一步降低被限制的风险。
在当前方案基础上,为提高系统的稳定性和扩展性,建议从以下几个方面进行架构改进:
下面给出一个基于 Selenium 的无头浏览器示例代码,展示如何设置代理、Cookie、User-Agent,并生成请求签名以采集 Amazon 商品信息。代码中引用了爬虫代理的域名、端口、用户名和密码(请根据实际情况替换)。
import time
import hashlib
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
def generate_signature(url, cookies):
"""
模拟生成请求签名的逻辑
这里简单地将 URL 与所有 cookie 拼接后计算 MD5 值,实际中可能需要更复杂的算法
"""
raw = url + ''.join([cookie['name'] + cookie['value'] for cookie in cookies])
return hashlib.md5(raw.encode('utf-8')).hexdigest()
def scrape_amazon_product(product_url):
# 设置 Chrome 无头浏览器选项
chrome_options = Options()
chrome_options.add_argument("--headless") # 开启无头模式
# 设置代理 IP,参考亿牛云爬虫代理的配置
proxy_host = "proxy.16yun.cn" # 代理服务器域名
proxy_port = "8080" # 代理端口
proxy_user = "16YUN" # 代理用户名
proxy_pass = "16IP" # 代理密码
# 如果代理需要认证,则需要构造代理认证字符串,此处为简单示例
proxy = f"{proxy_host}:{proxy_port}"
chrome_options.add_argument(f'--proxy-server=http://{proxy}')
# 设置 User-Agent 模拟真实浏览器
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
chrome_options.add_argument(f'user-agent={user_agent}')
# 初始化 webdriver(确保已安装对应的 chromedriver 并配置到环境变量中)
driver = webdriver.Chrome(options=chrome_options)
try:
# 访问目标页面(Amazon 商品页面)
driver.get(product_url)
# 等待页面加载及 Cloudflare 防护检测通过(根据实际情况调整等待时间)
time.sleep(5)
# 获取页面 Cookie,用于生成请求签名
cookies = driver.get_cookies()
signature = generate_signature(product_url, cookies)
print("生成的请求签名:", signature)
# 提取商品信息(标题、价格、评价等)
# 商品标题
product_title = driver.find_element(By.ID, "productTitle").text if driver.find_elements(By.ID, "productTitle") else "无商品标题"
# 商品价格(价格可能位于不同的元素中,此处仅为示例)
try:
product_price = driver.find_element(By.ID, "priceblock_ourprice").text
except Exception as e:
product_price = "价格信息获取失败"
# 商品评价(同样,评价信息的获取可能因页面结构不同而变化)
try:
product_review = driver.find_element(By.ID, "acrCustomerReviewText").text
except Exception as e:
product_review = "评价信息获取失败"
print("商品标题:", product_title)
print("商品价格:", product_price)
print("商品评价:", product_review)
finally:
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
# 示例目标商品链接(请替换为实际存在的商品链接)
target_url = "https://www.amazon.com/dp/B08N5WRWNW"
scrape_amazon_product(target_url)
chrome_options.add_argument("--headless")
启用无头模式,以便在后台静默运行浏览器。在面对 Cloudflare 防护和复杂网站反爬机制时,单一的 HTTP 请求方案往往难以奏效。通过引入无头浏览器,可以完整模拟真实用户的浏览行为;结合请求签名技术,进一步通过 Cookie 与请求参数的加密验证,实现了对防护机制的绕过。同时,采用爬虫代理 IP确保了请求的分散性与稳定性。
未来,通过无头浏览器集群化、代理池管理及签名算法优化,可以不断提升数据采集的效率与成功率,为故障排查及架构改进提供更加成熟的解决方案。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。