一、安装相应的库
二、创建项目
scrapy startproject tutorial
我们会得到一个叫tutorial的文件夹,文件夹结构如下:
三、创建Spider
cd tutorial
scrapy genspider quotes quotes.toscrape.com
执行genspider命令。第一个参数是Spider的名称,第二个参数是网站域名。
执行结束之后,spider文件夹中多了一个quotes.py,它就是刚刚创建的Spider
# -*- coding: utf-8 -*-
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
allowed_domains = ["quotes.toscrape.com"]
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
pass
这里有三个属性——name,allowed_domains和start_urls,还有一个方法parse
四、创建Item
Item是保存爬取数据的容器,它的使用方法和字典类似。
创建Item需要继承scrapy.Item类,并且定义类型为scrapy.Field的字段。
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class QuoteItem(scrapy.Item):
text = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()
五、解析Response
parse()方法的参数response是start_urls里面的链接爬取后的结果。所以我们可以直接对response变量包含的内容进行解析,
def parse(self, response):
quotes = response.css('.quote')
for quote in quotes:
text = quote.css('.text::text').extract_first()
author= quote.css('.author::text').extract_first()
tags = quote.css('.tags .tag::text').extract()
六、使用Item
# -*- coding: utf-8 -*-
import scrapy
from tutorial.items import QuoteItem
class QuotesSpider(scrapy.Spider):
name = "quotes"
allowed_domains = ["quotes.toscrape.com"]
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
quotes = response.css('.quote')
for quote in quotes:
item = QuoteItem()
item['text'] = quote.css('.text::text').extract_first()
item['author'] = quote.css('.author::text').extract_first()
item['tags'] = quote.css('.tags .tag::text').extract()
yield item
这样,首页的所有内容被解析出来,并被复制成了一个个QuoteItem
七、后续Request
我们需要从当前页面中找到信息来生成下一个请求,然后在下一个请求的页面里找到信息再构造下一个请求。
构造请求时需要用到scrapy.Request.这里我们传递两个参数——url和callback
url:它是请求链接
callback:它是回调函数。当指定了该回调函数的请求完成之后,获取到响应,引擎会将该响应作为参数传递给这个回调函数。回调函数进行解析或生成下一个请求,回调函数如上文的parse()所示
next = response.css('.pager .next a::attr("href")').extract_first()
url = response.urljoin (next)
yield scrapy.Request (url=url, callback=self.parse)
八、运行
scrapy crawl quotes
九、保存到文件
scrapy crawl quotes -o quotes.json
十、使用Item Pipeline
Item Pipeline为项目管道。当Item生成后,他会被自动送到Item Pipeline进行处理,我们常用Item Pipeline来实习
要实现Item Pipeline,只需要定义一个类并实现process_item().process_item()方法必须返回包含数据的字典或Item对象,或者抛出DropItem异常
process_item()有两个参数。一个参数是item,每次Spider生成的Item都会作为参数传递过来,另一个是spider,就是Spider的实例。
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
from scrapy.exceptions import DropItem
class TutorialPipeline(object):
def __init__(self):
self.limit = 50
def process_item(self, item, spider):
if item['text']:
if len(item['text']) > self.limit:
item['text'] = item['text'][0:self.limit].rstrip()+'...'
return item
else:
return DropItem('Missing Text')