手把手教你使用Flask搭建ES搜尋引擎(實戰篇)

2022-01-01 糙科技
文章:Python爬蟲與數據挖掘

上一篇簡單說了下 ES 在 Python 的增刪改查,手把手教你使用Flask搭建ES搜尋引擎(預備篇)。

現在正式進入主題:開始使用 Flask 搭建 ES 搜索。

import osDB_USERNAME = 'root'DB_PASSWORD = None DB_HOST = '127.0.0.1'DB_PORT = '3306'DB_NAME = 'flask_es'
class Config: SECRET_KEY ="隨機字符" SQLALCHEMY_COMMIT_ON_TEARDOWN = True SQLALCHEMY_TRACK_MODIFICATIONS = True DEBUG = True SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://%s:%s@%s:%s/%s' % (DB_USERNAME, DB_PASSWORD,DB_HOST, DB_PORT, DB_NAME)
MAIL_SERVER = 'smtp.qq.com' MAIL_POST = 465 MAIL_USERNAME = '3417947630@qq.com' MAIL_PASSWORD = '郵箱授權碼' FLASK_MAIL_SUBJECT_PREFIX='M_KEPLER' FLASK_MAIL_SENDER=MAIL_USERNAME MAIL_USE_TLS = False MAIL_DEBUG = False ENABLE_THREADS=True

這是一份相對簡單的 Flask Config 文件,當然對於當前項目來說資料庫的連接不是必要的,我只是用 Mysql 來作為輔助用,小夥伴們沒有必要配置連接資料庫,有 ES 足以。然後郵箱通知這個看個人需求
日誌模塊在工程應用中是必不可少的一環,根據不同的生產環境來輸出日誌文件是非常有必要的。用句江湖上的話來說:  "如果沒有日誌文件,你死都不知道怎麼死的 "
import osimport loggingimport logging.config as log_confimport datetimeimport coloredlogs
coloredlogs.DEFAULT_FIELD_STYLES = {'asctime': {'color': 'green'}, 'hostname': {'color': 'magenta'}, 'levelname': {'color': 'magenta', 'bold': False}, 'name': {'color': 'green'}}
log_dir = os.path.dirname(os.path.dirname(__file__)) + '/logs'if not os.path.exists(log_dir): os.mkdir(log_dir)today = datetime.datetime.now().strftime("%Y-%m-%d")
log_path = os.path.join(log_dir, today + ".log")
log_config = { 'version': 1.0,
'formatters': { 'colored_console': { 'format': "%(asctime)s - %(name)s - %(levelname)s - %(message)s", 'datefmt': '%H:%M:%S' }, 'detail': { 'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s', 'datefmt': "%Y-%m-%d %H:%M:%S" }, },
'handlers': { 'console': { 'class': 'logging.StreamHandler', 'level': 'DEBUG', 'formatter': 'colored_console' }, 'file': { 'class': 'logging.handlers.RotatingFileHandler', 'maxBytes': 1024 * 1024 * 1024, 'backupCount': 1, 'filename': log_path, 'level': 'INFO', 'formatter': 'detail', 'encoding': 'utf-8', }, },
'loggers': { 'logger': { 'handlers': ['console'], 'level': 'DEBUG', },
}}
log_conf.dictConfig(log_config)log_v = logging.getLogger('log')
coloredlogs.install(level='DEBUG', logger=log_v)

這裡準備好了一份我常用的日誌配置文件,可作為常用的日誌格式,直接調用即可,根據不同的等級來輸出到終端或 .log 文件,拿走不謝。
對於 Flask 項目而言, 藍圖和路由會讓整個項目更具觀賞性(當然指的是代碼的閱讀)。
這裡我採用兩個分支來作為數據支撐,一個是 Math 入口,另一個是 Baike 入口,數據的來源是基於上一篇的百度百科爬蟲所得,根據 深度優先 的爬取方式抓取後放入 ES 中。
from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyfrom app.config.config import Configfrom flask_mail import Mailfrom flask_wtf.csrf import CSRFProtect
app = Flask(__name__,template_folder='templates',static_folder='static')app.config.from_object(Config)
db = SQLAlchemy(app)db.init_app(app)
csrf = CSRFProtect(app)mail = Mail(app)from app.home.baike import baike as baike_blueprintfrom app.home.math import math as math_blueprintfrom app.home.home import home as home_blueprint
app.register_blueprint(home_blueprint)app.register_blueprint(math_blueprint,url_prefix="/math")app.register_blueprint(baike_blueprint,url_prefix="/baike")

from flask import Blueprintbaike = Blueprint("baike", __name__)from app.home.baike import views

from flask import Blueprintmath = Blueprint("math", __name__)
from app.home.math import views

