Scrapy框架连接ES

本文介绍如何使用Python的Scrapy框架抓取网络数据,并通过自定义管道将这些数据保存到Elasticsearch(ES)中。文章详细展示了从创建ES连接、定义数据模型到实现自动补全搜索功能的具体步骤。
摘要由CSDN通过智能技术生成

目的: 将Scrapy爬取的数据保存到ES中!


1. 新建一个py文件, 名字自取(如es_model.py)

# 字段类型
from elasticsearch_dsl import DocType, Completion, Keyword, Text, Boolean, Integer, Date
# 链接函数
from elasticsearch_dsl.connections import connections
# 分析器
from elasticsearch_dsl.analysis import CustomAnalyzer

# 1. 创建es连接,参数就是es的地址
connections.create_connection(hosts=["127.0.0.1"])


# 自定义一个分词器
class Analyzer(CustomAnalyzer):
    # 返回分析器对象
    def get_analysis_definition(self):
        return {}


# 创建分析器对象
ik_analyzer = Analyzer('ik_max_word', filter=['lowercase'])


class Field(DocType):
    # 搜索框中的自动补齐功能
    suggest = Completion(analyzer=ik_analyzer)
    # ik_max_word 分词策略 细分
    # ik_smart 分词策略 粗分
    # analyzer: 分析器(意思)
    name = Text(analyzer='ik_max_word')
    author = Text(analyzer='ik_max_word')
    content = Text()

    class Meta:
        index = 'novels'
        doc_type = 'novel'

if __name__ == '__main__':
    Field.init()


2. 在pipelines.py文件中建一个pipline

# 将爬虫爬取的数据存储搜索服务器中
class EsPipline(object):

    def process_item(self, item, spider):
        item.save_es()
        return item


3. 在settings中设置优先级

ITEM_PIPELINES = {
   'PaCongSpider.pipelines.EsPipline': 3,
}


4. 在items.py中

import scrapy
from .es_model import Field
from elasticsearch_dsl.connections import connections
es = connections.create_connection(hosts=['127.0.0.1'])


class PacongspiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass


# 将建立的字段进行分词处理
# *args 元组 **args字典
def conduct_suggest(index, *args):
    """

    :param index: 操作的数据库
    :param args: 需要进行分词的内容
    :return: 返回分词之后的列表
    """
    # 声明空集合
    use_words = set()
    # 声明列表
    suggest = []
    # 分词的分重
    for text, weight in args:
        # 调用分词接口
        words = es.indices.analyze(
            index=index,
            params={
                'filter': ['lowercase']
            },
            body={
                'analyzer': 'ik_max_word',
                'text': text
            }
        )
        analyzer_word = set([x['token'] for x in words['tokens']])
        print(analyzer_word)
        # 计算差集
        new_words = analyzer_word - use_words
        # 加入suggest之前,这条数据在suggest是不存在的
        suggest.append({'input': list(new_words), 'weight': weight})
        use_words = analyzer_word
    # suggest是没有重复数据的
    # [{'input':['土豆','豆','逆','袭'],'weight':10},{'words':['天蚕'],'weight':8}]
    return suggest


class QiShuItem(scrapy.Item):
    novel_name = scrapy.Field()
    novel_author = scrapy.Field()
    novel_content = scrapy.Field()

    # 将数据保存到es搜索服务器中
    def save_es(self):
        novel = Field()
        # 从传递进来的item中取值
        novel.name = self['novel_name']
        novel.author = self['novel_author']
        novel.content = self['novel_content']
        # 将数据对应分词信息进行保存
        # 将某些字段进行分词处理, 将处理后的数据保存到suggest中
        novel.suggest = conduct_suggest('novels', (novel.name, 10), (novel.author, 8))
        novel.save()


5. 只要你的Scrapy运行没有问题, 这样就保存到ES当中!








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

她最爱橘了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值