高級主題?

線程安全?

全局函數 mechanize.urlopen()mechanize.urlretrieve() 是線程安全的。但是,mechanize瀏覽器實例 不是 線程安全。如果要在多個線程中使用mechanize瀏覽器實例,請使用 copy.copy(browser_object) 方法??寺⒐蚕硐嗤木€程安全cookie jar,并具有與原始相同的設置/處理程序,但所有其他狀態都不共享,使克隆在不同的線程中安全使用。

使用自定義CA證書?

mechanize支持與python>=2.7.9相同的使用自定義CA證書的機制。要更改mechanize瀏覽器實例使用的證書,請調用 mechanize.Browser.set_ca_data() 方法。

調試?

調試使用mechanize的程序的提示。

Cookies?

一個常見的錯誤是使用 mechanize.urlopen() , and 這個 .extract_cookies().add_cookie_header() cookie對象本身的方法。如果你使用 mechanize.urlopen() (或) OpenerDirector.open() )模塊本身處理cookie的提取和添加,因此不應調用 .extract_cookies().add_cookie_header() .

您確定服務器會首先向您發送任何cookie嗎?也許服務器以其他方式跟蹤狀態 (HIDDEN HTML表單條目(可能在由框架引用的單獨頁面中)、URL編碼會話密鑰、IP地址、HTTP Referer 郵件頭)?也許HTML中的某個嵌入腳本正在設置cookie(見下文)?打開 登錄中 .

當你 .save() 到或 .load() /.revert()`從文件中,單會話cookie將過期,除非使用 `ignore_discard 參數。如果您在保存和加載后發現cookies即將消失,這可能是您的問題。

import mechanize
cj = mechanize.LWPCookieJar()
opener = mechanize.build_opener(mechanize.HTTPCookieProcessor(cj))
mechanize.install_opener(opener)
r = mechanize.urlopen("http://foobar.com/")
cj.save("/some/file", ignore_discard=True, ignore_expires=True)

javascript代碼可以設置cookie;mechanize不支持這種情況。參見 javascript正在破壞我的網絡抓取。我該怎么辦? .

一般?

使能 登錄中 .

有時,服務器希望將特定的HTTP頭設置為它期望的值。例如, User-Agent 可能需要設置標題 (mechanize.Browser.set_header() )像流行瀏覽器那樣的值。

檢查瀏覽器是否能夠手動執行您試圖以編程方式實現的操作。確保手動操作是 確切地 與您在python上所做的相同——例如,您可能只是遇到了一個服務器錯誤,該錯誤只有在以特定順序查看頁面時才會顯示出來。

嘗試比較程序發送的頭和數據與瀏覽器發送的頭和數據。這通常會給你所需要的線索。您可以在任何瀏覽器中使用開發人員工具來查看瀏覽器發送和接收的內容。

如果您的程序發送的請求沒有明顯的錯誤,并且您沒有想法,那么您可以通過復制瀏覽器發送的頭文件,然后更改頭文件,直到程序停止工作,從而可靠地找到問題所在。臨時切換到顯式發送單個HTTP頭(通過調用 .add_header() 或通過使用 httplib 直接)。從發送firefox或chrome發送的郵件頭開始。您可能需要確保發送了有效的會話ID——您從瀏覽器中獲得的會話ID可能不再有效。如果可以的話,您可以開始一個冗長的過程來更改頭和數據,直到它們與原始代碼發送的內容相匹配。您應該以最少的一組更改結束。如果你認為這揭示了一個mechanize的錯誤,請報告它。

登錄中?

要啟用到stdout的日志記錄,請執行以下操作:

import sys, logging
logger = logging.getLogger("mechanize")
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.setLevel(logging.DEBUG)

通過將級別設置為,可以減少顯示的信息量 logging.INFO 而不是 logging.DEBUG 或者只為以下記錄器名稱之一啟用日志記錄,而不是 "mechanize"

  • "mechanize" :一切。

  • "mechanize.cookies" :接受或拒絕特定cookie的原因,以及返回或不返回cookie的原因。需要在啟用日志記錄 DEBUG 水平。

  • "mechanize.http_responses" :http響應正文數據。

  • "mechanize.http_redirects" :http重定向信息。

HTTP頭?

演示如何將HTTP頭打印到stdout、記錄HTTP響應主體和記錄有關重定向的信息的示例:

import sys, logging
import mechanize

logger = logging.getLogger("mechanize")
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.setLevel(logging.DEBUG)

browser = mechanize.Browser()
browser.set_debug_http(True)
browser.set_debug_responses(True)
browser.set_debug_redirects(True)
response = browser.open("http://python.org/")

或者,您可以檢查請求和響應對象以查看發生了什么。請注意,在重定向等情況下,請求可能涉及“子請求”,在這種情況下,通過檢查原始請求和最終響應,您將看不到正在發生的一切。