Scrapy将数据写入Elasticsearch

平生万般情思皆修善果 --若然是错


Scrapy将数据写入到Elsaticsearch


安装Elasticsearch

这里我们安装的是elasticsearch-rtf
(elasticsearch中文发行版,针对中文集成了相关插件,方便新手学习测试。)

这里是github上的链接,可以使用git工具clone,或者直接下载zip,解压后的文件夹名称应该是elasticsearch-rtf-master,cd进去,执行bin里面的elasticsearch文件,windows用户应该是.bat文件,直接双击运行。

输出本地服务端口信息(127.0.0.1:9200)等信息,表示启动成功

Scrapy将数据写入Elasticsearch_第1张图片

安装Elasticsearch-head

elasticsearch的一个前端界面,可视化程度较高

这里是github的链接


(下载后,解压进入文件夹中)
cd elasticsearch-head
(安装cnpm,淘宝的镜像,加速执行过程)
npm install cnpm
cnpm install
cnpm run start

Scrapy将数据写入Elasticsearch_第2张图片
如图示,则启动成功,本地端口号:9100

安装kibana

Kibana 是一个开源的分析和可视化平台,旨在与 Elasticsearch 合作。Kibana 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员可以轻松地执行高级数据分析,并在各种图表、表格和地图中可视化数据。

我们去elasticsearch官网下载对应版本操作系统的kibana
Scrapy将数据写入Elasticsearch_第3张图片

解压后执行bin下面的kibana shell文件
Scrapy将数据写入Elasticsearch_第4张图片

成功启动的kibana:(本地端口5601)
Scrapy将数据写入Elasticsearch_第5张图片

安装Elasticsearch-dsl

进入项目的虚拟环境,安装Elasticsearch-dsl插件,此插件是对原生的elasticsearch的高级封装,简化了elasticsearch的操作,可以基于此建立与本地elasticsearch服务器的连接。

pip install elasticsearch-dsl

项目的根路径建立models文件夹,新建es_type.py文件夹,我们在里面定义文章的类型


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

from elasticsearch_dsl import DocType,Nested,Date,Boolean,analyzer,Completion,Text,Keyword,Integer
from elasticsearch_dsl.connections import connections

# 新建连接
connections.create_connection(hosts="127.0.0.1")

class ArticleType(DocType):
    # 文章类型
    title = Text(analyzer="ik_max_word")
    create_date = Date()

    url = Keyword()
    url_object_id = Keyword()

    front_image_url = Keyword()
    front_image_path = Keyword()

    praise_nums = Integer()
    comment_nums = Integer()
    fav_nums = Integer()

    tags = Text(analyzer="ik_max_word")
    content = Text(analyzer="ik_max_word")

    class Meta:
        # 数据库名称和表名称
        index = "jobbole"
        doc_type = "article"

if __name__ == '__main__':
    ArticleType.init()

执行es_type.py,我们发现jobbole Index(数据库)已经创建好了

Scrapy将数据写入Elasticsearch_第6张图片
我们通过类初始化很容易的写入了元数据(mapping信息)
Scrapy将数据写入Elasticsearch_第7张图片

接下来我们在pipeline.py中创建一个pipeline来做数据的填充


from .models.es_type import ArticleType
# 去除html tags
from w3lib.html import remove_tags


class ElasticsearchPipeline(object):
    # 将数据写入到ES中

    def process_item(self,item,spider):
        # 将item转换为ES的数据
        article = ArticleType()

        article.title = item['title']
        article.create_date = item['create_date']

        article.content = remove_tags(item['content'])
        article.tags = item['tags']

        article.front_image_url = item['front_image_url']
        if "front_image_path" in item:
            article.front_image_path = item['front_image_path']

        article.fav_nums = item['fav_nums']
        article.comment_nums = item['comment_nums']
        article.praise_nums = item['praise_nums']

        article.url = item['url']
        article.meta.id = item['url_object_id']

        article.save()

        return item

当然,不要忘了将我们的pipeline添加到settings.py文件中:


#为了做效果展示,我们将其他的pipeline先注释掉
ITEM_PIPELINES = {
    # 'ArticleSpider.pipelines.ArticlespiderPipeline': 300,
    # 'scrapy.pipelines.images.ImagesPipeline':1,
    # "ArticleSpider.pipelines.ArticleImagePipeline":1,
    # "ArticleSpider.pipelines.JsonWithEncodingPipeline":2,
    # "ArticleSpider.pipelines.JsonExporterPipeline":1,
    # "ArticleSpider.pipelines.MysqlPipeline":2,
    # "ArticleSpider.pipelines.MysqlTwistedPipeline":2,
    'ArticleSpider.pipelines.ElasticsearchPipeline':1
}

执行我们的爬虫(main文件),会看到已经插入的数据

Scrapy将数据写入Elasticsearch_第8张图片


你可能感兴趣的:(Scrapy将数据写入Elasticsearch)