爬虫——scrapy框架

Scrapy是一个异步处理框架,是纯Python实现的爬虫框架,其架构清晰,模块之间的耦合程度低,可拓展性强,可以灵活完成各种需求。我们只需要定制几个模块就可以轻松实现一个爬虫。

1.架构

 Scrapy Engine,引擎,负责整个系统的数据流处理、触发事务,是整个框架的核心。

Item,项目,它定义了爬取结果的数据结构,爬取的数据会被赋值成Item对象。

Scheduler,调度器,接受引擎发送过来的请求,并将其加入到队列之中,在引擎再次请求时将请求提供给引擎。

Downloader,下载器,下载网页内容,并将网页内容返回给爬虫。

Sprider,爬虫,其内定义了爬取逻辑和网页的解析规则,它主要负责解析响应并生成提取结果的新的请求。

Item Pipeline,项目管道,负责处理由爬虫从网页中提取的项目,它的主要任务是清洗、验证和存储数据。

Downloader Middlewares,下载器中间件,位于引擎和下载器直接的钩子框架,主要处理引擎与下载器之间的请求和响应。

Spider Middle,爬虫中间件,位于引擎和爬虫之间的钩子框架,主要处理爬虫输入的响应和输出的结果及新请求。

2.数据流

Scrapy中的数据流由引擎控制,数据流的过程如下:

(1)scrapy engine打开一个网站,找到该网站的Sprider,并向该Sprider请求第一个需要爬取的URL。

3.创建项目

在pycharm的终端Terminal :  scrapy startproject tutorial

然后在pycharm打开该项目得到如下目录:

  • scrapy.cfg: 项目的配置文件
  • tutorial/items.py: 项目中的item文件,定义数据结构。
  • tutorial/pipelines.py: 项目中的pipelines文件,数据存储,操作数据。
  • tutorial/settings.py: 项目的设置文件。
  • tutorial/spiders/: 放置spider代码的目录。

4.创建Spider

spider是自己定义的类,Scrapy用它来抓取内容。并解析抓取的结果。不过这个类必须继承Scrapy提供的Spider类scrapy.Sprider,还要定义Spider的名称和起始请求。

 

命令行创建spider :  scrapy genspider quotes quotes.toscrape.com

# -*- coding: utf-8 -*- import scrapy class QuotesSpider(scrapy.Spider): name = 'quotes' #用来区分不同的Spider allowed_domains = ['quotes.toscrape.com'] #允许爬取的域名 start_urls = ['http://quotes.toscrape.com/'] #spider启动时爬取的url列表 def parse(self, response):
#负责解析返回的响应、提取数据或者进一步生成要处理的请求。
#response是爬取start_url的结果
        pass

 4.创建item

 item需要继承scrapy.Item类,并且定义类型为scrapy.Field的字段。假设我们需要获取的内容是name、age、 sex。

 修改item.py如下:

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#保存和爬取数据的容器
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class QuoteItem(scrapy.Item):
    # define the fields for your item here like:
    name = scrapy.Field()
    age = scrapy.Field()
    sex = scrapy.Field()
    pass

 

scrapy demo:爬取http://quotes.toscrape.com/的author、text、tags,并保存为json、csv文件。

 

items.py
# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#保存和爬取数据的容器
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class QuoteItem(scrapy.Item):
# define the fields for your item here like:
text = scrapy.Field()
author = scrapy.Field()
# tags = scrapy.Field()
pass

spirders/quotes.py

# -*- coding: utf-8 -*- import scrapy from tutorial.items import QuoteItem class QuotesSpider(scrapy.Spider): name = 'quotes' #用来区分不同的Spider allowed_domains = ['quotes.toscrape.com'] #允许爬取的域名 start_urls = ['http://quotes.toscrape.com/'] #spider启动时爬取的url列表 def parse(self, response): #负责解析返回的响应、提取数据或者进一步生成要处理的请求 #数据提取 quotes = response.css('.quote') #选择所有的quote for quote in quotes: item = QuoteItem() #.text::text 表示选择class=text的节点的正文内容 item['text'] = quote.css('.text::text').extract_first() #获取节点的内容:.text::text表示获取其内容text item['author'] = quote.css('.author::text').extract_first()# .extract_first表示获取其正文的第一个元素 #item['tags'] = quote.css('.tags::text').extract_first() yield item next = response.css('.pager .next a::attr("href")').extract_first() #获取下一个需要爬取的页面 url = response.urljoin(next)#urljoin()将相对url构造成一个绝对url yield scrapy.Request(url=url,callback = self.parse) #回调函数


命令行运行: scrapy crawl quotes
执行完成后,我们可以在命令行查看运行结果,但是如何把执行结果保存为json文件或者csv文件呢?
scrapy支持多种格式输出:
scrapy crawl quotes -o quotes.json
scrapy crawl quotes -o quotes.csv
#运行成功后,项目根目录里会自动生成json和csv文件。

 

转载于:https://www.cnblogs.com/2sheep2simple/p/10331222.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值