5

我刚开始在 Python 中使用 mechanize 并且已经遇到了一些问题。我在 StackOverflow 和 Google 上环顾四周,我看到人们说文档很棒,应该很容易让它工作,但我想我不知道如何查找该文档,因为我可以找到的是代码示例,它们并没有真正教我如何做我想做的特定事情。如果有人可以向我指出此类文档,我会很高兴自己阅读并解决我的问题。

对于实际问题,我试图通过在表单中​​发送我的用户名和密码信息来登录网站。当信息正确时,我通常会被重定向,但它在机械化中不起作用。

这是我没有得到的部分,因为如果我在调用提交后立即打印页面的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.complexejulieequilles.com,然后点击底部的链接,其中包含“管理”文本,在表单中输入我的凭据,然后提交。通常,我会被重定向到我所在的第一个页面,但会有更多的按钮只能由管理员使用。我想单击其中一个链接来填写另一个表格,以添加我拥有其电子邮件地址、姓名等的用户列表。

我缺少一些简单的东西吗?我想我掌握了基础知识,但我对库的了解不足以找到重定向出了什么问题。

4

1 回答 1

8

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

避免直接使用“_http”。名称中的第一个下划线告诉我们开发人员将其视为私有的,而您可能不需要它。

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

您在打开 URL 之前放置了一些您并不真正需要的东西。例如: mechanize.Browser() 不是 urllib,它已经为您管理 cookie。你不应该避免 robots.txt。通过查看默认处理程序之前,您可以遵循更多“约定优于配置”:

mechanize.Browser().handlers

如果没有,您可能在该列表中有 mechanize.HTTPRedirectHandler (我有):

br.set_handle_redirect(mechanize.HTTPRedirectHandler)

for 循环很奇怪,似乎您正在循环内更改其迭代器(打开 URL 内的链接)(浏览器打开另一个 URL)。我首先以为您想在“安全” URL 匹配时递归单击。错误取决于 links() 生成器的实现方式(可能它遵循固定的 br.response() 实例),但我认为您只想遵循第一个匹配的链接:

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

我不知道你需要什么样的重定向/刷新。JavaScript 改变 window.location.href?如果是这样,mechanize 不会这样做,除非您自己解析 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 中定位、使用 html_data.find()、正则表达式、BeautifulSoup 等来获取重定向 URL。

PEP8 注意:避免使用孤立的“l”(较低的“L”)作为变量,根据使用的字体和上下文,它可能会被错误地视为“one”或“I”(较高的“i”)。您应该改用“L”或其他名称。

于 2012-07-31T06:40:39.567 回答