当前位置: 首页 > news >正文

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

在云服务器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

相关文章:

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

在云服务器ECS上用Python写一个搜索引擎 一、场景介绍二、搜索引擎的组成2.1 网页的爬取及排序2.2 用户使用搜索引擎进行搜索 三、操作步骤3.1 环境准备3.2 安装Anaconda3.3 安装Streamlit3.4 下载搜索引擎代码3.5 运行搜索引擎 四、常见问题4.1 运行setup.py时可能的问题4.2 如…...

Python在智能手机芯片研发

Python在智能手机芯片研发中扮演着重要的角色。以下是几个方面的重要性: 快速原型设计:Python具有简洁易读的语法和丰富的第三方库,使工程师能够快速构建原型和进行快速迭代。这对于芯片研发来说,可以加快开发速度,减少…...

K8S学习指南(70)-K8S中的informa机制

引言 在 Kubernetes 集群中,Informer 是一种重要的机制,用于监控和处理集群中资源对象的变化。它是基于观察者模式设计的,允许开发者注册对某类资源对象的关注,并在对象发生变化时得到通知。本文将深入介绍 Kubernetes 中的 Info…...

「MCU」SD NAND芯片之国产新选择优秀

文章目录 前言 传统SD卡和可贴片SD卡 传统SD卡 可贴片SD卡 实际使用 总结 前言 随着目前时代的快速发展,即使是使用MCU的项目上也经常有大数据存储的需求。可以看到经常有小伙伴这样提问: 大家好,请问有没有SD卡芯片,可以…...

【QML COOK】- 002-添加一个图片

1. 编辑main.qml import QtQuickWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")Image {anchors.fill: parentsource: "qrc:/Resources/Images/arrow.png"} }将Window的width和height都改成800,因为我们要添加的图片大…...

Java10:内部类

7 内部类(了解)7.1 成员内部类7.2 静态内部类7.3 局部内部类7.4 匿名内部类 2.3. 静态内部类2.4. Lambda表达式, 7 内部类(了解) 内部类:就是在一个类的内部再定义一个类。 分类: 成员内部类 静…...

PostgreSQL 支持的字段类型

PostgreSQL 支持多种字段类型,以下是 PostgreSQL 13 版本中支持的所有字段类型: 数值类型: smallint:小整数类型。integer:整数类型。bigint:大整数类型。decimal:精确小数类型。numeric&#x…...

npm报错error:03000086:digital envelope routines::initialization error

可能是因为node版本过高,与现在的项目不符合 这是降低node版本的命令,然后重新运行 npm install npm8.1.2 -g...

el-table 展开行表格,展开的内容高度可以变化时,导致的固定列错位的问题

问题描述 一个可展开的表格(列设置了type“expand”),并且展开后的内容高度可以变化,会导致后面所有行的固定列错位,图如下,展示行中是一个树形表格,默认不展示子级,点击树形表格的…...

python插入排序

插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常使用in-place排序&#xff0…...

怎么将营业执照图片转为excel表格?(批量合并识别技巧)

一、为何要将营业执照转为excel表格? 1、方便管理:将营业执照转为excel格式,可以方便地进行管理和整理,快速查找需要的信息。 2、数据处理:Excel可以提供丰富的计算和数据分析功能,转化为excel后方便数据…...

关于java数组Arrays类

关于java数组Arrays类 前面的文章中,我们了解了数组创建方法等,我们本篇文章来了解一下数组的方法类Arrays,有了这个类,我们在日常写代码的时候就不不用自己去手动创建方法了😀。 Arrays类 数组的工具类java.util.A…...

LeetCode-58/709

1.最后一个单词的长度(58) 题目描述: 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 思路&…...

linux 流量监控

linux 流量监控 Linux 网络流量监控利器 iftop命令详解及实战 https://blog.csdn.net/qq_50247813/article/details/134164093 iftop命令详解 https://www.cnblogs.com/gaoyuechen/p/17300017.html 1 ubuntu如何查看流量监控 Ubuntu是一种非常流行的Linux发行版&#xff0c…...

