我正在处理一个具有多个字段、一些文本和多个隐藏字段的表单。问题是,当我查看我的 mechanize.Browser 对象“看到”的字段列表时,一些重要的隐藏字段丢失了,但不是全部。根据 this similar question 的最流行答案,这是因为网页正在查询用户代理字符串。对我来说情况并非如此,我知道这一点有两个原因:
- 当我将“抓取”的表格保存到文件时,我可以看到缺少的字段,并且
- 我已经按照该解决方案的建议更改了浏览器对象的用户代理字符串,但这对我没有帮助。
对我有帮助的是 second most popular solution到那个问题,但我不明白为什么会这样。为什么 Mechanize 会“看到”一些隐藏的表单字段而不是其他表单字段,需要手动输入缺失的字段?
最佳答案
诚然,我不知道您实际上想对您做什么 - 但作为多年来一直在抓取网页的人,我必须主动给您一些建议。我提前道歉。
我强烈建议您过渡到可以处理 javascript 的东西。 Mechanize 是一个很棒的模块,它在过去非常有用,但网络上到处都是闪烁的灯光、CSS 和你必须点击的跳舞婴儿。
我这样说的原因是,“隐藏”字段可能是一些奇特的东西,或者它们可能是 javascript 修改的形式,您将浪费数小时试图逆向工程它是如何工作的,只是将方钉钉入圆形洞。
我建议的 Mechanize 的现代但不幸的是重量级的替代品是:
phantomjs它提供了一种基于 WebKit 的以 javascript 为中心的方式来与网页交互( headless ,这是一个好处)它是基于 Qt 的,但是有可靠的发布二进制文件,如果你从源代码构建它实际上包含它运行所需的一切而不必同步Qt 的一些特定版本。
PySide QtWebKit 的绑定(bind)虽然可能有一些学习曲线,但它很漂亮,但恕我直言,我最喜欢的只是因为能够进入浏览器内部并亲自动手看看发生了什么,这很好。
WebKit 还提供了一个不错的(尽管 Python 支持不佳)接口(interface),您可以在其中启用浏览器中的 websocket 服务器并使用定义的 API 通过 websockets 驱动它 in Inspector.json . Stock Chrome 开箱即用地支持这一点。您可以找到更多详细信息 on the Chrome developer website.
所以,WebKit 相当繁重,与您所询问的内容无关 - 但从长远来看,这是您最终能够真正自动导航和抓取网络的地方。
关于python - 为什么 Mechanize(-Python) 似乎忽略了一些隐藏的表单字段而不是其他字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13349940/