Scrapy框架(一):基本结构

一、安装相应的库

二、创建项目

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')

猜你喜欢

转载自blog.csdn.net/Mai_Dreizehn/article/details/86518827