如何模拟这个表单post信息?

目标页面
https://www.alphavantage.co/s...

我的模拟代码

import urllib.request
import urllib.parse 
url = 'https://www.alphavantage.co/support/#api-key'
values = {'first':'xx','last': 'voidking','occupation': 'investor','email':'xyz@qq.com'}
data = urllib.parse.urlencode(values).encode(encoding='utf-8',errors='ignore')
headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0' }
request = urllib.request.Request(url=url, data=data,headers=headers,method='POST')
x=urllib.request.urlopen(request)

raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

请问,如何成功模拟post表单数据,并获得返回的响应呢?

阅读 5.2k
3 个回答

大概有几种情况

  1. 需要登陆
  2. 没有使用API的权限,需要使用Token

被403拒了,肯定是缺少某个关键参数/header。一般网站可能还有host、referer等header校验,django默认会有csrf校验。
你先用web页面提交,看一下传了些什么参数,有哪些请求header。
看了下你这个网站,正好就是有csrf校验,所以,你得想办法先拿到csrfmiddlewaretoken

关键提交的headers必须要有Referer和X-CSRFToken


import requests

url = 'https://www.alphavantage.co/support/#api-key'

session = requests.Session()
r = session.get(url)

session.headers.update({
    'Referer': url,
    'X-CSRFToken': r.cookies['csrftoken'],
})

data = {
    'first_text': '111',
    'last_text': '222',
    'occupation_text': 'Investor',
    'email_text': '333@qq.com'
}

r = session.post(url, data=data)
print r.status_code
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题