Scrapy - 数据提取



描述

为了从网页中提取数据,Scrapy 使用基于XPathCSS表达式的选择器技术。以下是一些XPath表达式的示例:

  • /html/head/title − 这将选择HTML文档中<head>元素内的<title>元素。

  • /html/head/title/text() − 这将选择相同<title>元素中的文本。

  • //td − 这将选择所有<td>元素。

  • //div[@class = "slice"] − 这将选择所有包含属性class = "slice"的div元素。

选择器有四种基本方法,如下表所示:

序号 方法 & 描述
1

extract()

它返回一个包含所选数据的Unicode字符串。

2

re()

它返回一个Unicode字符串列表,这些字符串是在使用正则表达式作为参数提取时获得的。

3

xpath()

它返回一个选择器列表,表示由作为参数提供的xpath表达式选择的节点。

4

css()

它返回一个选择器列表,表示由作为参数提供的CSS表达式选择的节点。

在Shell中使用选择器

为了使用内置的Scrapy shell演示选择器,你需要在你的系统中安装IPython。这里需要注意的是,在运行Scrapy时,URL应该包含在引号中;否则包含“&”字符的URL将无法工作。你可以使用项目顶层目录中的以下命令启动shell:

scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"

shell界面如下所示:

[ ... Scrapy log here ... ]

2014-01-23 17:11:42-0400 [scrapy] DEBUG: Crawled (200) 
<GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>(referer: None)
[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x3636b50>
[s]   item       {}
[s]   request    <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s]   response   <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s]   settings   <scrapy.settings.Settings object at 0x3fadc50>
[s]   spider     <Spider 'default' at 0x3cebf50>
[s] Useful shortcuts:
[s]   shelp()           Shell help (print this help)
[s]   fetch(req_or_url) Fetch request (or URL) and update local objects
[s]   view(response)    View response in a browser

In [1]:

当shell加载后,你可以分别使用response.bodyresponse.header访问主体或头部。类似地,你可以使用response.selector.xpath()response.selector.css()对响应运行查询。

例如:

In [1]: response.xpath('//title')
Out[1]: [<Selector xpath = '//title' data = u'<title>My Book - Scrapy'>]

In [2]: response.xpath('//title').extract()
Out[2]: [u'<title>My Book - Scrapy: Index: Chapters</title>']

In [3]: response.xpath('//title/text()')
Out[3]: [<Selector xpath = '//title/text()' data = u'My Book - Scrapy: Index:'>]

In [4]: response.xpath('//title/text()').extract()
Out[4]: [u'My Book - Scrapy: Index: Chapters']

In [5]: response.xpath('//title/text()').re('(\w+):')
Out[5]: [u'Scrapy', u'Index', u'Chapters']

提取数据

要从普通的HTML网站提取数据,我们必须检查网站的源代码以获取XPaths。检查后,您可以看到数据将位于ul标签中。选择li标签中的元素。

以下代码行显示了不同类型数据的提取:

选择li标签中的数据:

response.xpath('//ul/li')

选择描述:

response.xpath('//ul/li/text()').extract()

选择网站标题:

response.xpath('//ul/li/a/text()').extract()

选择网站链接:

response.xpath('//ul/li/a/@href').extract()

以下代码演示了上述提取器的用法:

import scrapy

class MyprojectSpider(scrapy.Spider):
   name = "project"
   allowed_domains = ["dmoz.org"]
   
   start_urls = [
      "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
      "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
   ]
   def parse(self, response):
      for sel in response.xpath('//ul/li'):
         title = sel.xpath('a/text()').extract()
         link = sel.xpath('a/@href').extract()
         desc = sel.xpath('text()').extract()
         print title, link, desc
广告