AUTOSAR从入门到精通-漫谈autosar软件架构(八)

目录 前言 原理 AUTOSAR的方法论 AUTOSAR架构的优点 AUTOSAR 软件架构 1.应用层...

C#设计模式之单例模式

介绍 单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式的结构图如下所示: 使用单例模式的原因 对一些类来说,只有一个实例是很重要的。如何才能保证一个类只有一个实例并且这个…...

【源码预备】Calcite基础知识与概念:关系代数概念、查询优化、sql关键字执行顺序以及calcite基础概念

文章目录 一. 关系代数的基本知识二. 查询优化三. SQL语句的解析顺序1. FROM2. WHERE3. GROUP BY4. HAVING5. SELECT 四. Apache Calcite中的基本概念1. Adapter2. Calcite中的关系表达式2.1. 关系表达式例子2.2. 源码底层结构 3. Calcite的优化规则4. Calcite的Trait--算子物理…...

【Java 设计模式】23 种设计模式

文章目录 设计模式是什么计算机行业里的设计模式创建型模式(共 5 种)结构型模式(共 7 种)行为型模式(共 11 种) 总结 设计模式是什么 “每一个模式描述了一个在我们周围不断重复发生的问题,以及…...

ElasticSearch深度分页解决方案

一、前言 ElasticSearch是一个基于Lucene的搜索引擎,它支持复杂的全文搜索和实时数据分析。在实际应用中,我们经常需要对大量数据进行分页查询,但是传统的分页方式在处理大量数据时会遇到性能瓶颈。本文将介绍ElasticSearch分页工作原理、深…...

nginx下upstream模块详解

目录 一:介绍 二:特性介绍 一:介绍 Nginx的upstream模块用于定义后端服务器组,以及与这些服务器进行通信的方式。它是Nginx负载均衡功能的核心部分,允许将请求转发到多个后端服务器,并平衡负载。 在upst…...

基于ssm的双减后初小教育课外学习生活活动平台的设计与实现论文

双减后初小教育课外学习生活活动平台的设计与实现 摘 要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。以前学校对于课外学习活动信息的管理和控制,采用人工登记的方式保存相关…...

wblogic中间件配置数据源

配置数据源 1.服务-数据源-配置-新建 2.单机选一般数据源 3.选择源名称、jndi名称、数据库类型 4.选择驱动 5.下一步 6.输入连接串信息 参考&#xff1a; 格式二&#xff1a;jdbc:oracle:thin:<host>:<port>:<SID> 数据库名称配置的sid 7.测试配置&#xff…...

Java数据结构之装箱拆箱

装箱和拆箱 也叫装包拆包&#xff0c;装包是把那八种基本数据类型转换为它的包装类&#xff0c;拆包则相反 上面这俩种方式都是装包&#xff0c;下面是它的字节码文件 用到了Integer的ValueOf方法&#xff1a; 就是返回了一个Integer类的对象&#xff0c;把它的value属性设置成…...

各版本 操作系统 对 .NET Framework 与 .NET Core 支持

有两种类型的受支持版本&#xff1a;长期支持 (LTS) 版本和标准期限支持 (STS) 版本。 所有版本的质量都是一样的。 唯一的区别是支持的时间长短。 LTS 版本可获得为期三年的免费支持和补丁。 STS 版本可获得 18 个月的免费支持和修补程序。 有关详细信息&#xff0c;请参阅 .N…...

Golang 线程安全与 sync.Map

前言 线程安全通常是指在并发环境下&#xff0c;共享资源的访问被适当地管理&#xff0c;以防止竞争条件&#xff08;race conditions&#xff09;导致的数据不一致 Go语言中的线程安全可以通过多种方式实现 实现方式 互斥锁&#xff08;Mutexes&#xff09; Go的sync包提供…...

1.2 Hadoop概述

小肥柴的Hadoop之旅 1.2 Hadoop概述 目录1.2 Hadoop概述1.2.1 回归问题1.2.2 Google的三篇论文1.2.3 Hadoop的诞生过程1.2.4 Hadoop特点简介 参考文献和资料 ) 目录 1.2 Hadoop概述 1.2.1 回归问题 通过前一篇帖子的介绍&#xff0c;特别是问题思考部分的说明&#xff0c;我…...

