使用Python进行屏幕抓取
Python有没有可以抓取网页内容的库,支持JavaScript的?
我一直在用pycurl来处理简单的HTML请求,而对于需要支持JavaScript的复杂请求,我则使用Java的HtmlUnit。
我希望能在Python中完成所有的工作,但我还没有找到可以做到这一点的库。有没有这样的库呢?
7 个回答
4
Scrapy是一个快速的高级网页抓取和爬虫框架,主要用来访问网站并从网页中提取结构化的数据。它可以用于很多不同的目的,比如数据挖掘、监控和自动化测试。
这里是链接: http://scrapy.org/
11
Beautiful Soup 可能是你最好的选择。
如果你需要“JavaScript支持”,是为了拦截 Ajax 请求,那么你应该使用一些捕获工具(比如 YATT)来监控这些请求是什么,然后再模拟或解析它们。
如果你需要“JavaScript支持”,是为了查看静态 JavaScript 页面最终的结果,那么我建议你逐个分析 JavaScript 的作用(例如,如果 JavaScript 是基于某些 Xml 做事情,那就直接解析 Xml 吧)。
如果你真的想要“JavaScript支持”(也就是说,你想看到页面上脚本运行后的 HTML),那么你可能需要创建一个浏览器控制实例,然后在加载完成后从这个浏览器控制中读取结果的 HTML / DOM,再用 Beautiful Soup 正常解析。不过,这种方法我会把它当作最后的选择。
13
处理静态HTML的时候有很多选择,其他回答也提到了这些。不过,如果你需要支持JavaScript,并且想继续使用Python,我建议你使用webkit来渲染网页(包括JavaScript),然后查看生成的HTML。比如:
import sys
import signal
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import QWebPage
class Render(QWebPage):
def __init__(self, url):
self.app = QApplication(sys.argv)
QWebPage.__init__(self)
self.html = None
signal.signal(signal.SIGINT, signal.SIG_DFL)
self.connect(self, SIGNAL('loadFinished(bool)'), self._finished_loading)
self.mainFrame().load(QUrl(url))
self.app.exec_()
def _finished_loading(self, result):
self.html = self.mainFrame().toHtml()
self.app.quit()
if __name__ == '__main__':
try:
url = sys.argv[1]
except IndexError:
print 'Usage: %s url' % sys.argv[0]
else:
javascript_html = Render(url).html