在云服务器ECS上用Python写一个搜索引擎

news2024/11/16 9:28:10

在云服务器ECS上用Python写一个搜索引擎

  • 一、场景介绍
  • 二、搜索引擎的组成
    • 2.1 网页的爬取及排序
    • 2.2 用户使用搜索引擎进行搜索
  • 三、操作步骤
    • 3.1 环境准备
    • 3.2 安装Anaconda
    • 3.3 安装Streamlit
    • 3.4 下载搜索引擎代码
    • 3.5 运行搜索引擎
  • 四、常见问题
    • 4.1 运行setup.py时可能的问题
    • 4.2 如何使搜索引擎一直在线

一、场景介绍

一台阿里云ECS云服务器就是一台带有公网IP地址的计算机。用户可以通过远程登录使用这台计算机;同时,由于带有公网IP,用户在ECS云服务器上部署的网站、APP、小程序等,可以被其他人通过互联网访问。

本实验应用PageRank算法,使用Python,在一台ECS云服务器上搭建了一个简易版的搜索引擎。可以用单个英文词语作为搜索词,搜索相关的网页。实现的效果如下图所示。在搜索框中,输入搜索词,例如"universe",单击搜索,搜索引擎即会按相关度从高到低,列出相关的网页。image.png

二、搜索引擎的组成

本案例中的搜索引擎由两部分组成:网页的爬取及排序,以及用户使用搜索引擎进行搜索。

2.1 网页的爬取及排序

首先,搜索引擎需要从互联网上爬取网页。爬取到网页后,做两方面的工作:

  1. 获取网页间的超链接关系,使用PageRank算法对网页进行排序。PageRank算法的基本原理是,被引用越多的网页(即获取的超链接越多),重要性越高,类似于被引用次数越多的学术论文重要性越高的原理。对算法的说明可参考下面这本书:Google’s PageRank and Beyond: The Science of Search Engine Rankings。

  2. 编制搜索词的索引。从网页中提取词语,分析这些词语出现在哪些网页。

2.2 用户使用搜索引擎进行搜索

用户搜索某个词(例如 computer)时,搜索引擎首先从搜索词的索引中,找到这个词出现在哪些网页。然后,获取这些网页的PageRank值,按照值的大小,由高至低排序,呈现给用户。

本案例中,数据存储做了简化处理,采用了txt文档存储数据,没有使用数据库。Web页面采用Streamlit生成。image.png

三、操作步骤

3.1 环境准备

  1. 创建用于运行搜索引擎的ECS实例。ECS实例建议配置如下:

    • 实例规格:选择2vCPU 2 GiB的实例规格

    • 系统盘:40 GiB

    • 公网IP:选中分配公网 IPv4 地址并选择1M。

    • 镜像:选择Linux系统的镜像,本实验中选取Alibaba Cloud Linux,版本为Alibaba Cloud Linux 3.2104 LTS 64位。当您选择其他Linux系统时,运行命令与本文有所不同。

  2. 实例安全组的入方向规则,放行22、80、443、8501端口(Streamlit默认使用8501端口)。

3.2 安装Anaconda

Anaconda中包含了Python、NumPy等本项目中需要的依赖项。

  1. 远程连接ECS实例。

  2. 更新操作系统。

    sudo yum update -y
    sudo yum upgrade -y
    
  3. 下载Anaconda安装包。

    wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh
    
  4. 安装Anaconda。

    bash Anaconda3-2023.09-0-Linux-x86_64.sh
    
    1. 当出现下图所示信息时,单击Enter,继续安装过程。

      image.png

    2. 出现下面的界面后,连续多次单击Enter。**在这里需要注意,此处安装软件是在显示它的授权协议,让用户阅读。不要一直按住Enter,而是建议一下一下地点击Enter,后续会出现****Do you accept the license terms?**的提示(紧接着一个步骤)。默认的选项是no,如果一直按住Enter,安装过程会中止。image.png

    3. 出现Do you accept the license terms? [yes|no]时,输入yes,单击Enter继续安装。

      image.png

    4. 出现如下提示,单击Enter继续,等待Anaconda完成安装。

      image.png

    5. 出现如下提示时,输入yes,单击Enter继续安装。

      image.png

      出现如下图所示信息时,说明Anaconda已安装完成。

      image.png

  5. 单击页面右上角的image.png图标,打开一个新终端。

    当出现(base)字样,表示Anaconda已启动。

    说明

    在实际开发过程中,通常需要通过conda安装虚拟环境,在虚拟环境中继续后续操作。本实验中略去此步骤。

    image.png

3.3 安装Streamlit

Streamlit用于展示Web页面。

pip install streamlit

3.4 下载搜索引擎代码

