使用Firebug进行刮¶
注解
Google目录,本指南中使用的示例网站不再可用作为 has been shut down by Google。本指南中的概念仍然有效。如果您想更新本指南以使用一个新的(工作)网站,您的贡献将更多的欢迎!有关如何操作的信息,请参阅 有助于Scrapy。
介绍¶
本文档解释了如何使用 Firebug (Firefox附加组件),使刮取过程更轻松,更有趣。对于其他有用的Firefox附加组件,请参阅 有用的Firefox附件的刮。使用Firefox加载项检查页面有一些注意事项,请参阅 注意检查实时浏览器DOM。
在本例中,我们将展示如何使用 Firebug 从 Google Directory 中删除数据,该数据包含与 教程 中使用的 Open Directory Project 相同的数据,但是使用不同的面。
Firebug有一个非常有用的功能叫做 Inspect Element,它允许你检查不同的页面元素的HTML代码只需将鼠标悬停在他们。否则你将不得不通过HTML主体手动搜索标签,这可能是一个非常乏味的任务。
在下面的屏幕截图中,您可以看到 Inspect Element 工具在运行。

一开始,我们可以看到目录被分成类别,这些类别也被划分为子类别。
然而,似乎有更多的子类别比在此页面显示,所以我们将继续寻找:

如预期,子类别包含到其他子类别的链接,以及到实际网站的链接,这是目录的目的。
获取链接¶
通过查看类别网址,我们可以看到他们共享一个模式:
一旦我们知道,我们能够构造一个正则表达式来跟随这些链接。例如,以下一个:
directory\.google\.com/[A-Z][a-zA-Z_/]+$
因此,基于该正则表达式,我们可以创建第一个爬网规则:
Rule(LinkExtractor(allow='directory.google.com/[A-Z][a-zA-Z_/]+$', ),
'parse_category',
follow=True,
),
Rule
对象指示基于 CrawlSpider
的蜘蛛如何遵循类别链接。 parse_category
将是一个蜘蛛的方法,它将处理和从这些页面提取数据。
这是蜘蛛怎么看起来这么远:
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class GoogleDirectorySpider(CrawlSpider):
name = 'directory.google.com'
allowed_domains = ['directory.google.com']
start_urls = ['http://directory.google.com/']
rules = (
Rule(LinkExtractor(allow='directory\.google\.com/[A-Z][a-zA-Z_/]+$'),
'parse_category', follow=True,
),
)
def parse_category(self, response):
# write the category page data extraction code here
pass
提取数据¶
现在我们要编写代码来从这些页面中提取数据。
在Firebug的帮助下,我们将看看一些包含网站链接(如 http://directory.google.com/Top/Arts/Awards/)的页面,并了解如何使用 选择器 提取这些链接。我们还将使用 Scrapy壳 来测试这些XPath,并确保它们按照我们的预期工作。

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