python - Python 中的 Mechanize - 提交后重定向不起作用

标签 python mechanize mechanize-python

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

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

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

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

最佳答案

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

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

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?如果是这样,除非您自己解析 JavaScript,否则 mechanize 不会这样做。

您可以通过这种方式获取有关上次打开的 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 中定位它来获取重定向 URL,使用 html_data.find()、正则表达式、BeautifulSoup 等。

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

关于python - Python 中的 Mechanize - 提交后重定向不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11732792/

相关文章:

python - 使用 mechanize 获取数据的替代方案?

Python - 在从 json 对象中获取数据时,是否有一种优雅的方法来避免数十个 try/except block ?

python - 如何在 Mechanize 测试中允许 JSON 响应?

javascript - Python 爬虫机械化/javascript

ruby Mechanize 404 => 网络::HTTPNotFound

Ruby/Mechanize 发现重音 u 字母时中止

python - mechanize,bs4,urllib,urlib2 无法打开 nseindia.com

python - 优化Python中遍历矩阵的代码

python - 有没有办法在python中真正 pickle 编译的正则表达式?

python - 将用户导入到 USER 模型时 Django 中的密码加密