首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python :尝试使用请求发布表单

Python :尝试使用请求发布表单
EN

Stack Overflow用户
提问于 2013-12-24 19:18:57
回答 3查看 182.1K关注 0票数 54

我正在尝试登录一个网站,使用Python和requests库进行一些抓取,我尝试了以下方法(这不起作用):

代码语言:javascript
复制
import requests
headers = {'User-Agent': 'Mozilla/5.0'}
payload = {'username':'niceusername','password':'123456'}

In [12]: r = requests.post('https://admin.example.com/login.php',headers=headers,data=payload)

但是没有,重定向到登录页面。我需要打开一个会话吗?我做了一个错误的POST请求,我需要加载cookie吗?或者session会自动执行此操作吗?我在这里迷路了,需要一些帮助和解释。

我尝试登录的网站是php,是否需要“捕获set-cookie并设置cookie头”?如果是这样的话,我不知道该怎么做。该网页是一个包含以下内容(如果有帮助)的表单: input :用户名‘’密码‘'id':'myform','action':"login.php

一些额外的信息,也许你可以看到我在这里遗漏了什么。

代码语言:javascript
复制
In [13]: r.headers
Out[13]: CaseInsensitiveDict({'content-encoding': 'gzip', 'transfer-encoding': 'chunked',
 'set-cookie': 'PHPSESSID=v233mnt4malhed55lrpc5bp8o1; path=/',
  'expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 'vary': 'Accept-Encoding', 'server': 'nginx',
   'connection': 'keep-alive', 'pragma': 'no-cache',
    'cache-control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0',
     'date': 'Tue, 24 Dec 2013 10:50:44 GMT', 'content-type': 'text/html'})

In [14]: r.cookies
Out[14]: <<class 'requests.cookies.RequestsCookieJar'>[Cookie(version=0, name='PHPSESSID',
 value='v233mnt4malhed55lrpc5bp8o1', port=None, port_specified=False, domain='admin.example.com',
  domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False,
   expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False)]>

我真的很感谢你的帮助,谢谢!

更新,感谢atupal的回答:

代码语言:javascript
复制
    import requests

headers = {'User-Agent': 'Mozilla/5.0'}
payload = {'username':'usr','pass':'123'}
link    = 'https://admin.example.com/login.php'
session = requests.Session()
resp    = session.get(link,headers=headers)
# did this for first to get the cookies from the page, stored them with next line:
cookies = requests.utils.cookiejar_from_dict(requests.utils.dict_from_cookiejar(session.cookies))
resp    = session.post(link,headers=headers,data=payload,cookies =cookies)
#used firebug to check POST data, password, was actually 'pass', under 'net' in param.  
#and to move forward from here after is:
session.get(link)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-24 19:24:59

您可以使用Session对象

代码语言:javascript
复制
import requests
headers = {'User-Agent': 'Mozilla/5.0'}
payload = {'username':'niceusername','password':'123456'}

session = requests.Session()
session.post('https://admin.example.com/login.php',headers=headers,data=payload)
# the session instance holds the cookie. So use it to get/post later.
# e.g. session.get('https://example.com/profile')
票数 79
EN

Stack Overflow用户

发布于 2019-03-27 18:06:57

发送内容类型为‘form-data’的POST请求:

代码语言:javascript
复制
import requests
files = {
    'username': (None, 'myusername'),
    'password': (None, 'mypassword'),
}
response = requests.post('https://example.com/abc', files=files)
票数 15
EN

Stack Overflow用户

发布于 2019-04-24 20:41:18

我在这里遇到了问题(例如,在上传文件时发送表单数据),直到我使用了以下命令:

代码语言:javascript
复制
files = {'file': (filename, open(filepath, 'rb'), 'text/xml'),
         'Content-Disposition': 'form-data; name="file"; filename="' + filename + '"',
         'Content-Type': 'text/xml'}

这就是最终对我起作用的输入。在Chrome Dev Tools ->网络选项卡中,我点击了我感兴趣的请求。在Headers选项卡中,有一个表单数据部分,其中显示了正在设置的Content-Disposition和Content-Type标头。

我不需要在实际的requests.post()命令中设置头文件才能成功(包括它们实际上导致了失败)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20759981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档