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验证企业工商注册码
Oct 25 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
Nov 01 Python
Tornado高并发处理方法实例代码
Jan 15 Python
TensorFlow高效读取数据的方法示例
Feb 06 Python
python统计多维数组的行数和列数实例
Jun 23 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
谈一谈基于python的面向对象编程基础
May 21 Python
python 数据提取及拆分的实现代码
Aug 26 Python
python中删除某个元素的方法解析
Nov 05 Python
pytorch实现对输入超过三通道的数据进行训练
Jan 15 Python
python中urllib.request和requests的使用及区别详解
May 05 Python
Python机器学习应用之工业蒸汽数据分析篇详解
Jan 18 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
PHP中设置时区,记录日志文件的实现代码
2013/01/07 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
jquery插件开发注意事项小结
2013/06/04 Javascript
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
vue-router单页面路由
2017/06/17 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
vue实现拖拽进度条
2021/03/01 Vue.js
Python时间模块datetime、time、calendar的使用方法
2016/01/13 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
python for和else语句趣谈
2019/07/02 Python
基于python 等频分箱qcut问题的解决
2020/03/03 Python
使用python创建Excel工作簿及工作表过程图解
2020/05/27 Python
python属于解释型语言么
2020/06/15 Python
HTML5 微格式和相关的属性名称
2010/02/10 HTML / CSS
毕业生求职自荐书范文
2014/03/27 职场文书
学校地质灾害防治方案
2014/06/10 职场文书
部门活动策划方案
2014/08/16 职场文书
学习心理学的体会
2014/11/07 职场文书
刑事案件上诉状
2015/05/23 职场文书
士兵突击观后感
2015/06/16 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书
手写实现JS中的new
2021/11/07 Javascript
V Rising 服务器搭建图文教程
2022/06/16 Servers
5个实用的JavaScript新特性
2022/06/16 Javascript