2012-07-31 96 views
4

我剛開始在Python中使用機械化,我已經有一些問題了。我瀏覽過StackOverflow和Google,我也看到有人說文檔很棒,應該很容易讓它工作,但我認爲我不知道該如何查找這些文檔,因爲所有的可以找到代碼示例,這些代碼示例並不真正教會我如何執行我正在嘗試做的特定事情。如果有人能夠指出我的這些文件,我很樂意自己閱讀並解決我的問題。Python中的機械化 - 提交後重定向不工作

對於實際問題,我試圖通過在表單中​​發送我的用戶名和密碼信息登錄到網站。當信息正確時,我通常會重定向,但它在機械化中不起作用。

這是我沒有得到的部分,因爲如果我在調用提交後立即打印頁面的html內容,頁面將顯示一個變量,顯示身份驗證是否有效。如果我將密碼更改爲不正確的密碼,則html會顯示一條消息「無效的憑據」,就像我正常瀏覽網站時一樣。

這是我如何做的代碼示例。請記住,這可能是完全錯誤的,因爲我只是想運用我在實例中發現:

import mechanize 
import cookielib 

# Start Browser 
br = mechanize.Browser() 
cj = cookielib.LWPCookieJar() 

br.set_cookiejar(cj) 

br.set_handle_equiv(True) 
br.set_handle_redirect(True) 
br.set_handle_referer(True) 
br.set_handle_robots(False) 

br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) 

br.open('http://www.complexejuliequilles.com/') 


for l in br.links(url_regex='secure'): 
    br.follow_link(l) 

br.select_form('form1') 

br.form['fldUsername'] = 'myUsername' 
br.form['fldPassword'] = 'myPassword' 
br.submit() 

在這個特殊的例子,我打開http://www.complexejuliequilles.com,然後我按照在具有底部的鏈接文本「管理」,我在表單中輸入我的憑證,然後提交。通常情況下,我將被重定向到我所在的第一個頁面,但只有更多的按鈕可供管理員使用。我想單擊其中一個鏈接來填寫另一個表單,以添加我擁有其電子郵件地址,姓名等的用戶列表。

有沒有簡單的東西我錯過了?我想我已經掌握了基礎知識,但是我不知道該庫足以找出重定向發生了什麼問題。

回答

7

http://wwwsearch.sourceforge.net/mechanize/documentation.html

避免使用 「_http」 直接。名字中的第一個下劃線告訴我們,開發人員認爲它是私有的,你可能不需要它。

In [20]: mechanize.HTTPRefreshProcessor is mechanize._http.HTTPRefreshProcessor 
Out[20]: True 

在打開網址之前,有些東西是您不需要的。例如:mechanize.Browser()不是urllib,它已經爲你管理cookies。你不應該避免robots.txt。你可以看到遵循一些更「約定優於配置」的前處理程序是默認:

mechanize.Browser().handlers 

你可能有mechanize.HTTPRedirectHandler在該列表中(我),如果不是:

br.set_handle_redirect(mechanize.HTTPRedirectHandler) 

的for循環很奇怪,好像你在循環內部改變它的迭代器(鏈接在一個打開的URL裏面)(瀏覽器打開另一個URL)。我首先想到你想遞歸地點擊,而有一個「安全」的URL匹配。錯誤將取決於如何鏈接()發生器實施(可能它遵循一個固定br.response()實例),但我認爲你只是想跟隨匹配的第一個鏈接:

In [50]: br.follow_link(url_regex="secure") # No loops 

我不不知道你需要什麼樣的重定向/刷新。 JavaScript改變window.location.href?如果是這樣,機械化不會這樣做,除非你自己解析JavaScript。

你能得到關於最後打開URL「原始」信息是這樣的:

last_response = br.response() # This is returned by br.open(...) too 
http_header_dict = last_response.info().dict 
html_string_list = last_response.readlines() 
html_data = "".join(html_string_list) 

即使它是一個JavaScript,您可以通過在html_data定位它得到重定向URL,使用html_data.find (),正則表達式,BeautifulSoup等。

PEP8注意:避免使用孤立的「l」(較低的「L」)作爲變量,它可能被錯誤地視爲「一個」或「I」 「)取決於使用的字體和上下文。您應該使用「L」或其他名稱。

+0

這是很好的建議!對於for循環,這是我已經複製並適應了我的需求,但你的方式顯然更好。我只是有一個問題,雖然...你說我可以解析html_data來找到重定向URL,我可以管理它,但是我不知道在我擁有這個URL之後我應該調用什麼函數,所以我可以保持登錄狀態......我還在想,如果我已經知道重定向url而不會丟失我的登錄信息,是否真的必須解析html才能獲得重定向鏈接,或者如果我可以硬編碼它? – 2012-07-31 12:46:17

+0

它只是br.open(link_string)。 – 2012-08-02 03:31:33

+0

您可以對鏈接字符串進行硬編碼,但您應該知道如果鏈接更改,您的代碼將被棄用。你不應該用cookies來擔心:機械化瀏覽器管理cookies,你可以認爲你是在一個普通的圖形瀏覽器內的地址欄中輸入你的鏈接。只要不打開另一個瀏覽器(即始終使用您創建的相同「br」),因此您的cookies將被保存在「jar」中(即,登錄不應該丟失)。 – 2012-08-02 03:45:26