搜索引擎能搜索到哪些网页,取决于搜索引擎通过爬虫获得了哪些网页。本实验中,以Introduction to Programming in Python网页为起始网页,爬取了总计322个网页。因此,搜索的结果限于这322个网页。用户可以通过在web_graph.py中添加新的起始网页,爬取新的网页。

  1. 下载搜索引擎代码压缩包。

    wget https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/en-US/20231011/uhsy/search_engine_demo_aliyun.zip
    
  2. 解压缩搜索引擎代码压缩包。

    yum install unzip
    unzip search_engine_demo_aliyun.zip
    
  3. 切换到search_engine_demo_aliyun目录。

    cd search_engine_demo_aliyun
    

    search_engine_demo_aliyun目录下的文件结构如下所示:

    image.png

    • **search.py:**运行该程序,可以启动搜索引擎网页,供用户使用。

    • pageranking:包含爬取网页、计算PageRank值、生成词的索引所需要的程序。

      • web_graph.py:爬取网页,生成网页间的关系图(graph);

      • page_indexer.py:对使用web_graph.py爬取到的网页做编号,以方便使用PageRank算法时做矩阵运算;

      • pagerank.py:使用PageRank算法计算网页的重要性;

      • word_indexer.py:对爬取到的网页中的词进行分析,确定每一个词分别出现在了哪些网页;

      • get_html.py:获取网页的hmtl内容,web_graph.py和word_indexer.py都会调用这个程序;

      • setup.py:用于同时运行web_graph.py, page_indexer.py, pagerank.py, word_indexer.py,并存储数据。

    • **data:**用于存储运行./pageranking/setup.py后生成的数据。

      • web_graph.txt: 用于存储网页间的关联关系,本质上是一个有向图。采用字典的方式存储数据,key为一个网页,value为这个网页上超链接指向的网页组成的数组;

      • page_indexer.txt: 爬取到的网页的编号。这里的网页经过了去重。采用字典的方式存储数据,key为一个网页,value为网页的编号;

      • pagerank_of_pages.txt:采用PageRank算法计算出的各个网页的PageRank值,即重要性。采用字典的方式存储数据,key为一个网页,value为这个网页的PageRank值;

      • word_index.txt:词的索引,即词会出现在哪些网页。采用字典的方式存储数据,key为一个词,value为出现了这个词的网页的数组。

3.5 运行搜索引擎

  1. 启动搜索引擎。

    streamlit run search.py
    

    当显示如下信息时,说明Streamlit已启动。

    image.png

  2. 复制External URL显示的公网IP地址输入到浏览器,就可以访问并使用搜索引擎。image.png

  3. 修改网页的爬取及排序。

    本实验中,以Introduction to Programming in Python这个网页为起始网页,爬取了总计322个网页。因此,搜索的结果限于这322个网页。

    您可以通过在web_graph.py中添加新的起始网页,爬取新的网页。例如,如果要增加以Algorithms这个网页为起始网页,做爬虫,让搜索引擎能搜到更多的网页。可以按如下步骤操作:

    1. 切换到pageranking目录。

      cd /root/search_engine_demo_aliyun/pageranking
      
    2. 打开web_graph.py文件。

      vim web_graph.py
      
    3. i键进入编辑模式。

    4. 在seed_urls数组中,增加https://algs4.cs.princeton.edu/home/

      image.png

    5. Esc键,输入**:wq**,按Enter键,输入并保存文件。

  4. 执行如下命令,开始更新data文件夹中的数据。

    其中,web_graph.txt、word_index.txt的生成需要较长的时间(约10分钟)。运行完毕后,搜索引擎即可覆盖更多的网页。

    python setup.py
    

四、常见问题

4.1 运行setup.py时可能的问题

运行python setup.py做新的爬虫任务时,耗时较长,任务可能被中断。如果被中断,可以尝试重新运行。

4.2 如何使搜索引擎一直在线

在云服务器ECS上运行搜索引擎时,如果远程连接中断,search.py文件也会中止运行,导致搜索引擎无法使用。可以采用screen命令,解决这个问题。

  1. 执行ctrl+z终止search.py程序。

  2. 查看占用8501端口的进程。

    lsof -i:8501
    

    例如,占用该端口的PID位41644,输入下列命令中止该进程,释放8501端口。image.png

    kill -9 41644
    
  3. 执行以下命令,使用screen新建一个窗口。

    screen -S search
    

    image.png

  4. 在新生成的窗口里,运行下列命令,启动搜索引擎。

    streamlit run search.py
    
  5. 按住ctrl+A,再按D,出现下列提示(detached from …)后,说明detach成功。

    这样,即使远程连接中断、退出登录ECS实例,搜索引擎仍然将正常工作。

    image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1360332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

oracle 补齐数字长度 to_char踩坑

oracle的to_char网上找到的说明如下 (1)用作日期转换: to_char(date,格式); select to_date(2005-01-01 ,yyyy-MM-dd) from dual; select to_char(sysdate,yyyy-MM-dd HH24:mi:ss) from dual; (2)处理数字&#xf…

unity PDFRender Curved UI3.3

【PDF】PDFRender 链接:https://pan.baidu.com/s/1wSlmfiWTAHZKqEESxuMH6Q 提取码:csdn 【曲面ui】 Curved UI3.3 链接:https://pan.baidu.com/s/1uNZySJTW0-pPwi2FTE6fgA 提取码:csdn

【软件测试】2024年准备中/高级测试岗技术面试...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、软件测试基础知…

Netplan介绍

