Python插入Elasticsearch操作方法解析


Posted in Python onJanuary 19, 2020

这篇文章主要介绍了Python插入Elasticsearch操作方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在用scrapy做爬虫的时候,需要将数据存入的es中。网上找了两种方法,照葫芦画瓢也能出来,暂记下来:

首先安装了es,版本是5.6.1的较早版本

用pip安装与es版本相对的es相关包

pip install elasticsearch-dsl==5.1.0

方法一:

以下是pipelines.py模块的完整代码

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

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

class SinafinancespiderPipeline(object):
  def process_item(self, item, spider):
    return item


# 写入到es中,需要在settings中启用这个类 ExchangeratespiderESPipeline
# 需要安装pip install elasticsearch-dsl==5.1.0 注意与es版本需要对应
from elasticsearch_dsl import Date,Nested,Boolean,analyzer,Completion,Keyword,Text,Integer,DocType
from elasticsearch_dsl.connections import connections
connections.create_connection(hosts=['192.168.52.138'])
from elasticsearch import Elasticsearch
es = Elasticsearch()

class AticleType(DocType):
  page_from = Keyword()
  # domain报错
  domain=Keyword()
  cra_url=Keyword()
  spider = Keyword()
  cra_time = Keyword()
  page_release_time = Keyword()
  page_title = Text(analyzer="ik_max_word")
  page_content = Text(analyzer="ik_max_word")
class Meta:
    index = "scrapy"
    doc_type = "sinafinance"
    # 以下settings和mappings都没起作用,暂且记下
    settings = {
      "number_of_shards": 3,
    }
    mappings = {
      '_id':{'path':'cra_url'}
    }


class ExchangeratespiderESPipeline(DocType):
  from elasticsearch5 import Elasticsearch
  ES = ['192.168.52.138:9200']
  es = Elasticsearch(ES,sniff_on_start=True)

  def process_item(self, item, spider):

    spider.logger.info("-----enter into insert ES")
    article = AticleType()

    article.page_from=item['page_from']
    article.domain=item['domain']
    article.cra_url =item['cra_url']
    article.spider =item['spider']
    article.cra_time =item['cra_time']
    article.page_release_time =item['page_release_time']
    article.page_title =item['page_title']
    article.page_content =item['page_content']

    article.save()
    return item

以上方法能将数据写入es,但是如果重复爬取的话,会重复插入数据,因为 主键 ”_id” 是ES自己产生的,找不到自定义_id的入口。于是放弃。

方法二:实现自定义主键写入,覆盖插入

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

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

class SinafinancespiderPipeline(object):
  def process_item(self, item, spider):
    return item


# 写入到es中,需要在settings中启用这个类 ExchangeratespiderESPipeline
# 需要安装pip install elasticsearch-dsl==5.1.0 注意与es版本需要对应
class SinafinancespiderESPipeline():
  def __init__(self):
    self.ES = ['192.168.52.138:9200']
    # 创建es客户端
    self.es = Elasticsearch(
      self.ES,
      # 启动前嗅探es集群服务器
      sniff_on_start=True,
      # es集群服务器结点连接异常时是否刷新es结点信息
      sniff_on_connection_fail=True,
      # 每60秒刷新节点信息
      sniffer_timeout=60
    )

  def process_item(self, item, spider):
    spider.logger.info("-----enter into insert ES")
    doc = {
      'page_from': item['page_from'],
      'domain': item['domain'],
      'spider': item['spider'],
      'page_release_time': item['page_release_time'],
      'page_title': item['page_title'],
      'page_content': item['page_content'],
      'cra_url': item['cra_url'],
      'cra_time': item['cra_time']
    }
    self.es.index(index='scrapy', doc_type='sinafinance', body=doc, id=item['cra_url'])

    return item

搜索数据的方法:

# 字典形式设置body
query = {
 'query': {
  'bool': {
   'must': [
    {'match': {'_all': 'python web'}}
   ],
   'filter': [
    {'term': {'status': 2}}
   ]
  }
 }
}
ret = es.search(index='articles', doc_type='article', body=query)

# 查询数据
data = es.search(index='articles', doc_type='article', body=body)
print(data)
# 增加
es.index(...)
# 修改
es.update(...)
# 删除
es.delete()

完成后

在settings.py模块中注册自定义的类

ITEM_PIPELINES = {
  # 'sinafinancespider.pipelines.SinafinancespiderPipeline': 300,
  'sinafinancespider.pipelines.SinafinancespiderESPipeline': 300,
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python对html代码进行escape编码的方法
May 04 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
Aug 23 Python
pandas数据处理基础之筛选指定行或者指定列的数据
May 03 Python
Pyecharts绘制全球流向图的示例代码
Jan 08 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
Jan 10 Python
matplotlib quiver箭图绘制案例
Apr 17 Python
使用python实现CGI环境搭建过程解析
Apr 28 Python
Python configparser模块操作代码实例
Jun 08 Python
Python 整行读取文本方法并去掉readlines换行\n操作
Sep 03 Python
Python如何在bool函数中取值
Sep 21 Python
python中如何打包用户自定义模块
Sep 23 Python
python index() 与 rindex() 方法的使用示例详解
Dec 24 Python
Docker部署Python爬虫项目的方法步骤
Jan 19 #Python
Python Selenium参数配置方法解析
Jan 19 #Python
浅谈tensorflow中张量的提取值和赋值
Jan 19 #Python
python通过安装itchat包实现微信自动回复收到的春节祝福
Jan 19 #Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 #Python
Python openpyxl模块原理及用法解析
Jan 19 #Python
Python imutils 填充图片周边为黑色的实现
Jan 19 #Python
You might like
制作美丽的拉花
2021/03/03 冲泡冲煮
php中数据的批量导入(csv文件)
2006/10/09 PHP
非常实用的php验证码类
2016/05/15 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
利用div+jquery自定义滚动条样式的2种方法
2013/07/18 Javascript
checkbox全选所涉及到的知识点介绍
2013/12/31 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
3种vue路由传参的基本模式
2018/02/22 Javascript
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
layui操作列按钮个数和文字颜色的判断实例
2019/09/11 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
Python转换时间的图文方法
2019/07/01 Python
深入分析python 排序
2020/08/24 Python
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
书法培训心得体会
2014/01/05 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
Python中json.dumps()函数的使用解析
2021/05/17 Python
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript
Python 数据可视化之Matplotlib详解
2021/11/02 Python