Scrapy快速入门
最好的学习方法是参考例子,Scrapy 也不例外。出于这个原因,有一个 Scrapy 项目名为 quotesbot 例子,可以参考它了解和使用 Scrapy。它包含两个蜘蛛用于抓取 http://quotes.toscrape.com, 一个使用CSS选择器,而另一个使用XPath表达式。
提示:安装 Scrapy 开发环境配置请参考 - http://www.yiibai.com/scrapy/scrapy_environment.html
项目 quotesbot 的源代码可在: https://github.com/scrapy/quotesbot. 在这里可以找到关于项目 README 更多信息。
如果你熟悉使用 Git,可以检出的代码。否则点击这里下载该项目源代码的 zip 文件。
现在我们一步步的了解和学习这个项目。
quotesbot 项目简介
这是一个 Scrapy
示例(入门)的项目,它实现从 http://quotes.toscrape.com 上爬行抓取名人名言。
这个项目只是针对学习演示目的。
提取数据
这个项目将提取名言,以及各自的作者姓名和标签相结合。提取的数据看起来是这样的,如下例子:
{
'author': 'Douglas Adams',
'text': '“I may not have gone where I intended to go, but I think I ...”',
'tags': ['life', 'navigation']
}
蜘蛛 - Spiders
该项目包含两个蜘蛛(Spider
),可以使用 list
命令列出它们:
$ scrapy list
toscrape-css
toscrape-xpath
这两种蜘蛛提取同一网站相同的数据,但是如果要刮取 CSS
,则使用 CSS
选择器,而要刮取 XPath
则采用 XPath
表达式。
您可以通过Scrapy教程去了解更多的蜘蛛。
运行蜘蛛
您可以使用 scrapy
爬行的命令,如运行一个蜘蛛:
$ scrapy crawl toscrape-css
如果想保存数据刮到一个文件,可以通过 -o
选项:
$ scrapy crawl toscrape-css -o quotes.json
代码实现
我们先来看看 quotesbot/spiders/toscrape-xpath.py
的代码实现 -
# -*- coding: utf-8 -*-
import scrapy
class ToScrapeSpiderXPath(scrapy.Spider):
name = 'toscrape-xpath'
start_urls = [
'http://quotes.toscrape.com/',
]
def parse(self, response):
for quote in response.xpath('//div[@class="quote"]'):
yield {
'text': quote.xpath('./span[@class="text"]/text()').extract_first(),
'author': quote.xpath('.//small[@class="author"]/text()').extract_first(),
'tags': quote.xpath('.//div[@class="tags"]/a[@class="tag"]/text()').extract()
}
next_page_url = response.xpath('//li[@class="next"]/a/@href').extract_first()
if next_page_url is not None:
yield scrapy.Request(response.urljoin(next_page_url))
另外一个 Spider 采用 XPath 表达式 quotesbot/spiders/toscrape-xpath.py
的代码实现 -
# -*- coding: utf-8 -*-
import scrapy
class ToScrapeSpiderXPath(scrapy.Spider):
name = 'toscrape-xpath'
start_urls = [
'http://quotes.toscrape.com/',
]
def parse(self, response):
for quote in response.xpath('//div[@class="quote"]'):
yield {
'text': quote.xpath('./span[@class="text"]/text()').extract_first(),
'author': quote.xpath('.//small[@class="author"]/text()').extract_first(),
'tags': quote.xpath('.//div[@class="tags"]/a[@class="tag"]/text()').extract()
}
next_page_url = response.xpath('//li[@class="next"]/a/@href').extract_first()
if next_page_url is not None:
yield scrapy.Request(response.urljoin(next_page_url))