如何从源代码无标签的网站进行抓取?
我正在用lxml和Python解析一个网站。
问题是,当我通过Mozilla Firefox的Firebug扩展查看时,可以看到某个元素。但在我读取的页面源代码中却找不到它。
代码是
import urllib
from lxml import etree
page=urllib.urlopen(url)
response=page.read()
x=etree.HTML(response)
company=x.xpath('//div[@class="name"]')
所有带有class="name"的div标签在通过Mozilla Firebug扩展查看时都能清楚地看到。但在HTML页面源代码中却没有。
提前谢谢你们!
2 个回答
0
网页的源代码定义了页面的初始结构,但这个文档对象模型(DOM)可以通过在页面上执行的JavaScript脚本完全改变。因此,网页的源代码和实际运行的页面看起来可能会有很大不同。
所以,你需要一个工具来执行所需的JavaScript函数,并且能够查看被修改后的DOM。如果你使用Python,一个选择是使用PySide,它为Qt提供了Python绑定(你也可以使用PyQt,不过我对它不太熟悉),而Qt本身支持基于WebKit的浏览器引擎。
下面的Python 2代码灵感来源于Qt的示例webkit-domtraversal,在页面加载后打印出DOM。我怀疑这可能还不够,所以你可能需要增加一点延迟,让页面中的所有JavaScript都能正常工作。目前,屏幕上只显示了HTML标签的名称,但根据QWebElement的文档,修改这个应该很简单。
#!/usr/bin/env python
from PySide import QtGui, QtCore, QtWebKit
import sys
class MyWin(QtGui.QMainWindow):
def __init__(self, url):
super(MyWin, self).__init__()
self.page = QtWebKit.QWebPage(self)
self.view = QtWebKit.QWebView(self)
self.view.setPage(self.page)
self.setCentralWidget(self.view)
self.page.mainFrame().loadFinished.connect(self.loadFinished)
self.page.mainFrame().load(QtCore.QUrl(url))
def loadFinished(self, ok):
print "Load finished", ok
doc = self.page.mainFrame().documentElement()
self.examineChildElements(doc)
def examineChildElements(self, parent, indent = 0):
self.printElement(parent, indent)
elem = parent.firstChild()
while not elem.isNull():
self.examineChildElements(elem, indent + 2)
elem = elem.nextSibling()
def printElement(self, elem, indent):
print " "*indent + elem.tagName()
def main():
print "Enter URL:"
url = raw_input()
a = QtGui.QApplication(sys.argv)
w = MyWin(url);
w.show()
a.exec_()
if __name__ == "__main__":
main()
1
带有 class="name"
的 div
元素是通过一系列的XHR请求加载的。与其手动去弄清楚需要发送哪些请求来获取数据,不如直接使用 AngelList API
。
而且,根据 使用条款
,网络爬虫是违法的:
根据本协议,爬取服务是被允许的,但在没有AngelList事先同意的情况下抓取服务,除非本协议另有规定,是明确禁止的。