Python中requests请求京东商品搜索页返回登录页面问题如何解决
打算爬一下京东搜索页面的商品列表信息,却发现返回的是个重定向登录页面? 请问这是怎么回事?不登录用 chrome 是可以看到正常商品列表信息的。 代码 demo 如下:
>>> import requests
>>> url = 'https://search.jd.com/Search?keyword=9787208151550'
>>> html_data = requests.get(url).text
>>> html_data
"<script>window.location.href='https://passport.jd.com/uc/login'</script>"
Python中requests请求京东商品搜索页返回登录页面问题如何解决
你自己看看一个页面有多少报文头,爬虫是这么好做的?
遇到requests请求京东搜索页返回登录页面,这通常是触发了京东的反爬机制。京东会通过Cookie、请求头、IP频率等多种手段验证请求来源。
核心解决方案是模拟浏览器请求,主要关注以下几点:
- 完整的请求头:必须包含
User-Agent,建议加上Referer等常见头 - 处理Cookie:使用Session对象保持会话,首次访问获取Cookie
- 参数构造:搜索关键词需要正确编码
import requests
from urllib.parse import quote
def search_jd(keyword):
# 使用Session保持会话
session = requests.Session()
# 先访问首页获取初始Cookie
home_url = "https://www.jd.com"
session.get(home_url)
# 构造搜索URL
encoded_keyword = quote(keyword)
search_url = f"https://search.jd.com/Search?keyword={encoded_keyword}"
# 完整请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'Referer': 'https://www.jd.com/',
}
try:
response = session.get(search_url, headers=headers, timeout=10)
response.raise_for_status()
# 检查是否返回登录页
if "login" in response.url:
print("仍然被重定向到登录页")
return None
# 检查页面内容
if len(response.text) < 10000: # 正常搜索页内容较多
print("可能返回了验证页面")
return None
return response.text
except requests.RequestException as e:
print(f"请求失败: {e}")
return None
# 使用示例
if __name__ == "__main__":
result = search_jd("手机")
if result:
print("成功获取页面,长度:", len(result))
如果这个基础方案仍然被重定向,说明京东对你的IP或请求特征进行了更严格的验证。这时候可能需要:
- 添加更多请求头字段
- 控制请求频率
- 使用代理IP
简单说就是模拟浏览器行为越真实,成功率越高。
get 函数中设置一下 headers 报头吧。你好歹也装一下意思意思自己是个用户而不是爬虫呀
不会编 headers 可以先 f12,找到第一个请求右键复制成 cURL,然后去 curl.trillworks.com 转换成 python 或者别的语言。
京东搜索页我记得挺松的,只需要 headers 就可以了,cookie 可以不用,下面的 params 只保留关键词就行。
以下是搜 “1000x” 复制来的例子,cookie 我已经删了
import requests
headers = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0’,
‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8’,
‘Accept-Language’: ‘en-US,en;q=0.8,zh-CN;q=0.5,zh;q=0.3’,
‘Referer’: ‘https://www.jd.com/’,
‘DNT’: ‘1’,
‘Connection’: ‘keep-alive’,
‘Upgrade-Insecure-Requests’: ‘1’,
‘TE’: ‘Trailers’,
}
params = (
(‘keyword’, ‘1000x’),
(‘enc’, ‘utf-8’),
(‘wq’, ‘1000x’),
(‘pvid’, ‘70b2126fcf3246ce9f32710d41799ede’),
)
response = requests.get(‘https://search.jd.com/Search’, headers=headers, params=params)
😂😂你好歹加个 headers 啊~不然京东的兄弟多没面子
joke
加 header 最近刚写完京东爬虫,搜索请求似乎是不会封你的
谢谢楼上几位兄弟,爬虫新手,请见谅,正确设置 header 后 get 到了信息。
昨天自己设置了 header 了也没有爬出来以为是别的限制问题呢,看来是 header 没设置对,
特别感谢 分享的这个转换 tool,收藏了,很好用。
如果要模拟自动下单的请求,好做吗?
模拟下单没做过只爬数据

