2026/1/9 3:49:26
网站建设
项目流程
然后做服装网站,wordpress 菜单的主题,建设积分兑换官方网站,正规网站制作公司哪家好一、前置说明#xff08;合规与风险#xff09;
合规性#xff1a;速卖通官方禁止未经授权的爬虫行为#xff0c;抓取数据仅用于技术学习#xff0c;请勿用于商业用途#xff1b;优先推荐使用速卖通开放平台的官方 API#xff08;需申请开发者账号和授权#xff09;。…一、前置说明合规与风险合规性速卖通官方禁止未经授权的爬虫行为抓取数据仅用于技术学习请勿用于商业用途优先推荐使用速卖通开放平台的官方 API需申请开发者账号和授权。反爬应对速卖通有反爬机制IP 封禁、请求频率限制、验证码建议添加请求延迟、使用代理 IP、模拟浏览器 Headers。二、实现思路从商品链接中提取商品 ID速卖通链接格式固定ID 是核心标识模拟浏览器发送 HTTP 请求获取商品页面 HTML解析页面中的 JSON 数据速卖通商品数据以 JSON 形式内嵌在 HTML 中提取核心商品信息标题、价格、销量、SKU、物流等整理并输出数据如 JSON/Excel。三、Python 实现代码1. 依赖库安装bash运行pip install requests parsel jsonpath python-dotenvrequests发送 HTTP 请求parsel解析 HTML/XML比 BeautifulSoup 更高效jsonpath提取 JSON 数据python-dotenv管理环境变量可选用于配置代理。2. 完整代码python运行import re import json import time import requests from parsel import Selector from jsonpath import jsonpath # -------------------------- 配置项 -------------------------- # 模拟浏览器Headers关键避免被识别为爬虫 HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, Accept-Language: en-US,en;q0.9, Referer: https://www.aliexpress.com/, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8 } # 请求延迟秒避免高频请求被封 REQUEST_DELAY 2 # 代理配置可选如需要请替换为自己的代理 PROXIES { # http: http://127.0.0.1:7890, # https: http://127.0.0.1:7890 } # -------------------------- 核心函数 -------------------------- def extract_product_id(url): 从商品链接提取商品ID # 速卖通链接常见格式 # https://www.aliexpress.com/item/1005005808225698.html # https://www.aliexpress.us/item/1005005808225698.html pattern r/item/(\d)\.html match re.search(pattern, url) if match: return match.group(1) else: raise ValueError(无效的速卖通商品链接无法提取商品ID) def get_aliexpress_product_detail(product_id): 抓取商品详情数据 # 构造商品详情页URL统一使用国际版链接 url fhttps://www.aliexpress.com/item/{product_id}.html try: # 发送请求添加延迟 time.sleep(REQUEST_DELAY) response requests.get( urlurl, headersHEADERS, proxiesPROXIES, timeout15, allow_redirectsTrue # 处理重定向 ) response.raise_for_status() # 抛出HTTP错误如404/500 # 解析HTML selector Selector(textresponse.text) # 提取内嵌的商品JSON数据速卖通核心数据在window.runParams中 json_data_str selector.css(script:contains(window.runParams)::text).get() if not json_data_str: raise ValueError(未找到商品核心数据可能被反爬拦截) # 清洗JSON字符串提取有效部分 json_data_str json_data_str.replace(window.runParams , ).rstrip(;) product_data json.loads(json_data_str) # 提取核心信息可根据需求扩展 product_info { 商品ID: product_id, 商品标题: jsonpath(product_data, $.productTitle)[0] if jsonpath(product_data, $.productTitle) else None, 原价: jsonpath(product_data, $.originalPrice)[0] if jsonpath(product_data, $.originalPrice) else None, 售价: jsonpath(product_data, $.salePrice)[0] if jsonpath(product_data, $.salePrice) else None, 货币单位: jsonpath(product_data, $.currencyCode)[0] if jsonpath(product_data, $.currencyCode) else None, 总销量: jsonpath(product_data, $.tradeCount)[0] if jsonpath(product_data, $.tradeCount) else None, 商品评分: jsonpath(product_data, $.productScore)[0] if jsonpath(product_data, $.productScore) else None, 店铺名称: jsonpath(product_data, $.storeName)[0] if jsonpath(product_data, $.storeName) else None, 发货地: jsonpath(product_data, $.shipFrom)[0] if jsonpath(product_data, $.shipFrom) else None, 是否包邮: jsonpath(product_data, $.freeShipping)[0] if jsonpath(product_data, $.freeShipping) else None, 商品主图: jsonpath(product_data, $.imageUrl)[0] if jsonpath(product_data, $.imageUrl) else None } # 提取SKU信息可选 sku_list [] sku_data jsonpath(product_data, $.skuModule.skuInfoList)[0] if jsonpath(product_data, $.skuModule.skuInfoList) else [] for sku in sku_data: sku_info { SKU ID: sku.get(skuId), SKU价格: sku.get(salePrice), SKU库存: sku.get(stock), SKU属性: sku.get(skuAttr) } sku_list.append(sku_info) product_info[SKU列表] sku_list return product_info except requests.exceptions.RequestException as e: return f请求错误{str(e)} except json.JSONDecodeError as e: return fJSON解析错误{str(e)} except Exception as e: return f未知错误{str(e)} # -------------------------- 测试调用 -------------------------- if __name__ __main__: # 测试商品链接替换为自己要抓取的链接 product_url https://www.aliexpress.com/item/1005005808225698.html # 提取商品ID并抓取数据 try: product_id extract_product_id(product_url) print(f提取的商品ID{product_id}) product_detail get_aliexpress_product_detail(product_id) # 格式化输出结果 print(\n商品详情数据) print(json.dumps(product_detail, ensure_asciiFalse, indent4)) except ValueError as e: print(f错误{str(e)})四、关键说明1. 商品 ID 提取速卖通商品链接的核心是/item/[商品ID].html部分通过正则表达式可稳定提取。2. 反爬优化重要Headers 模拟必须配置真实的User-Agent否则会被直接拦截请求延迟REQUEST_DELAY设置 2-5 秒避免高频请求代理 IP如果频繁请求被封 IP需使用代理池如阿布云、快代理等Cookie / 会话保持若遇到验证码可手动登录后复制 Cookie 到 Headers 中。3. 数据解析速卖通商品页面的核心数据存储在window.runParams这个 JS 变量中提取并解析该变量即可获取结构化 JSON 数据无需解析复杂 HTML。4. 扩展功能可选提取商品描述product_data[descriptionModule][description]提取物流信息product_data[shippingModule]保存数据到 Excel使用pandas库将product_info写入 Excel批量抓取循环读取链接列表批量提取数据。五、官方 API 方式推荐合规如果需要长期稳定使用建议接入速卖通开放平台 API注册速卖通开发者账号https://developer.aliexpress.com/创建应用获取App Key和App Secret调用aliexpress.item_get接口需授权示例代码python运行import requests import hashlib import time def aliexpress_api_get(product_id, app_key, app_secret): 官方API调用示例需替换为自己的密钥 timestamp str(int(time.time() * 1000)) # 签名生成参考官方文档 sign_str fapp_key{app_key}formatjsonmethodaliexpress.item.getproduct_id{product_id}timestamp{timestamp}v2.0{app_secret} sign hashlib.md5(sign_str.encode()).hexdigest().upper() # API请求参数 params { method: aliexpress.item.get, app_key: app_key, product_id: product_id, timestamp: timestamp, format: json, v: 2.0, sign: sign } response requests.get(https://gw.api.aliexpress.com/openapi/param2/2/aliexpress.item.get, paramsparams) return response.json()