手把手教你使用Flask搭建ES搜索引擎(预备篇)
/1 前言/
Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。
那么如何实现 Elasticsearch和 Python 的对接成为我们所关心的问题了 (怎么什么都要和 Python 关联啊)。
/2 Python 交互/
所以,Python 也就提供了可以对接 Elasticsearch的依赖库。
pip install elasticsearch
初始化连接一个 Elasticsearch 操作对象。
def __init__(self, index_type: str, index_name: str, ip="127.0.0.1"): # self.es = Elasticsearch([ip], http_auth=('username', 'password'), port=9200) self.es = Elasticsearch("localhost:9200") self.index_type = index_type self.index_name = index_name
默认端口 9200,初始化前请确保本地已搭建好 Elasticsearch的所属环境。
根据 ID 获取文档数据
def get_doc(self, uid): return self.es.get(index=self.index_name, id=uid)
插入文档数据
def insert_one(self, doc: dict): self.es.index(index=self.index_name, doc_type=self.index_type, body=doc) def insert_array(self, docs: list): for doc in docs: self.es.index(index=self.index_name, doc_type=self.index_type, body=doc)
搜索文档数据
def search(self, query, count: int = 30): dsl = { "query": { "multi_match": { "query": query, "fields": ["title", "content", "link"] } }, "highlight": { "fields": { "title": {} } } } match_data = self.es.search(index=self.index_name, body=dsl, size=count) return match_data def __search(self, query: dict, count: int = 20): # count: 返回的数据大小 results = [] params = { 'size': count } match_data = self.es.search(index=self.index_name, body=query, params=params) for hit in match_data['hits']['hits']: results.append(hit['_source']) return results
删除文档数据
def delete_index(self): try: self.es.indices.delete(index=self.index_name) except: pass
好啊,封装 search 类也是为了方便调用,整体贴一下。
from elasticsearch import Elasticsearch class elasticSearch(): def __init__(self, index_type: str, index_name: str, ip="127.0.0.1"): # self.es = Elasticsearch([ip], http_auth=('elastic', 'password'), port=9200) self.es = Elasticsearch("localhost:9200") self.index_type = index_type self.index_name = index_name def create_index(self): if self.es.indices.exists(index=self.index_name) is True: self.es.indices.delete(index=self.index_name) self.es.indices.create(index=self.index_name, ignore=400) def delete_index(self): try: self.es.indices.delete(index=self.index_name) except: pass def get_doc(self, uid): return self.es.get(index=self.index_name, id=uid) def insert_one(self, doc: dict): self.es.index(index=self.index_name, doc_type=self.index_type, body=doc) def insert_array(self, docs: list): for doc in docs: self.es.index(index=self.index_name, doc_type=self.index_type, body=doc) def search(self, query, count: int = 30): dsl = { "query": { "multi_match": { "query": query, "fields": ["title", "content", "link"] } }, "highlight": { "fields": { "title": {} } } } match_data = self.es.search(index=self.index_name, body=dsl, size=count) return match_data
尝试一下把 Mongodb 中的数据插入到 ES 中。
import json from datetime import datetime import pymongo from app.elasticsearchClass import elasticSearch client = pymongo.MongoClient('127.0.0.1', 27017) db = client['spider'] sheet = db.get_collection('Spider').find({}, {'_id': 0, }) es = elasticSearch(index_type="spider_data",index_name="spider") es.create_index() for i in sheet: data = { 'title': i["title"], 'content':i["data"], 'link': i["link"], 'create_time':datetime.now() } es.insert_one(doc=data)
到 ES 中查看一下,启动 elasticsearch-head 插件。
如果是 npm 安装的那么 cd 到根目录之后直接 npm run start 就跑起来了。
本地访问 http://localhost:9100/
发现新加的 spider 数据文档确实已经进去了。
/3 爬虫入库/
要想实现 ES 搜索,首先要有数据支持,而海量的数据往往来自爬虫。
为了节省时间,编写一个最简单的爬虫,抓取 百度百科。
简单粗暴一点,先 递归获取 很多很多的 url 链接
import requests import re import time exist_urls = [] headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36', } def get_link(url): try: response = requests.get(url=url, headers=headers) response.encoding = 'UTF-8' html = response.text link_lists = re.findall('.*?<a target=_blank href="/item/([^:#=<>]*?)".*?</a>', html) return link_lists except Exception as e: pass finally: exist_urls.append(url) # 当爬取深度小于10层时,递归调用主函数,继续爬取第二层的所有链接 def main(start_url, depth=1): link_lists = get_link(start_url) if link_lists: unique_lists = list(set(link_lists) - set(exist_urls)) for unique_url in unique_lists: unique_url = 'https://baike.baidu.com/item/' + unique_url with open('url.txt', 'a+') as f: f.write(unique_url + '\n') f.close() if depth < 10: main(unique_url, depth + 1) if __name__ == '__main__': start_url = 'https://baike.baidu.com/item/%E7%99%BE%E5%BA%A6%E7%99%BE%E7%A7%91' main(start_url)
把全部 url 存到 url.txt 文件中之后,然后启动任务。
# parse.py from celery import Celery import requests from lxml import etree import pymongo app = Celery('tasks', broker='redis://localhost:6379/2') client = pymongo.MongoClient('localhost',27017) db = client['baike'] @app.task def get_url(link): item = {} headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'} res = requests.get(link,headers=headers) res.encoding = 'UTF-8' doc = etree.HTML(res.text) content = doc.xpath("//div[@class='lemma-summary']/div[@class='para']//text()") print(res.status_code) print(link,'\t','++++++++++++++++++++') item['link'] = link data = ''.join(content).replace(' ', '').replace('\t', '').replace('\n', '').replace('\r', '') item['data'] = data if db['Baike'].insert(dict(item)): print("is OK ...") else: print('Fail')
run.py 飞起来
from parse import get_url def main(url): result = get_url.delay(url) return result def run(): with open('./url.txt', 'r') as f: for url in f.readlines(): main(url.strip('\n')) if __name__ == '__main__': run()
黑窗口键入
celery -A parse worker -l info -P gevent -c 10
哦豁 !! 你居然使用了 Celery 任务队列,gevent 模式,-c 就是10个线程刷刷刷就干起来了,速度杠杠的 !!
啥?分布式? 那就加多几台机器啦,直接把代码拷贝到目标服务器,通过 redis 共享队列协同多机抓取。
这里是先将数据存储到了 MongoDB 上(个人习惯),你也可以直接存到 ES 中,但是单条单条的插入速度堪忧(接下来会讲到优化,哈哈)。
使用前面的例子将 Mongo 中的数据批量导入到 ES 中,OK !!!
到这一个简单的数据抓取就已经完毕了。
好啦,现在 ES 中已经有了数据啦,接下来就应该是 Flask web 的操作啦,当然,Django,FastAPI 也很优秀。嘿嘿,你喜欢 !!
关于FastAPI 的文章可以看这个系列文章:
1、(入门篇)简析Python web框架FastAPI——一个比Flask和Tornada更高性能的API 框架
2、(进阶篇)Python web框架FastAPI——一个比Flask和Tornada更高性能的API 框架
3、(完结篇)Python web框架FastAPI——一个比Flask和Tornada更高性能的API 框架
/4 Flask 项目结构/
这样一来前期工作就差不多了,接下来剩下的工作主要集中于 Flask 的实际开发中,蓄力中 !!
以上是手把手教你使用Flask搭建ES搜索引擎(预备篇)的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

