使用Python

时间:2018-01-10 10:38:44

标签: python python-3.x web-scraping python-requests

我想登录网站,但我无法管理。我对网络搜索完全不熟悉,因此我遇到了困难。

我已经阅读了很多关于此的帖子和教程,并尝试了不同的选项。我猜这个问题是特定于网站的,我无法找到传递给post方法的正确密钥。 我可以使用我的网页浏览器正常登录页面。虽然我不能使用这个脚本。

import requests
from lxml import html

session_requests = requests.session()

login_url = "https://app.foodcoops.at/fruchtgenuss/login"
headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
           'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

result = session_requests.get(login_url)
tree = html.fromstring(result.text)
hidden_inputs = tree.xpath(r'//form//input[@type="hidden"]')

form = {x.attrib["name"]: x.attrib["value"] for x in hidden_inputs}
form["nick"] = "<username>"
form["password"] = "<password>"
form["commit"] = "Anmelden"

result = session_requests.post(
    login_url, 
    data = form,
   headers = headers
)

以下是我post请求后的错误:

  

Response [404]

我做错了什么?请建议

3 个答案:

答案 0 :(得分:1)

可以返回

404不公开信息,或者只是该页面不存在。所以很难说出发生了什么。

好的一点是它们是开源的。请在本地设置他们的系统 - 从github,并跟踪问题服务器端。

答案 1 :(得分:1)

我解决了这个问题: 感谢Heikki的帖子,我解决了部分问题: 必须从authenticity_token网址中检索https://app.foodcoops.at/fruchtgenuss/login。 但凭据必须发布到https://app.foodcoops.at/fruchtgenuss/session。这就成了伎俩。 非常感谢您的所有答案。 下面的代码工作:

import requests
from lxml import html

session_requests = requests.session()
# url to retrieve the authentication_token 
login_url = "https://app.foodcoops.at/fruchtgenuss/login"
# url to post the credentials
session_url = "https://app.foodcoops.at/fruchtgenuss/sessions"
headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
           'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

result = session_requests.get(login_url)
tree = html.fromstring(result.text)
hidden_inputs = tree.xpath(r'//form//input[@type="hidden"]')

form = {x.attrib["name"]: x.attrib["value"] for x in hidden_inputs}
form["nick"] = "<username>"
form["password"] = "<password>"
form["commit"] = "Login"

result = session_requests.post(
    session_url, 
    data = form,
   headers = headers
)

答案 2 :(得分:0)

如果您查看登录页面中的html,您会看到服务器希望您将凭据发布到/ fruchtgenuss / sessions

<form class="form-horizontal" action="/fruchtgenuss/sessions" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="bgn5GP0XBCraMSxjaYfrq8wTeTMIlSiYdcc4hJhAJFr25B6Jaynezd+IgMX0OgjR4SlMqXWD8G87RyE/+AglPA==" />
<div class="control-group">
  <label class="control-label" for="nick">
    User
  </label>
  <div class="controls">
    <input type="text" name="nick" id="nick" autocapitalize="off" autocorrect="off" />
  </div>
</div>