python抓取动态网页( 如何利用Webkit从渲染网页中获取数据中所有档案)

优采云 发布时间: 2021-10-26 09:27

  python抓取动态网页(

如何利用Webkit从渲染网页中获取数据中所有档案)

  

  当我们抓取网页时,我们会使用一定的规则从返回的 HTML 数据中提取有效信息。但是如果网页中收录 JavaScript 代码,就必须经过渲染处理才能得到原创数据。此时,如果我们仍然使用常规方法从中抓取数据,那么我们将一无所获。浏览器知道如何处理这些代码并显示出来,但是我们的程序应该如何处理这些代码呢?接下来介绍一个简单粗暴的抓取收录JavaScript代码的网页信息的方法。

  大多数人使用 lxml 和 BeautifulSoup 两个包来提取数据。在本文中,我不会介绍任何爬虫框架内容,因为我只使用最基础的 lxml 包来处理数据。也许你很好奇我为什么更喜欢 lxml。那是因为 lxml 使用元素遍历来处理数据,而不是像 BeautifulSoup 那样使用正则表达式来提取数据。在这篇文章中,我将介绍一个非常有趣的案例——我突然发现我的文章出现在最近的Pycoders周刊第147期,所以我想爬取Pycoders周刊中所有文件的链接。

  

  显然,这是一个带有 JavaScript 渲染的网页。我想抓取网页中的所有文件信息和相应的链接信息。所以我该怎么做?首先,我们无法使用 HTTP 方法获取任何信息。

  import requests

from lxml import html

# storing response

response = requests.get('http://pycoders.com/archive')

# creating lxml tree from response body

tree = html.fromstring(response.text)

# Finding all anchor tags in response

print tree.xpath('//div[@class="campaign"]/a/@href')

  当我们运行上面的代码时,我们无法获得任何信息。这怎么可能?该网页清楚地显示了如此多的文件信息。接下来我们需要考虑如何解决这个问题?

  如何获取内容信息?

  接下来,我将介绍如何使用 Web kit 从 JS 渲染网页中获取数据。什么是网络套件?Web kit 可以实现浏览器可以处理的任何内容。对于某些浏览器,Web kit 是底层的网页渲染工具。Web kit 是 QT 库的一部分,所以如果你已经安装了 QT 和 PyQT4 库,那么你可以直接运行它。

  您可以使用命令行安装软件库:

  sudo apt-get install python-qt4

  现在所有的准备工作已经完成,我们将使用一种全新的方法来提取信息。

  解决方案

  我们首先通过Web kit发送请求信息,然后等待网页完全加载并赋值给一个变量。接下来,我们使用 lxml 从 HTML 数据中提取有效信息。这个过程需要一段时间,但你会惊讶地发现整个网页都被完全加载了。

  import sys

from PyQt4.QtGui import *

from PyQt4.Qtcore import *

from PyQt4.QtWebKit import *

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.frame = self.mainFrame()

self.app.quit()

  Render 类可用于呈现网页。当我们创建一个新的Render类时,它可以加载URL中的所有信息并将其存储在一个新的框架中。

  url = 'http://pycoders.com/archive/'

# This does the magic.Loads everything

r = Render(url)

# Result is a QString.

result = r.frame.toHtml()

  使用上面的代码,我们将 HTML 结果存储在变量 result 中。由于lxml不能直接处理特殊的字符串数据,我们需要对数据格式进行转换。

  # QString should be converted to string before processed by lxml

formatted_result = str(result.toAscii())

# Next build lxml tree from formatted_result

tree = html.fromstring(formatted_result)

# Now using correct Xpath we are fetching URL of archives

archive_links = tree.xpath('//div[@class="campaign"]/a/@href')

print archive_links

  使用上面的代码,我们可以得到所有的文件链接信息,然后我们就可以使用这些Render和这些URL链接来提取文本内容信息了。Web kit提供了一个强大的网页渲染工具,我们可以利用这个工具从JS渲染的网页中抓取有效的信息。

  

  在本文中,我介绍了一种从 JS 渲染的网页中抓取信息的有效方法。虽然这个工具很慢,但它非常简单和粗鲁。我希望你会喜欢这个文章。现在,您可以将此方法应用于您发现难以处理的任何网页。

  愿你事事如意。

  原文链接:

  原作者:Naren Aryan 译者:fibears

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线