【问题标题】:How to scrape from a website which shows no tags in its source code?如何从源代码中没有显示标签的网站中抓取?
【发布时间】:2014-05-30 17:40:05
【问题描述】:

我正在使用 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 标签都在 Inspecting through Mozilla Firebug extension 中清晰可见。但是HTML页面源代码上没有存在

提前致谢

【问题讨论】:

    标签: python xpath web-scraping lxml


    【解决方案1】:

    带有class="name"div 元素是通过一组XHR 调用加载的。无需手动确定您需要提出什么请求才能获取数据,而是使用AngelList API

    另外,根据Terms of Use,网络爬取是非法的:

    根据本协议允许抓取服务, 但未经 AngelList 事先同意而抓取服务,除非 在本协议允许的情况下明确禁止

    【讨论】:

    • 感谢您提醒我注意法律条款。我将使用 AngelList api
    【解决方案2】:

    页面源指定页面的初始结构,但此Document Object Model (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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2020-03-05
      相关资源
      最近更新 更多