1 介绍 1.1 简介 Netplan是一个抽象网络配置描述器。通过netplan命令,你只需用一个 YAML文件描述每个网络接口所需配置。netplan并不关系底层管理工具是NetworkManager还是networkd。 它是一个在 Linux 系统上进行网络配置的实用程序。您创建所需接口的描述并定义…

【动态规划】【字符串】132.分割回文串 II

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 动态规划 字符串 LeetCode132. 分割回文串 II 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。 返回符合要求的 最少分割次数 。 示例 1: 输入&#x…

阿里云服务器配置jupyter(新手入门,详细全面)

设置安全组 1.租好服务器后在阿里云服务器平台上打开控制台(右上角) 2.点开自己的云服务器控制台,在左栏“安全组”部分添加安全规则,点击“管理规则” 单击“手动添加”,将安全组设为如下格式,端口范围…

wsl(ubuntu)创建用户

我们打卡ubuntu窗口,如果没有创建用户,那么默认是root用户 用户的增删改查 查 查询所有的用户列表 cat /etc/passwd | cut -d: -f1cat /etc/passwd: 这个命令用于显示 /etc/passwd 文件的内容。/etc/passwd 文件包含了系统上所有用户的基本信息。每一…

UG装配-沿线运动

如果希望图中圆柱销沿着槽运动,直接约束面是困难的,我们可以画出圆弧的中心线和圆柱销的中心点,约束点在线上,进行移动 需要注意的是,我们在零件中画点和线的时候,在装配体默认加载模型引用集的时候是无法显…

如何通过HACS+Cpolar实现远程控制米家和HomeKit等智能家居设备

文章目录 基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssistant,通过内网穿透在户外控制家庭中枢。本文将介绍如何安装HACS插件商店,将米家,果家设备接入 Home Assistant。 基本条件…

leetcode:908. 最小差值 I

一、题目 二、函数原型 int smallestRangeI(int* nums, int numsSize, int k) 三、思路 本题题目有些绕口,但是无伤大雅。本质就是可以对数组中的每个元素进行加/减 k 的操作,然后求数组中的最大、最小元素的最小差值。 分为几种情况: …

【数据库系统概论】数据库并发控制机制——并发操作带来的数据不一致性问题有哪些

系统文章目录 数据库的四个基本概念:数据、数据库、数据库管理系统和数据库系统 数据库系统的三级模式和二级映射 数据库系统外部的体系结构 数据模型 关系数据库中的关系操作 SQL是什么?它有什么特点? 数据定义之基本表的定义/创建、修改和…

若依前后端分离版关联字典值查询数据工具类使用

场景 若依管理系统导出Excel时添加没有的列和关联码表显示中文进行导出: 若依管理系统导出Excel时添加没有的列和关联码表显示中文进行导出_若依的导出添加额外的字段信息-CSDN博客 上面通过关联表的方式实现查询字典值,若依本身提供了查询redis中缓存…

【数据库原理】(10)数据定义功能

SQL 数据定义功能包括定义模式、定义表、定义索引和定义视图,其语句如表所示。 一.创建、删除模式 1.创建模式 (Create Schema) 用途:创建模式是为了在数据库中定义一个新的命名空间,它可以包含多个数据库对象。 语法: CREATE SCHEMA &…

建站指南,如何将拥有的域名自定义链接到wordpress

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 在Dynadot上,我们可已经账户中管理的…

Simply简洁博客主题源码 | EmlogPro主题模版

Simply是一款简约风格的Emlog博客模板,响应式布局、界面简单大方,实用性强! 支持夜间模式,采用localStorage存储配置。IOS系统下支持随系统自动切换浅/深色模式。 文章页支持显示文章字数及阅读时间。 支持http/https 响应式主…

Python+Yolov5+Qt交通标志特征识别窗体界面相片视频摄像头

程序示例精选 PythonYolov5Qt交通标志特征识别窗体界面相片视频摄像头 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《PythonYolov5Qt交通标志特征识别窗体界面相片视频摄像头》编写代码&a…

RocketMQ MQClientInstance、生产者实例启动源码分析

🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏&…

【机器学习】循环神经网络(一)

一、网络结构 RNN 处理输入序列时的信息流。 粗体箭头为各时间点信息流的活跃路径,虚线箭头显示当时不活动的连接。 一个简单RNN例子 RNN 不是一类网络,而是适用于不同问题的拓扑结构的集合。循环网络的一个有趣的方面是,有了足够的层和节点&…

手写视频裁剪框

<!-- 截取框 --><divv-show"isShow"class"crop-box":style"{width: cropWidth px,height: cropHeight px,left: cropX px,top: cropY px,}"ref"cropBox"mousedown"startInteraction"><!-- 内容在这里 --…

【信息论与编码】习题-单选题

目录 单选题1.下列说法正确的是&#xff08;B&#xff09;2.在信息论中&#xff0c;若用对数底2为&#xff0c;则信息量的单位为&#xff08;C&#xff09;3.率失真函数的下限为&#xff08;A&#xff09;4.给定xi条件下随机事件yj所包含的不确定度和条件自信息量p(yj /xi)。&a…