2014-10-22 105 views
0

我读到RHE请求lib和尝试登录到这个网站:这段代码www.hvr.co.il:试图与蟒蛇请求网站登录,参数丢失

import requests 
with requests.Session() as c: 
    url = 'https://www.hvr.co.il' 
    MY_TZ= 'XXX' 
    MY_PASS='XXX' 
    c.get(url) 
    login_data = dict(tz=MY_TZ, password=MY_PASS) 
    c.post(url, data=login_data, headers={"Referer":"http://www.hvr.co.il"}) 
    page = c.get('http://www.hvr.co.il/cart.aspx') 

我可以看到有另一个patameter,名称CN,但它是一个随机值,我不能预测.. 任何想法如何通过它?

+0

我读快速并提交我的回答之前阅读只是你的代码。每次页面加载时,隐藏的name =“cn”的输入元素可能会随机生成,您无法预测它。这才是重点!我想这是一种CSRF保护。否则,如果该页面提供某种API,则应按照以下答案进行操作。这是使用'requests'提供用户名和密码的方式。 – cezar 2014-10-22 12:14:40

+0

我以为这个东西有这个参数..但我还是不明白,我该如何通过它? – SomeNiceGuy21 2014-10-22 12:24:20

+0

您无法通过发送带有请求的表单来传递它。你不知道它的价值,你无法猜测或预测它。这就是它在那里的存在点。它应该保护页面并只允许在页面上发送表单。 – cezar 2014-10-22 12:30:06

回答

-1

您试图将数据作为字典传递到日志中,但您应该使用requests中的认证类。尝试是这样的:

# after import requests 
from requests.auth import HTTPBasicAuth 

# your code 
login_data = HTTPBasicAuth(MY_TZ, MY_PASS) 
c.post(url, auth=login_data, headers={"Referer":"http://www.hvr.co.il"}) 
# your code 

我假设您尝试访问的网页使用基本身份验证。最终你需要导入另一个认证类。

编辑:

在上面的代码中有一个错误。这里是更正:

c.get(url, auth=login_data, headers={"Referer":"http://www.hvr.co.il"}) 

发送表单需要发布。在我们的例子中,我们通过请求认证类来提供凭证,所以请求方法应该被获取。

+0

仍然无法正常工作..我错过了什么? – SomeNiceGuy21 2014-10-22 12:16:12

+0

很难猜测。我从这里看不到它:) – cezar 2014-10-22 12:17:58

+0

任何想法我还能做什么?我试着用机械化,但仍然没有好.. – SomeNiceGuy21 2014-10-22 12:21:06

0

您不需要预测cn的值 - 当您执行初始GET时,它会提供给您。您需要解析返回的HTML表单以获取值cn(以及任何其他具有动态值的隐藏字段(如果有)。然后,当您尝试登录时,您需要将相同的值发回。

你可以使用BeautifulSoup解析HTML:

import requests 
from bs4 import BeautifulSoup 

s = requests.session() 
r = s.get('https://www.hvr.co.il') 
soup = BeautifulSoup(r.content) 

data = {t['name']:t.get('value') for t in soup.find_all('input', attrs={'type': 'hidden'})} 
data.update({'tz': MY_TZ, 'password': MY_PASS}) 

r = s.post('https://www.hvr.co.il/signin.aspx', data=data) 

或者,你可能会发现它更容易使用mechanize

import mechanize 
br = mechanize.Browser() 
r = br.open('https://www.hvr.co.il') 
br.form = list(br.forms())[0] # select the first form 
br.form['tz'] = MY_TZ 
br.form['password'] = MY_PASS 
r = br.submit() 
# you should now be logged in if your credentials are right 
+0

这一行:'r = s.get('https://www.hvr.co.il')'将返回'。 – cezar 2014-10-22 13:33:16

+0

实际上我得到200,但在行汤= BeautifulSoup(r.content)我得到:TypeError:'模块'对象不可调用 – SomeNiceGuy21 2014-10-22 14:53:36

+0

@cezar:奇怪,我总是得到响应代码200.也许有一些间歇性问题与远程服务器。 – mhawke 2014-10-22 15:00:23