在Python中模拟JavaScript的_dopostback,实现网页抓取
在这里,这个链接提到可以“弄清楚JavaScript在做什么,并在你的Python代码中模拟它。”我希望得到的帮助就是这个,也就是我的问题。如何模拟javascript:__doPostBack?
这是一个网站的代码(完整页面源代码在这里 这个链接):
<a style="color: Black;" href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$gvSearchResults','Page$2')">2</a>
当然,我基本上不知道接下来该怎么做。
提前感谢你的帮助和想法。
好吧,有很多帖子在问如何在用Python库(比如mechanize、beautifulsoup等)进行网页抓取时点击一个JavaScript按钮。我看到很多回复说“这不支持”,然后推荐使用一些非Python的解决方案。我认为如果能用Python解决这个问题,对很多人都会有很大帮助。因此,我并不想要像使用x、y或z这样的答案,这些都不是Python代码或者需要和浏览器互动。
1 个回答
这个mechanize页面并不是说你可以在Python中模拟JavaScript。它的意思是你可以改变表单中的一个隐藏字段,从而欺骗网络服务器,让它以为是一个人选择了这个字段。你仍然需要自己分析目标。
除非你想在Python中创建一个JavaScript解释器,否则这个问题没有Python解决方案。
我对这个问题的想法让我想到三种可能的解决方案:
- 创建一个XULRunner应用
- 浏览器自动化
- 尝试解释客户端代码
在这三种方案中,我只看到过关于第二种的讨论。我在一个商业抓取应用中见过接近第一种的实现,基本上是通过浏览网站并选择你希望脚本将来提取的内容来创建脚本。
第一种方案可能可以通过一个Python脚本来实现,接受一个wsgi请求对象的序列化(比如JSON),让应用去获取URL,然后将处理后的页面作为wsgi响应对象发送。你可能可以在urllib2周围包裹一些中间件来实现这个。虽然可能有点过于复杂,但想想还是挺有趣的。
第二种通常是通过Selenium RC(远程控制)来实现的,这是一种以测试为中心的工具。它提供了一些方法,比如getHtmlSource
,但我听说过的很多人对它的API并不喜欢。
至于第三种,我就不太清楚了。node.js现在非常流行,但我没有接触过。我在我的Ubuntu机器上从来没能成功构建spidermonkey,所以也没碰过。我的直觉是,要做到这一点,你需要将HTML源代码和你的详细信息提供给一个JS解释器,它需要假装成你的用户代理等,以防JavaScript想要重新连接服务器。
1 更准确地说,是一个符合JavaScript标准的用户代理,这几乎总是一个人使用的网页浏览器。