V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
vishell
V2EX  ›  Python

如何通过 requests 向服务器端提供支持 json 的信息?

  •  
  •   vishell · 2020-06-29 20:37:28 +08:00 · 2400 次点击
    这是一个创建于 1616 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 requests 获取一个 json 格式的数据,之前请求后都可以正常返回 json 字符串;今天突然出错返回 406,意思是服务器判断客户端不支持 json? 406 - Client browser does not accept the MIME type of the requested page The page you are looking for cannot be opened by your browser because it has a file name extension that your browser does not accept

    用 chrome 的 F12 看,请求的链接 Response 返回 json 数据正常

    想问下如何通过 requests 向服务器端提供支持 json 的信息?

    13 条回复    2020-07-03 16:04:29 +08:00
    chenqh
        1
    chenqh  
       2020-06-29 20:47:10 +08:00
    body 是 json?

    ```python
    requests.post(url, json=字典)
    ```

    这个样子就可以了
    vishell
        2
    vishell  
    OP
       2020-06-29 21:01:06 +08:00
    @chenqh 你说的发送 json 格式?我的意思是目前服务器端判断到我的客户端就是 requests 不支持 json 了,就返回 406 了
    估计是真正的浏览器 chrome 和服务器端还有别的交互信息,让服务器知道 chrome 支持 json 数据?
    Pagliacii
        3
    Pagliacii  
       2020-06-29 21:10:26 +08:00
    这样?

    ```python
    requests.post(url, data=data, headers={'content-type': 'application/json'})
    ```
    Pagliacii
        4
    Pagliacii  
       2020-06-29 21:15:02 +08:00
    啊,写错了,应该是 headers={'accept': 'application/json'} 才对
    arischow
        5
    arischow  
       2020-06-29 21:17:31 +08:00
    User Agent
    arischow
        6
    arischow  
       2020-06-29 21:18:21 +08:00
    要么你就把 Chrome 的 request header 都拿下来放到你的 requests 请求里,再逐项检查排除
    vishell
        7
    vishell  
    OP
       2020-06-29 21:25:38 +08:00
    @Pagliacii @arischow 请求的 header,我是照抄 chromeF12 里面的内容写的,除了没放 cookie,Content-Type: application/x-www-form-urlencoded; charset=UTF-8 。提交的数据是 Form Data 格式.
    '''
    headers = {
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'X-Requested-With': 'XMLHttpRequest',
    'Referer': referer,
    'Host': 'X.X.X'
    }'''

    现在的问题是请求返回的是一个 json 格式的数据,之前可以正常接收,今天返回 406,response.text 里面提示我用 requests 伪装的客户端不支持 json 格式,需要补充什么信息给服务器端才能让服务器端认为客户端支持 json ?
    Pagliacii
        8
    Pagliacii  
       2020-06-29 21:44:52 +08:00
    @vishell 你可以把 Accept-Language 这一项去掉试试看。

    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/406
    vishell
        9
    vishell  
    OP
       2020-06-29 22:06:15 +08:00
    好的,我待会一起把 cookie 也加进去试试看
    benjix
        10
    benjix  
       2020-06-29 22:19:13 +08:00 via Android
    import json
    requests.post(url, data=json.dumps(data))
    vishell
        11
    vishell  
    OP
       2020-06-30 09:43:38 +08:00
    今天用原先脚本试了下又正常了,应该是网站的问题,我也被网站返回的信息给干扰了。
    另外理论上来说,浏览器的能力就是 User-Agent,资源的 MIME 类型就是 Content-Type 这两个字段来体现的。
    谢谢大家帮忙。
    arischow
        12
    arischow  
       2020-06-30 19:47:35 +08:00 via iPhone
    @vishell 有可能是短时间内频繁调用,导致 cookie / IP 被跳转到这个错误。以前我爬支付宝碰到过,不过我爬虫经验非常浅。
    vishell
        13
    vishell  
    OP
       2020-07-03 16:04:29 +08:00
    有可能,这两天时好时坏的,每次用 chrome 都没问题的,看来还是伪装的不够好:)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6164 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 02:22 · PVG 10:22 · LAX 18:22 · JFK 21:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.