淘宝已购宝贝Python接口爬取问题:携带日期参数和cookie却跳到登录页,如何解决?
问题描述
在使用Python爬取淘宝已购宝贝数据时,尽管已经携带了日期参数和有效的cookie,但请求仍然被重定向到登录页面。这是一个常见的反爬虫机制触发问题。
问题分析
淘宝的反爬虫系统会检测多种异常行为,包括但不限于:
请求频率过高
User-Agent异常
缺少必要的请求头
cookie不完整或过期
JavaScript渲染的内容未加载
IP地址被限制
解决方案
方案一:完善请求头信息
确保请求头包含所有必要的字段,模拟真实浏览器行为:
import requests
headers = {
'accept': 'application/json, text/plain, */*',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
'cache-control': 'no-cache',
'pragma': 'no-cache',
'referer': 'https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm',
'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'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',
'x-requested-with': 'XMLHttpRequest'
}
# 你的cookie
cookies = {
'cookie2': '你的cookie2值',
'_tb_token_': '你的_tb_token_值',
# 其他必要的cookie...
}
params = {
'dateBegin': '2023-01-01',
'dateEnd': '2023-12-31',
'_input_charset': 'utf-8'
}
response = requests.get(
'https://buyertrade.taobao.com/trade/itemlist/asyncBought.htm',
headers=headers,
cookies=cookies,
params=params
)方案二:使用Session保持会话
使用requests.Session()来自动处理cookie和会话保持:
import requests
session = requests.Session()
# 设置公共请求头
session.headers.update({
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'accept': 'application/json, text/plain, */*',
'referer': 'https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm'
})
# 先访问主页获取初始cookie
session.get('https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm')
# 然后带参数请求数据
params = {
'dateBegin': '2023-01-01',
'dateEnd': '2023-12-31'
}
response = session.get(
'https://buyertrade.taobao.com/trade/itemlist/asyncBought.htm',
params=params
)方案三:处理JavaScript渲染
淘宝部分页面内容由JavaScript动态渲染,需要使用Selenium等工具:
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
import time
driver = webdriver.Chrome()
driver.get('https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm')
# 等待页面加载完成
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'js-list-content')))
# 设置日期范围
# 这里需要根据实际页面元素进行操作
date_begin_input = driver.find_element(By.NAME, 'dateBegin')
date_end_input = driver.find_element(By.NAME, 'dateEnd')
date_begin_input.clear()
date_begin_input.send_keys('2023-01-01')
date_end_input.clear()
date_end_input.send_keys('2023-12-31')
# 提交查询
submit_button = driver.find_element(By.CLASS_NAME, 'btn-query')
submit_button.click()
# 等待结果加载
time.sleep(3)
# 获取页面内容
page_source = driver.page_source
print(page_source)
driver.quit()方案四:使用API逆向工程
通过浏览器开发者工具分析真实的API请求:
打开Chrome开发者工具,进入Network面板
手动操作淘宝已购宝贝页面,筛选XHR请求
找到返回数据的API接口,复制其curl命令
使用curlconverter等工具转换为Python代码
方案五:处理验证码和反爬机制
如果遇到验证码,可以考虑以下方法:
使用打码平台
降低请求频率
更换IP地址
使用代理池
注意事项
遵守robots.txt:检查淘宝的robots.txt文件,确保你的爬虫行为符合规定
控制请求频率:避免过于频繁的请求,建议添加随机延时
cookie时效性:淘宝cookie有时效性,需要定期更新
法律合规:确保你的爬虫行为不违反相关法律法规和网站服务条款
调试技巧
打印完整的请求头和响应内容,便于分析问题
使用代理工具查看实际发送的请求
对比浏览器正常请求和脚本请求的差异
逐步添加请求头字段,定位缺失的关键字段
通过以上方法的组合使用,通常可以解决淘宝已购宝贝接口的爬取问题。建议从完善请求头开始,逐步尝试其他方法。