- Scrapy 教程
- Scrapy - 首页
- Scrapy 基本概念
- Scrapy - 概述
- Scrapy - 环境配置
- Scrapy - 命令行工具
- Scrapy - 爬虫 (Spider)
- Scrapy - 选择器
- Scrapy - 数据项 (Item)
- Scrapy - 数据项加载器 (Item Loader)
- Scrapy - Shell
- Scrapy - 数据项管道 (Item Pipeline)
- Scrapy - 数据导出
- Scrapy - 请求 & 响应
- Scrapy - 链接提取器
- Scrapy - 设置
- Scrapy - 异常处理
- Scrapy 实战项目
- Scrapy - 创建项目
- Scrapy - 定义数据项
- Scrapy - 第一个爬虫
- Scrapy - 爬取数据
- Scrapy - 数据提取
- Scrapy - 使用数据项
- Scrapy - 跟踪链接
- Scrapy - 爬取的数据
- Scrapy 有用资源
- Scrapy - 快速指南
- Scrapy - 有用资源
- Scrapy - 讨论
Scrapy - 数据提取
描述
为了从网页中提取数据,Scrapy 使用基于XPath和CSS表达式的选择器技术。以下是一些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.body和response.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