常見問題?

一般?

我需要哪個版本的python??

mechanize適用于所有python版本,python2(>=2.7)和3(>=3.5)。

mechanize需要什么依賴??

html5lib

mechanize使用什么許可證??

mechanize許可證 BSD-3-clause 許可證。

使用?

我沒有得到我希望看到的HTML頁面??

調試 .

是否支持javascript??

不,對不起。參見 javascript正在破壞我的網絡抓取。我該怎么辦?

我的HTTP響應數據被截斷了??

mechanize.Browser's 響應對象支持 .seek() 方法,并且在 .close() 已被調用。在需要響應數據之前,不會提取該數據,因此在提取所有響應之前從URL中導航出來會截斷該數據。呼叫 response.get_data() 在導航之前,如果你不想這樣。

是否有示例代碼??

看看里面 examples/ 目錄。請注意,表單頁面上的示例可以按原樣執行。歡迎您提供示例代碼!

Cookies?

那RFC2109呢??

RFC 2109 cookies當前被解析為Netscape cookies,如果啟用了RFC 2965處理,則在默認情況下將其視為RFC 2965 cookies,否則將被視為Netscape cookies。

為什么我沒有餅干??

Cookies .

我的回答是空的,但我知道不是嗎??

你打過電話嗎 response.read() (例如,在調試語句中),然后忘記所有數據都已被讀取了嗎?在這種情況下,您可能需要使用 mechanize.response_seek_wrapper . mechanize.Browser 總是返回可查找的響應,因此在這種情況下不必顯式使用它。

兩者有什么區別 .load().revert() 方法 CookieJar 是嗎??

.load() 追加 來自文件的cookies。 .revert() 丟棄由 CookieJar 首先(但如果加載失敗,它不會丟失任何現有的cookie)。

是線程安全嗎??

線程安全 .

我該怎么辦 X 是嗎??

請參閱中的API文檔 瀏覽器API .

形式?

如何確定要使用的控件名稱和值??

print(form) 通常是你所需要的。在你的代碼中, HTMLForm.items 屬性 mechanize.HTMLForm 實例對于在運行時檢查表單很有用。請注意,可以使用項目標簽而不是項目名稱,這很有用-使用 by_label 各種方法的參數,以及 .get_value_by_label() / .set_value_by_label() 方法對 ListControl .

那些是什么 '*' 在列表控件的字符串表示中,字符是指??

A * 項目旁邊表示已選中該項目。

在列表控件的字符串表示形式中,這些括號(圓括號)意味著什么??

圓括號 (foo) 在項目周圍表示該項目已禁用。

為什么不呢 <some control> 在返回的數據中顯示 .click*() 當該控件具有非“無”值時??

該控件被禁用,或者由于其他原因未成功?!俺晒?(請參見 HTML 4 specification )表示控件將導致數據發送到服務器。

為什么mechanize不遵循HTML4.0/RFC1866標準 RADIO 以及多重選擇 SELECT 控制??

因為在默認情況下,當在沒有在HTML中顯式選擇項目的列表控件中設置最初選擇的項目時,它遵循瀏覽器行為。

為什么 .click() 按按鈕不適合我??

點擊 RESET 按鈕不做任何事情,按設計-這是一個用于網絡自動化的庫,而不是一個交互式瀏覽器。即使在交互式瀏覽器中,單擊 RESET 不向服務器發送任何信息,因此 .click() 在這里做任何特別的事情。

點擊 BUTTON TYPE=BUTTON 也不做任何事情,設計上也是。這次,原因是 BUTTON 只有在HTML標準中,才能將javascript回調附加到其事件。它們的執行可能會導致信息被發送回服務器。然而,mechanize對這些回調一無所知,因此單擊 BUTTON 其類型為 BUTTON .

通常,JavaScript可能會以各種方式把事情搞得一團糟。參見 javascript正在破壞我的網絡抓取。我該怎么辦? .

我怎么換 INPUT TYPE=HIDDEN 字段值(例如,模擬javascript代碼的效果)??

與任何控件一樣,設置控件的 readonly 屬性為假。

form.find_control("foo").readonly = False # allow changing .value of control foo
form.set_all_readonly(False) # allow changing the .value of all controls

調試代碼時遇到問題。?

調試 .

我有一個包含整數列表的控件。如何選擇值與所需值最接近的值??

import bisect
def closest_int_value(form, ctrl_name, value):
    values = map(int, [item.name for item in form.find_control(ctrl_name).items])
    return str(values[bisect.bisect(values, value) - 1])

form["distance"] = [closest_int_value(form, "distance", 23)]

其他?

我想看看我的網絡瀏覽器在做什么??

使用瀏覽器的開發人員工具(您可能需要先安裝它們)。這些提供了瀏覽器中所有HTTP請求/響應的良好視圖。

javascript正在破壞我的網絡抓取。我該怎么辦??

javascript在網頁中的用途很多,例如:創建加載時不在網頁中的內容,提交或填寫部分表單以響應用戶操作,設置cookie等。mechanize不提供任何對javascript的支持。

如果您在希望自動化的頁面中遇到這種情況,那么您有幾個選項。它們大致按照簡單的順序排列如下:

  • 找出JavaScript正在做什么,并在您的Python代碼中模擬它。最簡單的情況是如果javascript正在設置一些cookie。在這種情況下,您可以檢查瀏覽器中的cookie并模擬將其設置為mechanize mechanize.Browser.set_simple_cookie() .

  • 更復雜的是使用瀏覽器開發人員工具來準確查看瀏覽器發送的請求,并使用 mechanize.Request 手動創建請求并用打開它 mechanize.Browser.open() .

  • 第三,使用一些瀏覽器自動化框架/庫來刮取站點,而不是使用mechanize。這些庫通常驅動可以執行所有javascript的完整瀏覽器的無頭版本。它們通常比使用mechanize慢得多,而且資源密集得多,但作為最后手段,它們確實工作。