处理JavaScript重页面的屏幕抓取选项

2 投票
4 回答
815 浏览
提问于 2025-04-16 05:27

在这里先说明一下:我其实并不是个程序员。我很想学习,但我的经验基本上就是20年前在c64上玩过一点,还有几天学习Python的经历。

我刚开始做一个对我这个初学者来说相对较大的屏幕抓取项目。目前我一直在用Python配合mechanize和lxml来浏览和解析网页。但现在我遇到了一些页面,它们使用了很多JavaScript,如果没有开启JavaScript就什么都看不见,这对mechanize来说就很麻烦了。

经过我的搜索,我大致得出了几个选择:

  1. 试着弄明白JavaScript在做什么,然后在我的代码中模拟这个过程(我还不知道从哪里开始。;-))

  2. 使用pywin32来控制Internet Explorer或者其他类似的东西,比如用pyqt4的webkit浏览器,甚至使用telnet和mozrepl(这听起来真的很难)

  3. 换成Perl语言,因为www::Mechanize在Perl上似乎更成熟(有很多JavaScript的插件之类的)。我对这个也不是很了解。

如果有人能给我一些建议,那就太好了。我知道我需要进行很多尝试和错误,但如果能离“正确”的答案不太远,那就更好了,如果真有这样的答案的话。

4 个回答

0

我使用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
0

还有一个选择是使用 browserjs

这个工具的目的是在Mozilla Rhino或者其他命令行的JavaScript引擎中模拟一个浏览器环境。理论上,你可以在这个环境中加载网页,然后在JavaScript处理完后获取到HTML内容。

我自己没有真正用过这个工具,尝试过几次,但觉得速度太慢,不太适合我的需求。不过我也没有深入研究,可能是需要设置某些选项之类的。

1

你可能可以在其他地方找到你想要的数据。试试在Firefox浏览器中使用网页开发者工具,看看JavaScript加载了什么内容。也许你能在js文件里找到这些数据。

如果不行的话,你可能确实需要使用Mechanize。这里有两个教程可能对你有帮助:

http://scraperwiki.com/help/tutorials/python/

撰写回答