Skip to main content

使用Firebug进行刮

注解

Google目录,本指南中使用的示例网站不再可用作为 has been shut down by Google。本指南中的概念仍然有效。如果您想更新本指南以使用一个新的(工作)网站,您的贡献将更多的欢迎!有关如何操作的信息,请参阅 有助于Scrapy

介绍

本文档解释了如何使用 Firebug (Firefox附加组件),使刮取过程更轻松,更有趣。对于其他有用的Firefox附加组件,请参阅 有用的Firefox附件的刮。使用Firefox加载项检查页面有一些注意事项,请参阅 注意检查实时浏览器DOM

在本例中,我们将展示如何使用 FirebugGoogle Directory 中删除数据,该数据包含与 教程 中使用的 Open Directory Project 相同的数据,但是使用不同的面。

Firebug有一个非常有用的功能叫做 Inspect Element,它允许你检查不同的页面元素的HTML代码只需将鼠标悬停在他们。否则你将不得不通过HTML主体手动搜索标签,这可能是一个非常乏味的任务。

在下面的屏幕截图中,您可以看到 Inspect Element 工具在运行。

Inspecting elements with Firebug

一开始,我们可以看到目录被分成类别,这些类别也被划分为子类别。

然而,似乎有更多的子类别比在此页面显示,所以我们将继续寻找:

Inspecting elements with Firebug

如预期,子类别包含到其他子类别的链接,以及到实际网站的链接,这是目录的目的。

提取数据

现在我们要编写代码来从这些页面中提取数据。

在Firebug的帮助下,我们将看看一些包含网站链接(如 http://directory.google.com/Top/Arts/Awards/)的页面,并了解如何使用 选择器 提取这些链接。我们还将使用 Scrapy壳 来测试这些XPath,并确保它们按照我们的预期工作。

Inspecting elements with Firebug

正如你所看到的,页面标记不是很描述性:元素不包含 idclass 或任何明确标识它们的属性,因此我们将使用排名栏作为参考点来选择要提取的数据构造我们的XPath。

在使用FireBug之后,我们可以看到每个链接都在一个 td 标签内,该标签本身在一个 tr 标签中,该标签还包含链接的排名栏(在另一个 td 中)。

因此,我们可以选择排名栏,然后找到其父(tr),最后,链接的 td (其中包含我们要刮除的数据)。

这将导致以下XPath:

//td[descendant::a[contains(@href, "#pagerank")]]/following-sibling::td//a

使用 Scrapy壳 测试这些复杂的XPath表达式并确保它们按预期工作很重要。

基本上,该表达式将查找排名栏的 td 元素,然后选择任何具有后代 a 元素的 td 元素,其 href 属性包含字符串 #pagerank

当然,这不是唯一的XPath,也许不是更简单的选择数据。另一种方法可以是例如找到具有链接的灰色的任何 font 标签,

最后,我们可以写我们的 parse_category() 方法:

def parse_category(self, response):
    # The path to website links in directory page
    links = response.xpath('//td[descendant::a[contains(@href, "#pagerank")]]/following-sibling::td/font')

    for link in links:
        item = DirectoryItem()
        item['name'] = link.xpath('a/text()').extract()
        item['url'] = link.xpath('a/@href').extract()
        item['description'] = link.xpath('font[2]/text()').extract()
        yield item

请注意,您可能会发现一些出现在Firebug中但不在原始HTML中的元素,例如 <tbody> 元素的典型情况。

或标签在页面中的HTML源可以在Firebug检查活动的DOM