使用请求登录后获取受限页面,urllib2 python

时间:2014-05-18 09:16:23

标签: python python-2.7 python-requests

我尝试使用python-requests

登录this页面
headers = {
    'content-type': 'application/x-www-form-urlencoded',
    'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/33.0.1750.152 Chrome/33.0.1750.152 Safari/537.36'
}

data = {
    'username':myusername,
    'password':mypassword,
}
r = requests.post(url,data=data,headers=headers)

我尝试通过print r打印返回的回复 输出是<Response [200]>,但是html页面是登录页面,但我期待其他页面的html,我们将在登录后重定向到。

2 个答案:

答案 0 :(得分:4)

登录表单包含几个隐藏字段:

<input type="hidden" name="lt" value="LT-1314930-GPfgUfyUj5eRY4RCaoa1Xi3gi5Jfsf" />
<input type="hidden" name="execution" value="e3s1" />
<input type="hidden" name="_eventId" value="submit" /> 

很可能是第一个,也许是第二个字段是自动生成的并且与会话绑定。您需要先加载登录页面(使用会话),解析这些字段并将其包含在POST中。

您收到200条回复的原因是网站将未经授权的请求重定向回登录页面;检查r.history,该列表中将有一个或多个302响应。

你可以使用BeautifulSoup来解析它,或者使用robobrowser,它结合了requests和BeautifulSoup,以及一个专用的表单处理程序来构建一个类似浏览器的框架来导航网站:

from robobrowser import RoboBrowser

browser = RoboBrowser(history=True,
    user_agent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/33.0.1750.152 Chrome/33.0.1750.152 Safari/537.36')
browser.open('http://selleraccounts.snapdeal.com/')

form = browser.get_form(id='fm1')
form['username'].value = myusername
form['password'].value = mypassword
browser.submit_form(form)

答案 1 :(得分:0)

两件事: 1.仅仅因为您的响应代码为200,登录请求并不意味着它成功了。可能是开发人员出于任何原因没有遵循REST准则,并返回200指示错误的正文。

  1. 当我尝试登录您启用Chrome开发者工具时提供的网站时,我检查了流量,发现网站传输的不仅仅是用户名和密码。具体来说还有其他4个领域:

    username:adb  
    password:asdf    
    lt:LT-1315009-vg7Xm5MTSfBYkGNuaiUbAFZqVZNmoP   
    execution:e2s1   
    _eventId:submit   
    submit:LOGIN
    
  2. 我怀疑其中一些是反CSRF令牌,您可能需要从最初收到的登录页面中删除,但是我不认为登录请求将通过,除非您提供正确的值这些领域中的每一个。