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实现代码行数统计示例分享
Feb 10 Python
Linux下编译安装MySQL-Python教程
Feb 02 Python
简介Python的collections模块中defaultdict类型的用法
Jul 07 Python
Python实现iOS自动化打包详解步骤
Oct 03 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
Oct 14 Python
在matplotlib的图中设置中文标签的方法
Dec 13 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
快速解决vue.js 模板和jinja 模板冲突的问题
Jul 26 Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 Python
Elasticsearch 索引操作和增删改查
Apr 19 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
PHP入门速成教程
2007/03/19 PHP
php横向重复区域显示二法
2008/09/25 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
浅谈document.write()输出样式
2015/05/07 Javascript
JQuery删除DOM节点的方法
2015/06/11 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
2018/10/12 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
Python修改MP3文件的方法
2015/06/15 Python
Python的dict字典结构操作方法学习笔记
2016/05/07 Python
python编程实现希尔排序
2017/04/13 Python
python编写弹球游戏的实现代码
2018/03/12 Python
对pandas写入读取h5文件的方法详解
2018/12/28 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
一款利用html5和css3实现的3D立方体旋转效果教程
2016/04/26 HTML / CSS
canvas使用注意点总结
2013/07/19 HTML / CSS
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
网络安全方面的面试题
2015/11/04 面试题
工厂标语大全
2014/10/06 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
同意离婚答辩状
2015/05/22 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书