http://wwwsearch.sourceforge.net/mechanize/documentation.html 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”或其他名称。