Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 多个POST请求,第二个请求获取404错误代码_Python 3.x_Request_Python Requests_Http Status Code 404 - Fatal编程技术网

Python 3.x 多个POST请求,第二个请求获取404错误代码

Python 3.x 多个POST请求,第二个请求获取404错误代码,python-3.x,request,python-requests,http-status-code-404,Python 3.x,Request,Python Requests,Http Status Code 404,我是python新手,遇到了与GitHub上的问题相同的问题。我正在尝试对一个网站进行身份验证,该网站会在初次登录后将您重定向到一个安全问题。初始登录和后续页面都使用相同的“action URL”,在第二次发布请求时,我收到了404,这是我的代码,任何帮助都将不胜感激,在GitHub上提问后,他们说这是一个问题,因为这不是他们的目的。(尽管他们在GitHub上对此有异议): 第一部分 在浏览网站之后,问题的一个糟糕部分取决于payload2,您只需向其中添加另一项:“formName”:“log

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

第一部分 在浏览网站之后,问题的一个糟糕部分取决于
payload2
,您只需向其中添加另一项:
“formName”:“loginChallengeValidation”
,因此总体上
payload2
应该如下所示:

payload2 = {"formName":"loginChallengeValidation","securityAnswer": your_security_answer,
            "Request": "postForm"}
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()
 
这将阻止您获取状态代码
404
。希望这有帮助


第二部分 尽管这是您问题中的问题,但我怀疑这是您真正想要的(因为第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"}

因此,您的最终代码应该如下所示:

payload2 = {"formName":"loginChallengeValidation","securityAnswer": your_security_answer,
            "Request": "postForm"}
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()
 
(注意:您应该用您的凭证替换
您的\u用户名
您的\u密码
您的\u安全性\u答案
) 另外,我想指出的是,我不认为
time.sleep(3)
在代码中是有用的


真希望这有帮助。

第一个请求有效吗?(我所说的工作是指它是否让你登录)是的,它确实成功地通过了第一个登录页面,如果我尝试获取status.code,第一个给我200,第二个给我404。两者在html POST请求中具有相同的操作url。我还尝试将第一个和第二个有效负载中的数据一起添加到一个有效负载中(因为它们位于同一个url)您收到的状态代码为
200
这一事实在登录时并不意味着什么,因为它只是告诉您已收到并理解请求,并且正在处理请求。它不会真正告诉您是否已成功登录或未尝试使用打印请求的HTML内容(使用
.text
),然后您将知道是否已真正登录。让我随时了解您所看到的内容。是的,如果您查看print_object函数,我也在使用该函数检查html的每一步。为了进入第二页的安全问题,你必须成功登录到第一页,这是我每次结束的地方。我只检查了状态代码,看看他们是否都使用了200,这会告诉我问题可能是我的凭据或代码中的某些内容(凭据是正确的,当然我可以在浏览器中登录)。但是我在第二次请求中得到了404,那太好了,给我一点时间,我会试着写一个答案你太棒了,先生!!!非常感谢你的帮助!!我不得不问,为什么需要创建单独的headers文件?如果ti持有相同的数据?如果此答案解决了您的问题,您非常欢迎。请单击灰色勾号(在我的答案的“向上投票”和“向下投票”按钮附近),如果还有其他问题,请随意提问:)我编辑了我的评论,并提出了一个关于headers变量的问题,我正试图提高投票率,但由于我是新来的,它说我没有足够的声誉,不需要提高投票率(尽管感谢大家的努力)。绿色的勾号只是向大家表明问题已经解决:)