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
wkx556874
V2EX  ›  Python

求教一个 Python 关于 form-data 的数据怎么通过 requests.post 上传

  •  
  •   wkx556874 · 2021-03-28 15:35:10 +08:00 · 2756 次点击
    这是一个创建于 1335 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想写一个爬虫自动提交修改某平台的人员信息,
    所有信息都搞懂了,但是有一项是照片。
    其他例如手机号那些数据直接在 data 字典里面声明 data={"mobile":"13000000000"}就行,
    这是抓包抓到的数据:
    Content-Disposition: form-data; name="mobile"
    Content-Length: 11 13000000000
    然后直接 session.post(url, data=data) 就直接修改了,
    但是照片应该怎么弄呢?
    这是抓包抓到的数据:
    Content-Disposition: form-data; name="photo"; filename="pic_after_crop_20210328145606.jpg"
    Content-Type: multipart/mixed; boundary=BbC04y
    Content-Length: 205722 <file>
    我这样写,修改没用。。
    files = {"file": ("1.png", open("1.png", "rb"), "image/png")}
    data={"photo": "1.png"}
    session.post(url, data=data, files=files)
    应该怎么写呢?我查了很多文档也没找到。。
    只好来问问大佬们。
    10 条回复    2021-03-29 15:39:44 +08:00
    wkx556874
        1
    wkx556874  
    OP
       2021-03-28 15:38:06 +08:00
    搞不懂呀。。。
    ch2
        2
    ch2  
       2021-03-28 15:55:51 +08:00 via iPhone
    requests 也不是什么形式的请求都能很简单就发出去的。http 本质上是个字符串构造协议,你自己拼接一个 body,然后 requests.post(url,data=body)就行了,然后搞个 fiddler web debugger 看看报文构造的对不对
    676529483
        3
    676529483  
       2021-03-28 16:16:37 +08:00
    >>> url = 'https://httpbin.org/post'
    >>> files = {'file': ("1.png", open('1.png', 'rb')), "photo": "1.png"}

    >>> r = requests.post(url, files=files)
    关键是 data 和 files 不要一起传,会默认 content-type 为 www-url-encode
    SenLief
        4
    SenLief  
       2021-03-28 17:14:55 +08:00
    官网有 https://www.osgeo.cn/requests/user/quickstart.html#more-complicated-post-requests
    小文件可以用楼上 3 楼的 files 参数,
    大文件需要一个一个包 requests-toolbelt
    renmu123
        5
    renmu123  
       2021-03-28 17:52:38 +08:00 via Android
    直接 post 文件,或者用 file 参数,但是你可能要手动修改 contetn-type 参数
    cra2y4ngel
        6
    cra2y4ngel  
       2021-03-29 09:39:40 +08:00
    requests 在提 multi-part/form-data 上面是有些许缺陷的, 可以通过这样的方式传 data 看看

    data = {"photo": "1.png"}

    files = {
    "file": ("1.png", open("1.png", "rb"), "image/png"),
    "data":(None, json.dumps(data))
    }

    requests.post(url=url, file=files)
    daxin945
        7
    daxin945  
       2021-03-29 10:06:27 +08:00
    你可以用 postman 尝试发起请求,操作成功后能直接导出代码
    k1z
        8
    k1z  
       2021-03-29 11:11:34 +08:00
    no1xsyzy
        10
    no1xsyzy  
       2021-03-29 15:39:44 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2721 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:39 · PVG 20:39 · LAX 04:39 · JFK 07:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.