import osfrom flask_paginate import Pagination, get_page_parameterfrom app.Logger.logger import log_vfrom app.elasticsearchClass import elasticSearch
from app.home.forms import SearchForm
from app.home.baike import baikefrom flask import request, jsonify, render_template, redirect
baike_es = elasticSearch(index_type="baike_data",index_name="baike")
@baike.route("/")def index(): searchForm = SearchForm() return render_template('baike/index.html', searchForm=searchForm)
@baike.route("/search", methods=['GET', 'POST'])def baikeSearch(): search_key = request.args.get("b", default=None) if search_key: searchForm = SearchForm() log_v.error("[+] Search Keyword: " + search_key) match_data = baike_es.search(search_key,count=30)
PER_PAGE = 10 page = request.args.get(get_page_parameter(), type=int, default=1) start = (page - 1) * PER_PAGE end = start + PER_PAGE total = 30 print("最大數據總量:", total) pagination = Pagination(page=page, start=start, end=end, total=total) context = { 'match_data': match_data["hits"]["hits"][start:end], 'pagination': pagination, 'uid_link': "/baike/" } return render_template('data.html', q=search_key, searchForm=searchForm, **context) return redirect('home.index')

@baike.route('/<uid>')def baikeSd(uid): base_path = os.path.abspath('app/templates/s_d/') old_file = os.listdir(base_path)[0] old_path = os.path.join(base_path, old_file) file_path = os.path.abspath('app/templates/s_d/{}.html'.format(uid)) if not os.path.exists(file_path): log_v.debug("[-] File does not exist, renaming !!!") os.rename(old_path, file_path) match_data = baike_es.id_get_doc(uid=uid) return render_template('s_d/{}.html'.format(uid), match_data=match_data)

可以看到我們成功的將 elasticSearch 類初始化並且進行了數據搜索。我們使用了 Flask 的分頁插件進行分頁並進行了單頁數量的限制,根據 Uid 來跳轉到詳情頁中。 
@baike.route('/<uid>')def baikeSd(uid):    base_path = os.path.abspath('app/templates/s_d/')    old_file = os.listdir(base_path)[0]    old_path = os.path.join(base_path, old_file)    file_path = os.path.abspath('app/templates/s_d/{}.html'.format(uid))    if not os.path.exists(file_path):        log_v.debug("[-] File does not exist, renaming !!!")        os.rename(old_path, file_path)    match_data = baike_es.id_get_doc(uid=uid)    return render_template('s_d/{}.html'.format(uid), match_data=match_data)

以此來保證存放詳情頁面的模板中始終只保留一個 html 文件。
一如既往的採用 flask_script 作為項目的啟動方案,確實方便。
from app import appfrom flask_script import Manager, Server
manage = Manager(app)
manage.add_command("runserver", Server(use_debugger=True))

if __name__ == "__main__": manage.run()

python manage.py runserver

就可以啟動項目,默認埠 5000,訪問 http://127.0.0.1:5000
import multiprocessing
from gevent import monkeymonkey.patch_all()
workers = multiprocessing.cpu_count() * 2 + 1
debug = True
reload = True
loglevel = 'debug'
threads = 2
bind = '0.0.0.0:5001'
daemon = 'false'
worker_class = 'gevent'
worker_connections = 2000
pidfile = 'log/gunicorn.pid'logfile = 'log/debug.log'
accesslog = 'log/gunicorn_acess.log'errorlog = 'log/gunicorn_error.log'

gunicorn -c gconfig.py manage:app

https://github.com/GZKY-PY/Flask-ES
- 合作、交流、轉載請添加微信 moonhmily1 -

