高级主题

线程安全

全局函数 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/")

或者,您可以检查请求和响应对象以查看发生了什么。请注意,在重定向等情况下,请求可能涉及“子请求”,在这种情况下,通过检查原始请求和最终响应,您将看不到正在发生的一切。