无法使用 python 中的机械化登录我究竟做错了什么?

问题描述

我正在尝试在 python 中使用 mechanize 登录站点https://login.haaretz.co.il/ 从表面上看,它看起来像一个两阶段的登录过程,与谷歌相同,但通过机械化登录谷歌的收据让我无处可去。在 submit()-ing 之后,浏览器似乎保持在同一页面上,其中包含单个 userName 控件的单个表单。 我做错了什么?

>>> import mechanize
>>> br = mechanize.browser()
>>> br.open('https://login.haaretz.co.il/')
<response_seek_wrapper at 0x7f53bfbc4a00 whose wrapped object = <closeable_response at 0x7f53bfbc4580 whose fp = <_io.BufferedReader name=3>>>
>>> 
>>> br.select_form(nr=0)
>>> 
>>> print(br.form)
<GET https://login.haaretz.co.il/ application/x-www-form-urlencoded
  <TextControl(userName=)>
  <IgnoreControl(<None>=<None>)>>
>>> br['userName']='my_email@gmail.com'
>>> resp = br.submit()
>>> # and after submitting I'm back a square one
>>> print(br.forms()[0])
<GET https://login.haaretz.co.il/?userName=my_email%40gmail.com application/x-www-form-urlencoded
  <TextControl(userName=)>
  <IgnoreControl(<None>=<None>)>>
>>> 

这是没有希望了吗?我做错了吗?

解决方法

我的猜测是登录过程依赖于 JavaScript。如果登录依赖于 JavaScript,您将无法通过 Mechanize 获得想要的结果。见Mechanize and Javascript

xpath 'body/script[2]' 处的脚本标签有一个带有 'loginSuccess': False 键值对的 JavaScript 对象。因此我的猜测是登录需要 JavaScript。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...