Scrapy – 提取项目
描述
为了从网页中提取数据,Scrapy使用了一种技术,叫做基于XPath 和CSS 表达式的选择器。下面是一些XPath表达式的例子 –
- /html/head/title – 这将选择HTML文档的
<head>元素中的<title>元素。 - 
/html/head/title/text() – 这将选择同一
<title>元素内的文本。 - 
//td – 这将选择
<td>中的所有元素。 - 
//div[@class = “slice”] – 这将从 div 中选择所有含有class = “slice “属性的元素。
 
选择器有四个基本方法,如下表所示
| 序号 | 方法和描述 | 
|---|---|
| 1 | extract() 它返回一个带有所选数据的unicode字符串。 | 
| 2 | re() 当给出正则表达式作为参数时,它返回一个提取的单码字符串列表。 | 
| 3 | xpath() 它返回一个选择器列表,代表由作为参数的xpath表达式选择的节点。 | 
| 4 | css() 它返回一个选择器列表,代表由作为参数的 CSS 表达式选择的节点。 | 
在外壳中使用选择器
要用内置的Scrapy shell演示选择器,你需要在系统中安装IPython 。重要的是,在运行Scrapy时,URL应该包含在引号内;否则,带有’&’字符的URL将无法工作。你可以通过在项目的顶层目录中使用以下命令来启动一个shell —
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
一个外壳将看起来像下面这样 –
[ ... 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.body 和 response.header 来访问body或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
极客教程