如何从源代码无标签的网站进行抓取?

1 投票
2 回答
1981 浏览
提问于 2025-04-18 08:04

我正在用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事先同意的情况下抓取服务,除非本协议另有规定,是明确禁止的。

撰写回答