Adams许可管理安全控制策略

随着全球信息化的快速发展&#xff0c;信息安全和许可管理问题日益凸显。在这场无形的挑战中&#xff0c;Adams许可管理安全控制策略以其卓越的性能和可靠性&#xff0c;引领着解决这类问题的新潮流。 Adams许可管理安全控制策略是一种全方位、多层次的安全控制方案&#xff0…...

无人地磅系统|内蒙古中兴首创无人地磅和远程高效管理的突破

走进标杆企业&#xff0c;感受名企力量&#xff0c;探寻学习优秀企业领先之道。 本期要跟砼行们推介的标杆企业是内蒙古赤峰市砼行业的龙头企业&#xff1a;赤峰中兴首创混凝土搅拌有限责任公司&#xff08;以下简称为中兴首创&#xff09;。 中兴首创成立于2011年初&#xff…...

【SpringCloud】7、Spring Cloud Gateway限流配置

1、限流介绍 Spring Cloud Gateway 的限流配置主要涉及到令牌桶算法的实现。令牌桶算法可以对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机。 在 Spring Cloud Gateway 中,官方提供了 RequestRateLimiterGatewayFi…...

【gRPC学习】使用go学习gRPC

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 RPC是远程调用,而google实现了grpc比较方便地实现了远程调用,gRPC是一个现代的开源远程过程调用(RPC)框架 概念介绍 在gRPC中&#xff0c;客户端应用程序可以直接调用另一台计算机上的服务器应用程序上的方法&#…...

网站建设需要找工信部吗/网站建设制作

2019独角兽企业重金招聘Python工程师标准>>> 我们经常会看到有些系统&#xff0c;为了提高账户安全性&#xff0c;会在用户输入n次密码时候锁定对应的账户一段时间&#xff0c;这样可以避免暴力破解用户密码&#xff08;说实话这样行不行我也不知道&#xff09;。不…...

网站制作多少钱新闻/seo就是搜索引擎广告

事务的四大特征 1.原子性&#xff1a;一个事务中所有对数据库的操作是一个不可分割的操作序列&#xff0c;要么全做要么全不做 2.一致性&#xff1a;数据不会因为事务的执行而遭到破坏 3.隔离性&#xff1a;一个事物的执行&#xff0c;不受其他事务的干扰&#xff0c;即并发执行…...

网站建设的3个基本原则/成都网站制作费用

目录 1 概念 1.1 Cluster 集群 1.2 Node 节点 1.3 Shard 分片 2 集群搭建 2.1 准备环境 2.2 集群配置 2.3 启动集群和测试 3 集群管理 1 概念 此处以 Elasticsearch 7 为示例说明&#xff0c;以下说到的各种配置参数和名字都是以 Elasticsearch 7 的为准。 Elastics…...

北京网站优化wyhseo/网站排名怎么做上去

public class StaticInnerClassTest{   public static void main(String[] args){     double[] d new double[20];     for(int i 0;i < d.length;i)       d[i] 100*Math.random();     ArrayAlg.Pair p ArrayAlg.minmax(d);     System.out.…...

加盟平台网站怎么做/百度上怎么注册店铺地址

Description \(k\)堆石子&#xff0c;两个人游戏&#xff1a; 首先&#xff0c;A拿走若干堆石子&#xff08;不能全部拿走&#xff09;之后&#xff0c;B拿走若干堆石子&#xff08;不能全部拿走&#xff09;然后从A开始\(Nim\)游戏。问A能不能取胜。如果能&#xff0c;A第一步…...

织梦和wordpress哪个seo好/企业网站seo哪里好

题目描述 输入一个整数n&#xff0c;计算 输入要求 输入一个整数n&#xff08;<100&#xff09;。输出要求 输出计算结果。输入样例 3输出样例 20 参考程序 #include<stdio.h> #include<math.h> int main() { int s0,n,i,a0; scanf("%d",&…...