在第一部分介绍了基本的Flask和IntellijIDEA集成、项目和虚拟环境的设置、依赖安装等方面的内容。接下来我们将继续探讨更多的Pythonweb应用程序开发技巧,构建更高效的工作环境:使用FlaskBlueprintsFlaskBlueprints允许您组织应用程序代码以便于管理和维护。Blueprint是一个Python模块,能够包

如何利用React和Flask构建简单易用的网络应用引言:随着互联网的发展,网络应用的需求也越来越多样化和复杂化。为了满足用户对于易用性和性能的要求,使用现代化的技术栈来构建网络应用变得越来越重要。React和Flask是两种在前端和后端开发中非常受欢迎的框架,它们可以很好的结合在一起,用来构建简单易用的网络应用。本文将详细介绍如何利用React和Flask

Flask应用部署:GunicornvsuWSGI的比较引言:Flask作为一种轻量级的PythonWeb框架,受到了很多开发者的喜爱。在将Flask应用部署到生产环境时,选择适合的服务器网关接口(ServerGatewayInterface,简称SGI)是至关重要的决策。Gunicorn和uWSGI是两种常见的SGI服务器,本文将对它们进行详细的

Flask框架安装教程:一步步教你如何正确安装Flask框架,需要具体代码示例引言:Flask是一款简洁而灵活的PythonWeb开发框架。它易于学习、易于使用,并且具有强大的功能。本文将带领您一步步正确地安装Flask框架,并提供详细的代码示例供参考。第一步:安装Python在安装Flask框架之前,首先需要确保您的计算机上安装了Python。您可以从P

Django和Flask都是PythonWeb框架中的佼佼者,它们都有着自己的优点和适用场景。本文将对这两个框架进行对比分析,并提供具体的代码示例。开发简介Django是一个全功能的Web框架,它的主要目的是为了快速开发复杂的Web应用。Django提供了许多内置的功能,比如ORM(对象关系映射)、表单、认证、管理后台等。这些功能使得Django在处理大型

从零开始,手把手教你安装Flask和快速搭建个人博客作为一个喜欢写作的人来说,拥有一个个人博客是非常重要的。而Flask作为一个轻量级的PythonWeb框架,可以帮助我们快速搭建一个简洁而功能完善的个人博客。在本文中,我将从零开始,手把手教你如何安装Flask并快速搭建个人博客。第一步:安装Python和pip在开始之前,我们需要先安装Python和pi

FlaskvsFastAPI:高效开发WebAPI的最佳选择引言:在现代的软件开发中,WebAPI已经成为了不可或缺的一部分。它们能够提供数据和服务,使得不同的应用程序之间能够进行通信和互操作。而在选择开发WebAPI的框架时,Flask和FastAPI是两个备受关注的选择。这两个框架都非常流行,而且各有优势。在本文中,我们将对Fl

如何使用Gunicorn部署Flask应用?Flask是一个轻量级的PythonWeb框架,被广泛应用于开发各种类型的Web应用。而Gunicorn(GreenUnicorn)是一个基于Python的HTTP服务器,用于运行WSGI(WebServerGatewayInterface)应用。本文将介绍如何使用Gunicorn部署Flask应用,并附