相關焦點

  • 手把手教你搭建Arduino+英偉達Jetson的ROS小車(上)
    今年6月,我們應小夥伴兒的需求,寫了兩篇如何通過購買淘寶中的零件從零搭建一臺ROS實體車的推文《開源!
  • 手把手教你搭建 ELK 實時日誌分析平臺
    本篇文章主要是手把手教你搭建 ELK 實時日誌分析平臺,那麼,ELK 到底是什麼呢?ELK 是三個開源項目的首字母縮寫,這三個項目分別是:Elasticsearch、Logstash 和 Kibana。
  • 手把手教你從無到有寫一個運維APP
    (一)1、環境搭建參考:第一篇 http://youerning.blog.51cto.com/10513771/17354502、es 伺服器因為沒有現成的 es 環境再者自己搭建還得往裡面填數據,這太難過了,所以通過 shodan 找一個暴露在公網的 es 伺服器。
  • 手把手教你使用wordpress搭建個人網站
    摘要:前段時間用Hexo搭建了靜態博客,放在了Gitee上面感覺太慢,而且每次部署之後還需要去Gitee後臺上面更新一遍,所以又重新用wordpress搭建了一個博客網站,部署在雲虛擬主機上面。雲虛擬主機:先把「雲」字去掉,虛擬主機是把一臺伺服器劃分為多個「虛擬的小主機」,劃分出來的小主機能夠獨立搭建網站,有完整的Internet伺服器功能。而雲虛擬主機就是一款虛擬主機產品,只不過加入了雲計算技術,是它的升級版。雲虛擬主機:有單獨的控制面板管理,通過FTP軟體更新網站,一般只能放一個站點。
  • 手把手教你搭建智能客服系統
    這樣的機器人客服,你想不想來一個?為了深入了解智能客服,我們邀請了第四範式智能客服負責人 & 資深數據科學家邢少敏,今晚八點半,為我們講講智能客服的技術和應用細節。邢少敏,第四範式智能客服負責人 & 資深數據科學家,畢業於北京航空航天大學,獲博士學位。
  • 手把手教你流行抓包工具Charles - 基礎功能篇2
    吳老的java版《selenium webdriver 實戰寶典》和python版《selenium Webdriver 3.0 自動化測試框架實戰指南
  • Tensorflow實戰系列:手把手教你使用LSTM進行文本分類(附完整代碼)
    【導讀】專知小組計劃近期推出Tensorflow實戰系列,計劃教大家手把手實戰各項子任務。
  • 手把手教你寫Modbus-RTU協議(實戰篇)
    因為剛玩公眾號不久,很多關於運營公眾號的一些技巧真的是很匱乏,然而就在昨天早上8點發表了一篇《goto關鍵字的"那些事"》的文章,個人其實是很期待大家都能夠閱讀一下的,畢竟裡面有一些小技巧在關鍵的時候還是能夠幫到大家一把,可是到我現在已經24小時過去了,閱讀量才70,後來明白了早上發文如果是沒有公眾號"標星"的用戶往往文章會被擠到後面去,以至於很多小夥伴看不到這篇文章
  • 手把手教你通過gitlab-ci與docker實踐CICD
    1.gitlab-ci CICD初體驗1.1.安裝docker參考官網:https://docs.docker.com/在線安裝地址:https://docs.docker.com/engine/install/centos/
  • 2021年手把手教你打造基於Chrome的生產力工具之文字信息處理篇
    這是2021年手把手教你打造基於Chrome的生產力工具的第四篇文章。如果您是第一次來到這裡,你可以先瀏覽前期的文章。2021年手把手教你打造基於Chrome的生產力工具之插件安裝篇2021年手把手教你打造基於Chrome的生產力工具之視頻加速篇2021年手把手教你打造基於Chrome的生產力工具之圖片處理篇
  • 手把手教你搭建基於 Vue3 的前端 UI 組件庫 - 卡片
    項目地址GitHub: https://github.com/JeremyWu917/jeremy-ui官網地址JeremyUI: https://ui.jeremywu.top- End -推薦閱讀1.手把手教你搭建基於
  • Flask一步步搭建web應用
    博客:http://blog.csdn.net/u0127344411.flask介紹2.所需工具和環境3.搭建flaskApp4.具體程序編寫5.綜上1.flask介紹flask是一款十分輕量級的python Web
  • 手把手教你寫網絡爬蟲(5):PhantomJS實戰
    本系列:《手把手教你寫網絡爬蟲(1):網易雲音樂歌單》《手把手教你寫網絡爬蟲(2):迷你爬蟲架構》
  • 猿實戰01——vue後臺前端框架搭建
    猿實戰是一個原創系列文章,通過實戰的方式,採用前後端分離的技術結合SpringMVC Spring Mybatis,手把手教你擼一個完整的電商系統
  • 手把手教你搭建WordPress個人博客(完全版)
    本文為零基礎 WordPress 建站教程,手把手教你從零開始搭建 WordPress 個人博客。簡介WordPress (簡稱 WP)可以說是全球最流行的博客系統了,沒有之一,世界上約 30% 的網站都是基於 WordPress 搭建的。
  • 手把手教你搭建一個 Elasticsearch 集群
    不過,ES最難的地方應該不是它的運用,而是它的部署,坑真的超級多,所以這篇文章,我們就來介紹一下怎麼部署 ElasticSearch 集群吧!以下內容來源:進擊的Coder(ID:FightingCoder)為何要搭建 Elasticsearch 集群凡事都要講究個為什麼。在搭建集群之前,我們首先先問一句,為什麼我們需要搭建集群?它有什麼優勢呢?
  • 手把手教你搭建C語言開發環境,不信你學不會~
    開發環境是指在基本硬體和數字軟體的基礎上,為支持系統軟體和應用軟體的工程化開發和維護而使用的一組軟體,簡稱SDE。簡單的來說,就是你要在特定的環境下去敲代碼,做項目,然後用於最後的開發。在學習C語言的過程中,我們同樣收集到很多同學的反饋,確實遇到很多開發環境搭建問題。
  • 手把手教你使用YouTube搜索高質量的詢盤
    在搜尋引擎領域,Google目前依舊是全球第一大搜尋引擎,每天有很多人用Google進行搜索,並以此找到他們需要的數據和信息。但大多數人並不知道,其實YouTube是全球第二大搜尋引擎,並且擁有巨額流量,用戶每天通過YouTube網站觀看的視頻數量已經超過1億個。
  • Tensorflow實戰系列:手把手教你使用CNN進行圖像分類(附完整代碼)
    【導讀】專知小組計劃近期推出Tensorflow實戰系列,計劃教大家手把手實戰各項子任務。
  • 從零開始,手把手教你開發一款貪吃蛇遊戲
    你想知道《貪吃蛇大作戰》這款遊戲是怎麼開發的嗎?除了IP之外,它還有哪些優點值得學習?