处理JavaScript重页面的屏幕抓取选项
在这里先说明一下:我其实并不是个程序员。我很想学习,但我的经验基本上就是20年前在c64上玩过一点,还有几天学习Python的经历。
我刚开始做一个对我这个初学者来说相对较大的屏幕抓取项目。目前我一直在用Python配合mechanize和lxml来浏览和解析网页。但现在我遇到了一些页面,它们使用了很多JavaScript,如果没有开启JavaScript就什么都看不见,这对mechanize来说就很麻烦了。
经过我的搜索,我大致得出了几个选择:
试着弄明白JavaScript在做什么,然后在我的代码中模拟这个过程(我还不知道从哪里开始。;-))
使用pywin32来控制Internet Explorer或者其他类似的东西,比如用pyqt4的webkit浏览器,甚至使用telnet和mozrepl(这听起来真的很难)
换成Perl语言,因为www::Mechanize在Perl上似乎更成熟(有很多JavaScript的插件之类的)。我对这个也不是很了解。
如果有人能给我一些建议,那就太好了。我知道我需要进行很多尝试和错误,但如果能离“正确”的答案不太远,那就更好了,如果真有这样的答案的话。
4 个回答
我使用Chickenfoot来处理一些简单的任务,而对于更复杂的任务,我则使用python-webkit。这两者我都用得不错。
下面是一个代码片段,用来渲染一个网页(包括执行任何JavaScript),并返回最终的HTML内容:
class Render(QWebPage):
def __init__(self, url):
self.app = QApplication(sys.argv)
QWebPage.__init__(self)
self.loadFinished.connect(self._loadFinished)
self.mainFrame().load(QUrl(url))
self.app.exec_()
def _loadFinished(self, result):
self.html = str(self.mainFrame().toHtml())
self.app.quit()
html = Render(url).html
还有一个选择是使用 browserjs
。
这个工具的目的是在Mozilla Rhino或者其他命令行的JavaScript引擎中模拟一个浏览器环境。理论上,你可以在这个环境中加载网页,然后在JavaScript处理完后获取到HTML内容。
我自己没有真正用过这个工具,尝试过几次,但觉得速度太慢,不太适合我的需求。不过我也没有深入研究,可能是需要设置某些选项之类的。
你可能可以在其他地方找到你想要的数据。试试在Firefox浏览器中使用网页开发者工具,看看JavaScript加载了什么内容。也许你能在js文件里找到这些数据。
如果不行的话,你可能确实需要使用Mechanize。这里有两个教程可能对你有帮助: