我正在尝试从登录屏幕后面的网站抓取数据,但是在使用python请求模块中的post()方法发布部分登录信息时遇到了问题。
我已经获取了每个需要填写的HTML输入字段的名称,并将它们与所需的值一起放入字典中,然后将该字典传递给post()方法。
登录页面中的HTML:
<input name="ctl00$ContentPlaceHolder1$TextBox1" type="text" value="" id="ContentPlaceHolder1_TextBox1" tabindex="1" class="form-control " placeholder="username" required="">
<input name="ctl00$ContentPlaceHolder1$TextBox2" type="password" id="ContentPlaceHolder1_TextBox2" tabindex="2" class="form-control" placeholder="password" required="" value="">
然后,使用名称值创建传递给post()的字典
formData = {
"ctl00$ContentPlaceHolder1$TextBox1": "FakeUsername",
"ctl00$ContentPlaceHolder1$TextBox2": "FakePassword"
}
r = session.get(loginUrl) # get cookies necessary for login
r = session.post(loginUrl, data=formData)
这对于用户名字段正常工作,但不会在密码字段中发布密码。如果在发布数据后从登录页面读取HTML,我将得到:
<input name="ctl00$ContentPlaceHolder1$TextBox1" type="text" value="FakeUsername" id="ContentPlaceHolder1_TextBox1" tabindex="1" class="form-control " placeholder="username" required="" />
<input name="ctl00$ContentPlaceHolder1$TextBox2" type="password" id="ContentPlaceHolder1_TextBox2" tabindex="2" class="form-control" placeholder="password" required="" />
不再列出密码输入字段的“值”参数,甚至不作为空参数列出。当然,尝试登录后将不起作用。
我一直无法弄清楚为什么会这样。我已经确保填写任何隐藏的输入字段(EVENTVALIDATION,VIEWSTATE等),并且还要 看着网页标题,但仍然没有运气。
我要登录的网站是: https://panel.forcad.org/Default.aspx
我非常感谢您帮助我们找出问题所在。
答案 0 :(得分:0)
您说您查看了标头,但是您应该能够使用请求标头和cookie复制浏览器的行为。尝试在已知成功的登录名上复制和cookie的确切参数。因此,即使您甚至可以使用请求发送已经想要的数据,也可以缩小范围。如果您无法使用有效的cookie重新登录,则它可能具有一些JS技巧,或者某些东西请求无法做到。在这种情况下,请进行更多逆向工程或尝试使用硒。 pyvirtualdisplay可以隐藏浏览器并可以使用JS来停止页面的加载(
)