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使用zip合并相邻列表项的方法示例
Mar 17 Python
Python实现的括号匹配判断功能示例
Aug 25 Python
Python分割指定页数的pdf文件方法
Oct 26 Python
python实现在cmd窗口显示彩色文字
Jun 24 Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 Python
Python实现在线批量美颜功能过程解析
Jun 10 Python
python中format函数如何使用
Jun 22 Python
Python下划线5种含义代码实例解析
Jul 10 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
Jul 13 Python
Python发送邮件实现基础解析
Aug 14 Python
python如何利用paramiko执行服务器命令
Nov 07 Python
发工资啦!教你用Python实现邮箱自动群发工资条
May 10 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
一个改进的UBB类
2006/10/09 PHP
PHP面向对象法则
2012/02/23 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
filemanage功能中用到的common.js
2007/04/08 Javascript
在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
2008/12/02 Javascript
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
JavaScript执行效率与性能提升方案
2012/12/21 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
2014/02/04 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
2015/06/17 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
require.js 加载过程与使用方法介绍
2018/10/30 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
python采用getopt解析命令行输入参数实例
2014/09/30 Python
Python基于scapy实现修改IP发送请求的方法示例
2017/07/08 Python
一文总结学习Python的14张思维导图
2017/10/17 Python
Python 函数基础知识汇总
2018/03/09 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
浅谈Python中的模块
2020/06/10 Python
python中的测试框架
2020/11/13 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
Python中生成ndarray实例讲解
2021/02/22 Python
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
行政文员岗位职责
2013/11/08 职场文书
驾驶员岗位职责
2014/01/29 职场文书
2014政务公开实施方案
2014/02/19 职场文书
菜篮子工程实施方案
2014/03/08 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
村庄绿化方案
2014/05/07 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
交通事故起诉书
2015/05/19 职场文书
讨论nginx location 顺序问题
2022/05/30 Servers
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android