我正在尝试使用Python和Mechanize登录网站,但是,当我试图让POST数据按照我的意愿行事时,我遇到了麻烦.
基本上我想使用mechanize和Python来复制它:
wget --quiet --save-cookies cookiejar --keep-session-cookies --post-data "action=login&login_nick=USERNAME&login_pwd=PASSWORD" -O outfile.htm http://domain.com/index.php
表单如下所示:
=) (readonly)>>
设置适当的值并提交表单不是问题,但是省略了"action = login"-part.
response = self.browser.open(self.url+"/index.php") self.browser.select_form(name="login") self.browser["login_nick"] = self.encoded_username self.browser["login_pwd"] = self.encoded_password self.browser.method = "POST" response = self.browser.open(self.browser.submit()) print (response.read())
现在的问题是,我该如何添加action=login
零件?
编辑:好的,所以我添加了一个名为action的隐藏字段并将值设置为login.使用Wireshark分析TCP流,POST数据确实按照应有的方式构建.然而,似乎机械化正在弄乱我的urlencoding(我已经为网站使用的charset专门编写了值).例如,我的用户名包含Å - 我已将其urlencoded为%C5.但是,当它与机械化一起发送时,它显示为%25C5. 如何通过更改字符串来停止机械化?
编辑:我意识到,在发送机器人之前,我可能不会对我的字符串进行urlencode.案件结案.
无论如何,Mechanize似乎都会对字符串进行urlencode,所以没有必要对抗它.这是最终的解决方案(显然在语法上没有效果,但希望你能得到这个想法).
import mechanize self.browser = mechanize.Browser() self.browser.open(self.url) self.browser.select_form(name="login") self.browser["login_nick"] = self.username self.browser["login_pwd"] = self.password self.browser.new_control("HIDDEN", "action", {}) control = self.browser.form.find_control("action") control.readonly = False self.browser["action"] = "login" self.browser.method = "POST" self.browser.action = self.url response = self.browser.submit()