常见问题

一般

我需要哪个版本的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慢得多,而且资源密集得多,但作为最后手段,它们确实工作。