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请求京东商品搜索页返回登录页面问题如何解决

10 回复

你自己看看一个页面有多少报文头,爬虫是这么好做的?


遇到requests请求京东搜索页返回登录页面,这通常是触发了京东的反爬机制。京东会通过Cookie、请求头、IP频率等多种手段验证请求来源。

核心解决方案是模拟浏览器请求,主要关注以下几点:

  1. 完整的请求头:必须包含User-Agent,建议加上Referer等常见头
  2. 处理Cookie:使用Session对象保持会话,首次访问获取Cookie
  3. 参数构造:搜索关键词需要正确编码
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 啊~不然京东的兄弟多没面子

加 header 最近刚写完京东爬虫,搜索请求似乎是不会封你的

谢谢楼上几位兄弟,爬虫新手,请见谅,正确设置 header 后 get 到了信息。
昨天自己设置了 header 了也没有爬出来以为是别的限制问题呢,看来是 header 没设置对,
特别感谢 分享的这个转换 tool,收藏了,很好用。

如果要模拟自动下单的请求,好做吗?

模拟下单没做过只爬数据

回到顶部