因为 Scrapy 官方教程中爬取的 Domz 网站已经关闭了(2333),官方教程现在改用:" http://quotes.toscrape.com " 来作为例子,所以我们重写一下。
并且,Scrapy 版本已经更新到1.3,这里我们改用1.3版本来学习。
1. 编写第一个爬虫(Spider)
在 tutorial/spiders
文件夹下新建一个 Python 文件,命名为 quotes_spider.py
,编辑该文件:
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
]
# 用 parse 方法处理 urls 里面的 url
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
# 爬取相应信息
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').extract_first(),
'author': quote.css('small.author::text').extract_first(),
'tags': quote.css('div.tags a.tag::text').extract(),
}
start_requests()
可以用更简便的写法,把初始 url 放在 start_urls
列表中即可:
# -*- coding: utf-8 -*-
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').extract_first(),
'author': quote.css('small.author::text').extract_first(),
'tags': quote.css('div.tags a.tag::text').extract(),
}
3.爬取
进入项目的根目录,命令行中执行下列命令启动 spider:
scrapy crawl quotes
crawl quotes
命令启动名为 quotes 的 spider,您将得到类似的输出:
2016-09-19 18:57:19 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/1/>
{'tags': ['life', 'love'], 'author': 'André Gide', 'text': '“It is better to be hated for what you are than to be loved for what you are not.”'}
2016-09-19 18:57:19 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/1/>
{'tags': ['edison', 'failure', 'inspirational', 'paraphrased'], 'author': 'Thomas A. Edison', 'text': "“I have not failed. I've just found 10,000 ways that won't work.”"}
(这里我省略了 Scrapy 执行时候的运行信息,只截取一段 print 的包含 'author' 和 'text' 的信息)
4.保存爬取到的数据
最简单存储爬取的数据的方式是使用 Feed exports:
scrapy crawl quotes -o items.json
该命令将采用 JSON 格式对爬取的数据进行序列化,并在根目录生成 items.json
文件。