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 08 Python
Python中的类与对象之描述符详解
Mar 27 Python
以911新闻为例演示Python实现数据可视化的教程
Apr 23 Python
python实现通过代理服务器访问远程url的方法
Apr 29 Python
Python入门之三角函数全解【收藏】
Nov 08 Python
python实现Floyd算法
Jan 03 Python
python实现播放音频和录音功能示例代码
Dec 30 Python
python SQLAlchemy 中的Engine详解
Jul 04 Python
python爬虫 urllib模块发起post请求过程解析
Aug 20 Python
解决pycharm中导入自己写的.py函数出错问题
Feb 12 Python
浅谈python3 构造函数和析构函数
Mar 12 Python
Python提取PDF指定内容并生成新文件
Jun 09 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获取某个目录大小的代码
2008/09/10 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
ThinkPHP5框架中使用JWT的方法示例
2020/06/03 PHP
[原创]来自ImageSee官方 JavaScript图片浏览器
2008/01/16 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
js生成随机数之random函数随机示例
2013/12/20 Javascript
javascript获取flash版本号的方法
2014/11/20 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
javascript遍历json对象的key和任意js对象属性实例
2017/03/09 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
详解如何使用nvm管理Node.js多版本
2019/05/06 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
vue实现文字加密功能
2019/09/27 Javascript
解决vue项目F5刷新mounted里的函数不执行问题
2019/11/05 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
Python实现批量检测HTTP服务的状态
2016/10/27 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
Python能做什么
2020/06/02 Python
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
经济学人订阅:The Economist
2018/07/19 全球购物
中国制造网:Made-in-China.com
2019/10/25 全球购物
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
人力资源总监工作说明
2014/03/03 职场文书
教师节横幅标语
2014/10/08 职场文书
出国签证在职证明范本
2014/11/24 职场文书
本科毕业论文指导教师评语
2014/12/30 职场文书
2015年助残日活动总结
2015/03/27 职场文书
无线电知识基础入门篇
2022/02/18 无线电