设为首页 加入收藏

TOP

关于爬虫平台的架构设计实现和框架的选型(一)(一)
2019-10-09 20:03:13 】 浏览:294
Tags:关于 爬虫 平台 架构 设计 实现 框架 选型

关于爬虫平台的架构设计实现和框架的选型(一)

关于爬虫平台的架构设计实现和框架的选型(二)--scrapy的内部实现以及实时爬虫的实现

 

首先来看一下一个爬虫平台的设计,作为一个爬虫平台,需要支撑多种不同的爬虫方式,所以一般爬虫平台需要包括

1、 爬虫规则的维护,平台在接收到爬虫请求时,需要能按照匹配一定的规则去进行自动爬虫

2、 爬虫的job调度器,平台需要能负责爬虫任务的调度,比如定时调度,轮询调度等。

3、 爬虫可以包括异步的海量爬虫,也可以包括实时爬虫,异步爬虫指的是爬虫的数据不会实时返回,可能一个爬虫任务会执行很久。 实时爬虫指爬的数据要实时返回,这个就要求时间很短,一般适合少量数据的爬虫。

4、 爬虫好的数据可以生成指定的文件,比如csv文件,json文件等,然后通过数据处理引擎做统一处理,比如csv文件可以通过数据交换落入大数据平台,或者爬虫好的数据也可以丢入kafka中,然后再通过流式处理任务(spark或者storm,flink)做爬虫数据的清洗和处理,处理完的数据,可以入到数据库中。

下图就是在平台设计时,爬虫处理的一个流程,这个里面包含了实时爬虫,异步爬虫。

 

根据上图的处理流程,我们可以把架构图进一步演进下

 

 

时序图如下:

 

 

 

我们这里先介绍异步爬虫,爬虫的框架很多,异步爬虫一般用的比较多就是scrapy。

首先安装scrapy

pip install scrapy

  

安装完成后,就可以通过命令行创建一个基于scrapy的爬虫项目,我们以爬取应用宝中理财类APP的名称为示例

 

 

 

创建爬虫项目的命令行命令:

scrapy startproject zj_scrapy

  

然后在命令行中,进入到创建的zj_scrapy目录下

 

cd zj_scrapy

 

执行
scrapy genspider sjqq “sj.qq.com” 

  

创建一个爬虫
爬虫创建好了后,可以使用IDE打开创建好的python项目,比如用idea(需要安装python插件,默认没有安装)打开我们创建好的项目

项目创建好了后,会默认生成一些模板代码文件
  1、 
  items.py
items用于存储字段的定义。即爬取的内容存与item类中,在这里我们定义了一个name字段。

# -*- 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 ZjScrapyItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name = scrapy.Field()
    pass

  

  2、 
  spider文件编写
这个文件一般在spiders 这个package下面,默认会继承scrapy.Spider

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import HtmlResponse

from zj_scrapy.items import ZjScrapyItem


class SjqqSpider(scrapy.Spider):
    name = 'sjqq'
    allowed_domains = ['sj.qq.com']
    start_urls = ['https://sj.qq.com/myapp/category.htm?orgame=1&categoryId=114']

    def parse(self, response:HtmlResponse):
        name_list =  response.xpath('/html/body/div[3]/div[2]/ul/li')
        print("=============",response.headers)
        for each in name_list:
            item = ZjScrapyItem()
            name = each.xpath('./div/div/a[1]/text()').extract()
            item['name'] = name[0]
            yield item
        pass

  关于这段代码的解释如下:

  3、 
  pipeline文件编写
pipeline文件一般用于对处理好的爬虫结果数据做处理,可以入到数据库中,也可以生成到指定的文件中,process_item 方法就是对数据做处理的。
另外pipeline 还包含了__init__和close_spider 两个方法。__init__ 用于做初始化处理。  close_spider 用于执行结束时的操作处理。比如数据写入数据库或者文件后,对数据库做链接关闭或者文件流做关闭操作等。
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html


class ZjScrapyPipeline(object):
    def process_item(self, item, spider):
        print("+++++++++++++++++++",item['name'])
        print("-------------------",spider.cc)
        return item

  

  4、 
  setting文件修改
setting文件中存放的是爬虫的配置,常用的配置一般可以包括
1)、ITEM_PIPELINES的配置,比如
ITEM_PIPELINES = {
    'zj_scrapy.pipelines.ZjScrapyPipeline': 300,
}
这里的300代表了一个优先级,数值范围一般在0-1000,这个数值确定了运行的顺序,数字越小,优先级越高。
2)、字符集配置,可以通过FEED_EXPORT_ENCODING指定字符集
FEED_EXPORT_ENCODING = 'utf-8'
3)、CONCURRENT_REQUESTS配置Scrapy执行的最大并发请求数
# Configure maximum concurrent requests performed by Scrapy (default: 16)
CONCURRENT_REQUESTS = 32
4)配置请求的header,可以通过DEFAULT_REQUEST_HEADERS来进行配置
DEFAULT_REQUES
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇设计模式-行为型-中介者模式 下一篇关于爬虫平台的架构设计实现和框..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目