从网页中提取数据,Scrapy 使用基于 XPath 和 CSS 表达式的技术叫做选择器。以下是 XPath 表达式的一些例子:
/html/head/title:
这将选择 HTML 文档中的 <head> 元素中的 <title> 元素。
/html/head/title/text(): 这将选择 <title> 元素中的文本。
//td: 这将选择所有的 <td> 元素。
//div[@class=”slice”]: 选择 div 包含一个属性 class=”slice” 的所有元素。
选择器有四个基本的方法,如下所示:
S.N. | 方法 & 描述 |
---|---|
extract() | 它返回一个unicode字符串以及所选数据 |
re() | 它返回Unicode字符串列表,当正则表达式被赋予作为参数时提取 |
xpath() | 它返回选择器列表,它代表由指定XPath表达式参数选择的节点。 |
css() | 它返回选择器列表,它代表由指定CSS表达式作为参数所选择的节点。 |
在Shell中使用选择器
若要演示选择器在内置Scrapy Shell 中,必须要在您的系统中安装 IPython。 这里最重要的是,在运行时网址应包含Scrapy引号之内; 否则使用的 URL “&” 字符将不起作用。 可以通过在该项目的顶级目录中,使用下面的命令启动一个 shell:
scrapy shell "http://www.yiibai.com/scrapy/scrapy_environment.html"
shell 执行后结果如下图所示:
D:first_scrapy>scrapy shell "http://www.yiibai.com/scrapy/scrapy_environment.html"
2016-10-03 11:45:08 [scrapy] INFO: Scrapy 1.1.2 started (bot: first_scrapy)
2016-10-03 11:45:08 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'first_scrapy.spiders', 'ROBOTSTXT_OBEY': True, 'DUPEFILTER_CLASS': 'scrapy.dupefilters.BaseDupeFilter', 'SPIDER_MODULES': ['first_scrapy.spiders'], 'BOT_NAME': 'first_scrapy', 'LOGSTATS_INTERVAL': 0}
2016-10-03 11:45:08 [scrapy] INFO: Enabled extensions:
['scrapy.extensions.telnet.TelnetConsole',
'scrapy.extensions.corestats.CoreStats']
2016-10-03 11:45:08 [scrapy] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
'scrapy.downloadermiddlewares.retry.RetryMiddleware',
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
'scrapy.downloadermiddlewares.chunked.ChunkedTransferMiddleware',
'scrapy.downloadermiddlewares.stats.DownloaderStats']
2016-10-03 11:45:08 [scrapy] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
'scrapy.spidermiddlewares.referer.RefererMiddleware',
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
'scrapy.spidermiddlewares.depth.DepthMiddleware']
2016-10-03 11:45:08 [scrapy] INFO: Enabled item pipelines:
[]
2016-10-03 11:45:08 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-10-03 11:45:08 [scrapy] INFO: Spider opened
2016-10-03 11:45:09 [scrapy] DEBUG: Crawled (200) <GET http://www.yiibai.com/robots.txt> (referer: None)
2016-10-03 11:45:09 [scrapy] DEBUG: Crawled (200) <GET http://www.yiibai.com/scrapy/scrapy_environment.html> (referer: None)
[s] Available Scrapy objects:
[s] crawler <scrapy.crawler.Crawler object at 0x00000000042E3E80>
[s] item {}
[s] request <GET http://www.yiibai.com/scrapy/scrapy_environment.html>
[s] response <200 http://www.yiibai.com/scrapy/scrapy_environment.html>
[s] settings <scrapy.settings.Settings object at 0x00000000042E3E10>
[s] spider <firstSpider 'first' at 0x47f9f28>
[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
>>>
当 shell 加载后,可以分别通过使用 response.body 和 response.header 访问主体或头信息。同样,也可以通过使用 response.selector.xpath()或 response.selector.css()运行查询的响应结果。
例如:
>>> response.xpath('//title')
[<Selector xpath='//title' data=u'<title>Scrapyu5b89u88c5 - Scrapyu6559u7a0b</title>'>]
>>> response.xpath('//title').extract()
[u'<title>Scrapyu5b89u88c5 - Scrapyu6559u7a0b</title>']
>>> response.xpath('//title/text()')
[<Selector xpath='//title/text()' data=u'Scrapyu5b89u88c5 - Scrapyu6559u7a0b'>]
>>> response.xpath('//title/text()').extract()
[u'Scrapyu5b89u88c5 - Scrapyu6559u7a0b']
>>> response.xpath('//title/text()').extract()
[u'Scrapyu5b89u88c5 - Scrapyu6559u7a0b']
>>> response.xpath('//title/text()').re('(w+):')
[]
>>>
提取数据
从一个普通的HTML网站提取数据,查看该网站得到的 XPath 的源代码。检测后,可以看到数据将在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