好的,这是我在StackOverflow上的第一篇文章,所以请放轻松。我真的坚持使用 Python 脚本。我在网上看了一遍,找不到解决办法!
所以我使用mechanize登录网站(例如: http://www.foobar.com/ )
要登录的表单的HTML:
form id="loginForm" method="post" action="/z/0.123/?cmd=login-post" onsubmit="return someSubmitfunction();"
该网站的登录表单如下所示:
<HiddenControl(__FOO=someLongString) (readonly)>
<TextControl(emailAddress=)>
<PasswordControl(password=)>
<CheckboxControl(persist=[*on])>
我可以登录网站并重定向到内部链接(详见代码)。
以下是登录的代码... 注意:请求方法是POST
import urllib, urllib2
import cookielib
import mechanize
# Note this is the FORM, but missing the HIDDEN value, LOOK lower in code
EmailAddress = 'someusername'
Password = 'somepassword'
Persist = ['on',]
browser = mechanize.Browser()
# Enable cookie support
cookiejar = cookielib.LWPCookieJar()
browser.set_cookiejar( cookiejar )
# Browser options
browser.set_handle_equiv( True )
browser.set_handle_redirect( True )
browser.set_handle_referer( True )
browser.set_handle_robots( False )
# Pretend that I am a browser
browser.set_handle_refresh( mechanize._http.HTTPRefreshProcessor(), max_time = 1 )
browser.addheaders = [ ( 'User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1' ) ]
# Open webpage & add form fields
browser.open('http://www.foobar.com/')
browser.select_form(nr = 0) #select the ONLY form (Login form)
browser.form['emailAddress'] = EmailAddress
browser.form['password'] = Password
browser.form['persist'] = Persist
# Submit for FORM is an action, find it and redirect to internal page
# Create new control & submit to internal page
browser.new_control("HIDDEN", "action", {})
control = browser.form.find_control("action")
control.readonly = False
browser["action"] = "/z/0.123/?cmd=login-post"
browser.method = "post"
browser.action = 'http://www.foobar.com/user/summary/'
browser.submit()
好的,到目前为止,我很好。我已成功登录并被重定向到 http://www.foobar.com/user/summary/ ,就像我想要的那样。
url = browser.open('http://www.foobar.com/user/summary/')
print url.read() # - see content of url HTML ### THIS WORKS ###
现在我使用BeautifulSoup()来解析/ user / summary /的HTML并成功抓取此页面上的另一个表单。此表单没有像登录表单那样的操作,但这就是它的外观......
我需要从这里帮助...我无法将文本(myInput)输入表单并提交!
来自... / user / summary /的表格的HTML:
form method="post" id="foobar" name="foobar">
这是表单的提交按钮:
onkeypress="return submitFormKey(event, '','foobar', 'foobar', 'pcm');">
img src="someuglyimage.jpg" class="submit" id="btn_Submit" onclick="submitForm('foobar', 'foobar', 'pcm');" alt="Foo"
这是实际形式:(此页面上的唯一表格,再次!)
<HiddenControl(hdnCmd=foobar) (readonly)>
<TextControl(inputvalue=)>
我尝试了很多提交方法。我尝试使用Selenium,Splinter,urlib(1&amp; 2),甚至是JSON,javascript,iframe,嵌入等等。我很生气,帮助PLZ!
我认为这会有效,我尝试使用和不使用隐藏控制:
browser.select_form(nr = 0) #select the 1st form for inputting value
browser.form['inputvalue'] = myInput #MY INPUT I WANT THERE
browser.new_control("hidden", "foobar", {})
control = browser.form.find_control("foobar")
control.readonly = False
#browser["foobar"] = "/?cmd=foobar&from=/user/summary"
browser.method = "post"
response = browser.submit()
print response.read()
我的结果:
显然,它似乎将我重定向到网站的主页(302重定向)。所以我知道这很可能与隐藏的值有关,并在我提交时将其传递给javascript / Ajax调用(onclick =“submitForm)。我读到了CSRF令牌,它可能就是这样,但如果有人有任何想法如何做到这一点,让我知道,因为我迫切需要帮助。
不知怎的,我找不到... / user / summary /(控制台告诉我这个)的形式因为我被重定向到主页,即使我不提交浏览器,直到我输入所有表单字段。 ..
我可以阅读... / user / summary /的HTML,找到“foobar”表格!这就是为什么我这么困惑。我可以阅读它,解析它,但是当我尝试将myInput输入到表单中时,不知何故我被重定向到主页,但我仍然登录!
感谢pplz ..希望我很清楚!