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基础教程之常用运算符
Aug 29 Python
python检测远程端口是否打开的方法
Mar 14 Python
在Python程序中操作文件之flush()方法的使用教程
May 24 Python
Python实现模拟登录及表单提交的方法
Jul 25 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
python字典改变value值方法总结
Jun 21 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
常用python爬虫库介绍与简要说明
Jan 25 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
简单了解pytest测试框架setup和tearDown
Apr 14 Python
python爬虫之selenium库的安装及使用教程
May 23 Python
利用Python多线程实现图片下载器
Mar 25 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 XML error parsing SOAP payload on line 1
2010/06/17 PHP
php错误、异常处理机制(补充)
2012/05/07 PHP
php简单实现无限分类树形列表的方法
2015/03/27 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
jQuery实战之仿淘宝商城左侧导航效果
2011/04/12 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
JQuery ztree带筛选、异步加载实例讲解
2016/02/25 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
vue实现引入本地json的方法分析
2018/07/12 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
Python编程scoketServer实现多线程同步实例代码
2018/01/29 Python
pymongo中group by的操作方法教程
2019/03/22 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
python生成大写32位uuid代码
2020/03/03 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
详解如何解决H5开发使用wx.hideMenuItems无效果不生效
2021/01/20 HTML / CSS
办公室文书岗位职责
2013/12/16 职场文书
新郎婚宴答谢词
2014/01/19 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
个人借款担保书
2014/04/02 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
会议室使用管理制度
2015/08/06 职场文书
2019森林防火宣传标语大全!
2019/07/03 职场文书
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers
JavaScript实现音乐播放器
2022/08/14 Javascript