【问题标题】:Multiple POST requests, second request gets a 404 error code多个 POST 请求,第二个请求得到 404 错误代码
【发布时间】:2018-06-19 05:02:44
【问题描述】:

我是 python 新手,并且遇到了与请求 GitHub 上的问题相同的问题。我正在尝试对一个网站进行身份验证,该网站在初始登录后将您重定向到一个安全问题。初始登录和后续页面都使用相同的“操作 URL”,在第二个发布请求中我收到 404,这是我的代码,任何帮助将不胜感激,在 GitHub 上提出问题后,他们说这是一个问题在这里问,因为它不在他们的尽头。 (尽管他们在 GitHub 上对此有疑问):

from bs4 import BeautifulSoup as bs
import requests
import time
sources = ["https://www.dandh.com/v4/view?pageReq=dhMainNS"]
req = requests.Session()


def login():
    authentication_url = "https://www.dandh.com/v4/dh"

    header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; rv:60.0)      Gecko/20100101 Firefox/60.0"}

    payload = {"Login": "12345",
           "PW": "12345",
           "Request": "Login"}

    payload2 = {"securityAnswer": "12345",
            "Request": "postForm"}

    req.post(authentication_url, data=payload, headers=header)

    time.sleep(3)

    req.post(authentication_url, data=payload2, headers=header)

    time.sleep(3)


def print_object(sources):
    for url in sources:
        soup_object = bs(req.get(url).text, "html.parser")
        print(soup_object.get_text())


def main():
    login()
    print_object(sources)

main()

【问题讨论】:

  • 第一个请求有效吗? (通过工作我的意思是它让你登录)
  • 是的,它确实成功通过了第一个登录页面,如果我尝试获取 status.code,第一个给我一个 200,而第二个给我一个 404。两者都有相同的操作html POST 请求中的 url。我还尝试将来自第一个和第二个有效负载的数据一起添加到一个中(因为它们是相同的 url)并且根本没有设法登录。
  • 您收到200 的状态代码这一事实在登录时并没有多大意义,因为它只是告诉您请求已收到并理解并正在处理中。它并没有真正告诉您是否已成功登录或不尝试使用打印请求的 HTML 内容(使用.text)然后您将知道您是否真的登录。让我了解您所看到的最新信息。
  • 是的,如果您查看 print_object 函数,我也在使用该函数来检查 html 的每一步。为了进入带有安全问题的第二页,您必须成功登录到第一页,这就是我每次都结束的地方。我只检查了状态码,看看他们是否都拉了 200,这会告诉我问题可能出在我的凭据或我的代码中的某些东西上(凭据是正确的,当然我可以在浏览器中登录)。但我确实在第二个请求中得到了 404
  • 那太好了,给我秒我会试着写一个答案

标签: python-3.x request python-requests http-status-code-404


【解决方案1】:

第 1 部分

浏览网站后,问题的一部分取决于payload2,您只需向其中添加另一个项目:"formName":"loginChallengeValidation",因此整体payload2应该看起来像这样:

payload2 = {"formName":"loginChallengeValidation","securityAnswer": your_security_answer,
            "Request": "postForm"}

这将阻止您获得状态代码404。希望这会有所帮助。


第 2 部分

尽管这是您问题中的问题,但我怀疑这是否是您真正想要的(因为第 1 部分中的代码会将您重定向到另一个验证表单)。为了访问网站本身,您必须添加以下行:

header2 = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; rv:60.0)      Gecko/20100101 Firefox/60.0", "Referer":"https://www.dandh.com/v4/view?pageReq=LoginChallengeValidation"}

req.post("https://www.dandh.com/v4/view?pageReq=LoginChallengeValidation", headers=header)

所以你的最终代码应该是这样的:

from bs4 import BeautifulSoup as bs
import requests
import time
sources = ["https://www.dandh.com/v4/view?pageReq=dhMainNS"]
req = requests.Session()


def login():
    authentication_url = "https://www.dandh.com/v4/dh"

    header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; rv:60.0)      Gecko/20100101 Firefox/60.0"}
    header2 = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; rv:60.0)      Gecko/20100101 Firefox/60.0", "Referer":"https://www.dandh.com/v4/view?pageReq=LoginChallengeValidation"}

    payload = {"Login": your_username,
           "PW": your_pasword,
           "Request": "Login"}

    payload2 = {"formName":"loginChallengeValidation","securityAnswer": your_security_answer,
            "Request": "postForm", "btContinue": ""}

    req.post(authentication_url, data=payload, headers=header)
    req.post("https://www.dandh.com/v4/view?pageReq=LoginChallengeValidation", headers=header)
    
    time.sleep(3)

    req.post(authentication_url, data=payload2, headers=header2)
    
    time.sleep(3)


def print_object(sources):
    for url in sources:
        soup_object = bs(req.get(url).text, "html.parser")
        print(soup_object.get_text())


def main():
    login()
    print_object(sources)

main()
 

(PS:你应该用你的凭据替换your_usernameyour_passwordyour_security_answer) 另外,我想指出,我认为time.sleep(3) 在代码中没有用处。

真的希望这会有所帮助。

【讨论】:

  • 你太棒了,先生!!!非常感谢帮助!!我不得不问,为什么需要创建单独的头文件?如果 ti 持有相同的数据?
  • 非常欢迎您,如果此答案解决了您的问题,请您点击灰色勾号(靠近我的答案的赞成和反对按钮)
  • 如果还有其他问题,请随时询问:)
  • 我用一个关于 headers 变量的问题编辑了我的评论,我试图对答案投赞成票,但我是新的,它说我没有足够的声誉
  • 无需投票(尽管感谢您的努力)绿色勾号只是向所有人表明问题已解决:)
猜你喜欢
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2022-01-19
  • 2021-01-04
  • 1970-01-01
  • 2014-08-05
  • 2015-11-18
相关资源
最近更新 更多