成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

手把手教你使用Flask搭建ES搜索引擎(預備篇)

開發 前端
Elasticsearch 是一個開源的搜索引擎,建立在一個全文搜索引擎庫 Apache Lucene™ 基礎之上。那么如何實現 Elasticsearch和 Python 的對接成為我們所關心的問題了。

[[406279]]

1 前言

Elasticsearch 是一個開源的搜索引擎,建立在一個全文搜索引擎庫 Apache Lucene™ 基礎之上。

那么如何實現 Elasticsearch和 Python 的對接成為我們所關心的問題了 (怎么什么都要和 Python 關聯啊)。

2 Python 交互

所以,Python 也就提供了可以對接 Elasticsearch的依賴庫。

  1. pip install elasticsearch 

初始化連接一個 Elasticsearch 操作對象。

  1. def __init__(self, index_type: str, index_name: str, ip="127.0.0.1"): 
  2.  
  3.     # self.es = Elasticsearch([ip], http_auth=('username''password'), port=9200) 
  4.     self.es = Elasticsearch("localhost:9200"
  5.     self.index_type = index_type 
  6.     self.index_name = index_name 

默認端口 9200,初始化前請確保本地已搭建好 Elasticsearch的所屬環境。

根據 ID 獲取文檔數據

  1. def get_doc(self, uid): 
  2.     return self.es.get(index=self.index_name, id=uid) 

插入文檔數據

  1. def insert_one(self, doc: dict): 
  2.     self.es.index(index=self.index_name, doc_type=self.index_type, body=doc) 
  3.  
  4. def insert_array(self, docs: list): 
  5.     for doc in docs: 
  6.         self.es.index(index=self.index_name, doc_type=self.index_type, body=doc) 

搜索文檔數據

  1. def search(self, query, countint = 30): 
  2.     dsl = { 
  3.         "query": { 
  4.             "multi_match": { 
  5.                 "query": query, 
  6.                 "fields": ["title""content""link"
  7.             } 
  8.         }, 
  9.         "highlight": { 
  10.             "fields": { 
  11.                 "title": {} 
  12.             } 
  13.         } 
  14.     } 
  15.     match_data = self.es.search(index=self.index_name, body=dsl, size=count
  16.     return match_data 
  17.  
  18. def __search(self, query: dict, countint = 20): # count: 返回的數據大小 
  19.     results = [] 
  20.     params = { 
  21.         'size'count 
  22.     } 
  23.     match_data = self.es.search(index=self.index_name, body=query, params=params) 
  24.     for hit in match_data['hits']['hits']: 
  25.         results.append(hit['_source']) 
  26.  
  27.     return results 

刪除文檔數據

  1. def delete_index(self): 
  2.     try: 
  3.         self.es.indices.delete(index=self.index_name) 
  4.     except
  5.         pass 

好啊,封裝 search 類也是為了方便調用,整體貼一下。

  1. from elasticsearch import Elasticsearch 
  2.  
  3.  
  4. class elasticSearch(): 
  5.  
  6.     def __init__(self, index_type: str, index_name: str, ip="127.0.0.1"): 
  7.  
  8.         # self.es = Elasticsearch([ip], http_auth=('elastic''password'), port=9200) 
  9.         self.es = Elasticsearch("localhost:9200"
  10.         self.index_type = index_type 
  11.         self.index_name = index_name 
  12.  
  13.     def create_index(self): 
  14.         if self.es.indices.exists(index=self.index_name) is True
  15.             self.es.indices.delete(index=self.index_name) 
  16.         self.es.indices.create(index=self.index_name, ignore=400) 
  17.  
  18.     def delete_index(self): 
  19.         try: 
  20.             self.es.indices.delete(index=self.index_name) 
  21.         except
  22.             pass 
  23.  
  24.     def get_doc(self, uid): 
  25.         return self.es.get(index=self.index_name, id=uid) 
  26.  
  27.     def insert_one(self, doc: dict): 
  28.         self.es.index(index=self.index_name, doc_type=self.index_type, body=doc) 
  29.  
  30.     def insert_array(self, docs: list): 
  31.         for doc in docs: 
  32.             self.es.index(index=self.index_name, doc_type=self.index_type, body=doc) 
  33.  
  34.     def search(self, query, countint = 30): 
  35.         dsl = { 
  36.             "query": { 
  37.                 "multi_match": { 
  38.                     "query": query, 
  39.                     "fields": ["title""content""link"
  40.                 } 
  41.             }, 
  42.             "highlight": { 
  43.                 "fields": { 
  44.                     "title": {} 
  45.                 } 
  46.             } 
  47.         } 
  48.         match_data = self.es.search(index=self.index_name, body=dsl, size=count
  49.         return match_data 

嘗試一下把 Mongodb 中的數據插入到 ES 中。

  1. import json 
  2. from datetime import datetime 
  3. import pymongo 
  4. from app.elasticsearchClass import elasticSearch 
  5.  
  6. client = pymongo.MongoClient('127.0.0.1', 27017) 
  7. db = client['spider'
  8. sheet = db.get_collection('Spider').find({}, {'_id': 0, }) 
  9.  
  10. es = elasticSearch(index_type="spider_data",index_name="spider"
  11. es.create_index() 
  12.  
  13. for i in sheet: 
  14.     data = { 
  15.             'title': i["title"], 
  16.             'content':i["data"], 
  17.             'link': i["link"], 
  18.             'create_time':datetime.now() 
  19.         } 
  20.  
  21.     es.insert_one(doc=data) 

到 ES 中查看一下,啟動 elasticsearch-head 插件。

如果是 npm 安裝的那么 cd 到根目錄之后直接 npm run start 就跑起來了。

本地訪問 http://localhost:9100/

發現新加的 spider 數據文檔確實已經進去了。

3 爬蟲入庫

要想實現 ES 搜索,首先要有數據支持,而海量的數據往往來自爬蟲。

為了節省時間,編寫一個最簡單的爬蟲,抓取 百度百科。

簡單粗暴一點,先 遞歸獲取 很多很多的 url 鏈接

  1. import requests 
  2. import re 
  3. import time 
  4.  
  5. exist_urls = [] 
  6. headers = { 
  7.     'User-Agent''Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'
  8.  
  9. def get_link(url): 
  10.     try: 
  11.         response = requests.get(url=url, headers=headers) 
  12.         response.encoding = 'UTF-8' 
  13.         html = response.text 
  14.         link_lists = re.findall('.*?<a target=_blank href="/item/([^:#=<>]*?)".*?</a>', html) 
  15.         return link_lists 
  16.     except Exception as e: 
  17.         pass 
  18.     finally: 
  19.         exist_urls.append(url) 
  20.  
  21.  
  22. # 當爬取深度小于10層時,遞歸調用主函數,繼續爬取第二層的所有鏈接 
  23. def main(start_url, depth=1): 
  24.     link_lists = get_link(start_url) 
  25.     if link_lists: 
  26.         unique_lists = list(set(link_lists) - set(exist_urls)) 
  27.         for unique_url in unique_lists: 
  28.             unique_url = 'https://baike.baidu.com/item/' + unique_url 
  29.  
  30.             with open('url.txt''a+'as f: 
  31.                 f.write(unique_url + '\n'
  32.                 f.close() 
  33.         if depth < 10: 
  34.             main(unique_url, depth + 1) 
  35.  
  36. if __name__ == '__main__'
  37.     start_url = 'https://baike.baidu.com/item/%E7%99%BE%E5%BA%A6%E7%99%BE%E7%A7%91' 
  38.     main(start_url) 

把全部 url 存到 url.txt 文件中之后,然后啟動任務。

  1. # parse.py 
  2. from celery import Celery 
  3. import requests 
  4. from lxml import etree 
  5. import pymongo 
  6. app = Celery('tasks', broker='redis://localhost:6379/2'
  7. client = pymongo.MongoClient('localhost',27017) 
  8. db = client['baike'
  9. @app.task 
  10. def get_url(link): 
  11.     item = {} 
  12.     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'
  13.     res = requests.get(link,headers=headers) 
  14.     res.encoding = 'UTF-8' 
  15.     doc = etree.HTML(res.text) 
  16.     content = doc.xpath("//div[@class='lemma-summary']/div[@class='para']//text()"
  17.     print(res.status_code) 
  18.     print(link,'\t','++++++++++++++++++++'
  19.     item['link'] = link 
  20.     data = ''.join(content).replace(' ''').replace('\t''').replace('\n''').replace('\r'''
  21.     item['data'] = data 
  22.     if db['Baike'].insert(dict(item)): 
  23.         print("is OK ..."
  24.     else
  25.         print('Fail'

run.py 飛起來

  1. from parse import get_url 
  2.  
  3. def main(url): 
  4.     result = get_url.delay(url) 
  5.     return result 
  6.  
  7. def run(): 
  8.     with open('./url.txt''r'as f: 
  9.         for url in f.readlines(): 
  10.             main(url.strip('\n')) 
  11.  
  12. if __name__ == '__main__'
  13.     run() 

黑窗口鍵入

  1. 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 也很優秀。嘿嘿,你喜歡 !!

 

責任編輯:姜華 來源: Python爬蟲與數據挖掘
相關推薦

2020-10-23 09:03:28

Flask

2014-04-11 13:52:28

2024-11-05 16:40:24

JavaScript搜索引擎

2022-02-25 09:41:05

python搜索引擎

2021-08-24 10:02:21

JavaScript網頁搜索 前端

2021-07-14 09:00:00

JavaFX開發應用

2022-03-14 14:47:21

HarmonyOS操作系統鴻蒙

2025-05-07 00:31:30

2011-03-25 12:45:49

Oracle SOA

2022-12-07 08:42:35

2010-07-06 09:43:57

搭建私有云

2010-07-06 09:38:51

搭建私有云

2022-01-04 08:52:14

博客網站Linux 系統開源

2021-08-02 07:35:19

Nacos配置中心namespace

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機

2010-01-20 10:44:01

linux DHCP服務器

2025-02-26 07:40:25

運營分析體系運營策略

2021-01-19 09:06:21

MysqlDjango數據庫

2022-07-22 12:45:39

GNU
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲狠狠 | 又黄又色| 国产美女视频黄a视频免费 国产精品福利视频 | 精品国产一级 | 免费观看黄a一级视频 | 欧美中文视频 | 99精品欧美一区二区三区综合在线 | 91在线视频免费观看 | 国内精品一区二区三区 | 九一视频在线观看 | 免费人成在线观看网站 | 午夜网站视频 | 久久亚洲欧美日韩精品专区 | 久久成人免费 | 精品久久久久一区二区国产 | 激情一区二区三区 | av激情在线 | 亚洲精品视频网站在线观看 | www.色五月.com| 亚洲精品无 | 成人高清视频在线观看 | 国产精品人人做人人爽 | 久久最新网址 | 亚洲毛片| 成人国产免费观看 | 久久久久久国产精品免费免费狐狸 | 国产精品久久久久久久岛一牛影视 | 九九精品在线 | 亚洲精品久久久一区二区三区 | 亚洲成人毛片 | 国产精品亚洲精品久久 | 国产一区二区在线免费观看 | 国产一区二区三区视频 | 中文字幕亚洲一区 | 国产福利91精品 | 国产精品视频久久久久 | 欧美综合久久久 | 久久精品一区 | 天天综合久久 | 国产一区二区免费 | 免费一区在线 |