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实现身份证号码解析
Sep 01 Python
python读取文件名称生成list的方法
Apr 27 Python
详解Python用户登录接口的方法
Apr 17 Python
Python中的上下文管理器相关知识详解
Sep 19 Python
python 使用shutil复制图片的例子
Dec 13 Python
Python+appium框架原生代码实现App自动化测试详解
Mar 06 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
Apr 26 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
Jun 03 Python
python爬虫构建代理ip池抓取数据库的示例代码
Sep 22 Python
Python本地及虚拟解释器配置过程解析
Oct 13 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 Python
Anaconda安装pytorch及配置PyCharm 2021环境
Jun 04 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 采集程序中常用的函数
2009/12/09 PHP
解析php中const与define的应用区别
2013/06/18 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
JavaScript职责链模式概述
2016/09/17 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
python之mock模块基本使用方法详解
2019/06/27 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
Python3爬虫中关于中文分词的详解
2020/07/29 Python
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
韩国江南富人区高端时尚百货商场:Galleria(格乐丽雅)
2018/03/27 全球购物
中科创达面试题
2016/12/28 面试题
心理健康教育心得体会
2013/12/29 职场文书
法制宣传口号
2014/06/16 职场文书
考博导师推荐信范文
2015/03/27 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
高通2023 年将发布高性能PC处理器
2022/04/29 数码科技