2022年api原料药展情况-api原料药上市公司
这是爬虫专栏第?「16」?篇原创
想查数据,就免不了搜索,而搜索离不开搜索引擎。百度、谷歌都是非常庞大、复杂的搜索引擎,它们几乎索引了互联网上开放的所有网页和数据。然而对于我们自己的业务数据来说,没必要用这么复杂的技术。如果我们想实现自己的搜索引擎,为了便于存储和检索,Elasticsearch 就是不二选择。它是一个全文搜索引擎,可以快速存储、搜索和分析海量数据。
所以,如果我们我们将爬取到的数据存储到 Elasticsearch 里面,那将会非常方便检索。
1. Elasticsearch 介绍Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene? 基础之上。
那 Lucene 又是什么呢?Lucene 可能是目前存在的(不论开源还是私有的)拥有最先进、高性能和全功能搜索引擎功能的库,但也仅仅只是一个库。要想用 Lucene,我们需要编写 Java 并引用 Lucene 包才可以,而且我们需要对信息检索有一定程度的理解。
为了解决这个问题,Elasticsearch 就诞生了。Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目标是使全文检索变得简单,相当于 Lucene 的一层封装,它提供了一套简单一致的 RESTful API 来帮助我们实现存储和检索。
所以 Elasticsearch 仅仅就是一个简易版的 Lucene 封装吗?那就大错特错了,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。它可以这样准确形容:
一个分布式的实时文档存储,每个字段可以被索引与搜索;
一个分布式实时分析搜索引擎;
能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。
总之,它是一个非常强大的搜索引擎,、Stack Overflow、GitHub 都纷纷采用它来做搜索,不仅仅提供强大的检索能力,也提供强大的存储能力。
2. Elasticsearch 相关概念在 Elasticsearch 中有几个基本概念,如节点、索引、文档等,下面分别说明一下。理解了这些概念,对熟悉 Elasticsearch 是非常有帮助的。
节点和集群Elasticsearch 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elasticsearch 实例。
单个 Elasticsearch 实例称为一个节点(Node),一组节点构成一个集群(Cluster)。
索引索引,即 Index,Elasticsearch 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elasticsearch 数据管理的顶层单位就叫作索引,其实就相当于 MySQL、MongoDB 等中数据库的概念。另外,值得注意的是,每个索引 (即数据库)的名字必须小写。
文档文档,即 Document。索引里面单条记录称为文档,许多条文档构成了一个索引。
同一个索引里面的文档,不要求有相同的结构(Schema),但是最好保持一致,因为这样有利于提高搜索效率。
类型文档可以分组,比如 weather 这个索引里面,既可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫作类型(Type),它是虚拟的逻辑分组,用来过滤文档,类似 MySQL 中的数据表、MongoDB 中的 Collection。
不同的类型应该有相似的结构。举例来说,id 字段不能在这个组中是字符串,在另一个组中是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如 products 和 logs)应该存成两个索引,而不是一个索引里面的两个类型(虽然可以做到)。
根据规划,Elastic 6.x 版只允许每个索引包含一个类型,Elastic 7.x 开始将会将其彻底移除。
字段每个文档都类似一个 JSON 结构,它包含了许多字段,每个字段都有其对应的值,多个字段组成了一个文档,其实就可以类比 MySQL 数据表中的字段。
在 Elasticsearch 中,文档归属于一种类型(Type),而这些类型存在于索引中,我们可以画一些简单的对比图来类比传统关系型数据库:
Relational?DB?->?Databases?->?Tables?->?Rows?->?ColumnsElasticsearch?->?Indices?->?Types->?Documents?->?Fields以上就是 Elasticsearch 里面的一些基本概念,通过和关系型数据库的对比更加有助于理解。
3. 准备工作在开始本节实际操作之前,请确保已经正确安装好了 Elasticsearch,安装方式可以参考:,安装完成之后确保其在本地 9200 端口上正常运行即可。
Elasticsearch 实际上提供了一系列 Restful API 来进行存取和查询操作,我们可以使用 curl 等命令或者直接调用 API 来进行数据存储和修改操作,但总归来说并不是很方便。所以这里我们就直接介绍一个专门用来对接 Elasticsearch 操作的 Python 库,名称也叫做 Elasticsearch,使用 pip3 安装即可:
pip3?install?elasticsearch更详细的安装方式可以参考:。
安装好了之后我们就可以开始本节的学习了。
4. 创建索引我们先来看下怎样创建一个索引,这里我们创建一个名为 news 的索引:
from?elasticsearch?import?Elasticsearches?=?Elasticsearch()result?=?es.indices.create(index='news',?ignore=400)print(result)这里我们首先创建了一个 Elasticsearch 对象,并且没有设置任何参数,默认情况下它会连接本地 9200 端口运行的 Elasticsearch 服务,我们也可以设置特定的连接信息,如:
es?=?Elasticsearch(['#?是否验证?SSL?证书)第一个参数我们可以构造特定格式的链接字符串并传入,hostname 和 port 即 Elasticsearch 运行的地址和端口,username 和 password 是可选的,代表连接 Elasticsearch 需要的用户名和密码,另外而且还有其他的参数设置,比如 verify_certs 代表是否验证证书有效性。更多参数的设置可以参考:#elasticsearch。
声明 Elasticsearch 对象之后,我们调用了 es 的 indices 对象的 create 方法传入了 index 的名称,如果创建成功,会返回如下结果:
{'acknowledged':?True,?'shards_acknowledged':?True,?'index':?'news'}可以看到,其返回结果是 JSON 格式,其中的 acknowledged 字段表示创建操作执行成功。
但这时如果我们再把代码执行一次的话,就会返回如下结果:
{'error':?{'root_cause':?[{'type':?'resource_already_exists_exception',?'reason':?'index?[news/hHEYozoqTzK_qRvV4j4a3w]?already?exists',?'index_uuid':?'hHEYozoqTzK_qRvV4j4a3w',?'index':?'news'}],?'type':?'resource_already_exists_exception',?'reason':?'index?[news/hHEYozoqTzK_qRvV4j4a3w]?already?exists',?'index_uuid':?'hHEYozoqTzK_qRvV4j4a3w',?'index':?'news'},?'status':?400}它提示创建失败,status 状态码是 400,错误原因是索引已经存在了。
注意在这里的代码中,我们使用的 ignore 参数为 400,这说明如果返回结果是 400 的话,就忽略这个错误,不会报错,程序不会抛出异常。
假如我们不加 ignore 这个参数的话:
es?=?Elasticsearch()result?=?es.indices.create(index='news')print(result)再次执行就会报错了:
raise?HTTP_EXCEPTIONS.get(status_code,?TransportError)(status_code,?error_message,?additional_info)elasticsearch.exceptions.RequestError:?TransportError(400,?'resource_already_exists_exception',?'index?[news/QM6yz2W8QE-bflKhc5oThw]?already?exists')这样程序的执行就会出现问题。因此,我们需要善用 ignore 参数,把一些意外情况排除,这样可以保证程序正常执行而不会中断。
创建完之后,我们还可以设置下索引的字段映射定义,可以参考:#elasticsearch.client.IndicesClient.put_mapping。
5. 删除索引删除索引也是类似的,代码如下:
from?elasticsearch?import?Elasticsearches?=?Elasticsearch()result?=?es.indices.delete(index='news',?ignore=[400,?404])print(result)这里也使用了 ignore 参数来忽略索引不存在而删除失败导致程序中断的问题。
如果删除成功,会输出如下结果:
{'acknowledged':?True}如果索引已经被删除,再执行删除,则会输出如下结果:
pip3?install?elasticsearch0这个结果表明当前索引不存在,删除失败。返回的结果同样是 JSON,状态码是 404,但是由于我们添加了 ignore 参数,忽略了 404 状态码,因此程序正常执行,输出 JSON 结果,而不是抛出异常。
6. 插入数据Elasticsearch 就像 MongoDB 一样,在插入数据的时候可以直接插入结构化字典数据,插入数据可以调用 create 方法。例如,这里我们插入一条新闻数据:
pip3?install?elasticsearch1这里我们首先声明了一条新闻数据,包括标题和链接,然后通过调用 create 方法插入了这条数据。在调用 create 方法时,我们传入了 4 个参数,index 参数代表了索引名称,id 则是数据的唯一标识 ID,body 则代表了文档的具体内容。
运行结果如下:
pip3?install?elasticsearch2结果中 result 字段为 created,代表该数据插入成功。
另外,其实我们也可以使用 index 方法来插入数据。但与 create 不同的是,create 方法需要我们指定 id 字段来唯一标识该条数据,而 index 方法则不需要,如果不指定 id,会自动生成一个 id。调用 index 方法的写法如下:
pip3?install?elasticsearch3create 方法内部其实也是调用了 index 方法,是对 index 方法的封装。
7. 更新数据更新数据也非常简单,我们同样需要指定数据的 id 和内容,调用 update 方法即可,代码如下:
pip3?install?elasticsearch4这里我们为数据增加了一个日期字段,然后调用了 update 方法,结果如下:
pip3?install?elasticsearch5可以看到,返回结果中 result 字段为 updated,即表示更新成功。另外,我们还注意到一个字段 _version,这代表更新后的版本号数,2 代表这是第二个版本。因为之前已经插入过一次数据,所以第一次插入的数据是版本 1,可以参见上例的运行结果,这次更新之后版本号就变成了 2,以后每更新一次,版本号都会加 1。
另外,更新操作利用 index 方法同样可以做到,其写法如下:
pip3?install?elasticsearch6可以看到,index 方法可以代替我们完成插入和更新数据这两个操作。如果数据不存在,就执行插入操作,如果已经存在,就执行更新操作,非常方便。
8. 删除数据如果想删除一条数据,可以调用 delete 方法并指定需要删除的数据 id 即可。其写法如下:
pip3?install?elasticsearch7运行结果如下:
pip3?install?elasticsearch8可以看到,运行结果中 result 字段为 deleted,代表删除成功;_version 变成了 3,又增加了 1。
9. 查询数据上面的几个操作都是非常简单的操作,普通的数据库如 MongoDB 都可以完成,看起来并没有什么了不起的,Elasticsearch 更特殊的地方在于其异常强大的检索功能。
对于中文来说,我们需要安装一个分词插件,这里使用的是 Elasticsearch-analysis-ik,其 GitHub 链接为。这里我们使用 Elasticsearch 的另一个命令行工具 elasticsearch-plugin 来安装,这里安装的版本是 7.13.2,请确保和 Elasticsearch 的版本对应起来,命令如下:
pip3?install?elasticsearch9这里的版本号请替换成你的 Elasticsearch 版本号。
安装之后,我们需要重新启动 Elasticsearch,启动之后它会自动加载安装好的插件。
首先,我们重新新建一个索引并指定需要分词的字段,相应代码如下:
from?elasticsearch?import?Elasticsearches?=?Elasticsearch()result?=?es.indices.create(index='news',?ignore=400)print(result)0这里我们先将之前的索引删除了,然后新建了一个索引,接着更新了它的 mapping 信息。mapping 信息中指定了分词的字段,指定了字段的类型 type 为 text,分词器 analyzer 和搜索分词器 search_analyzer 为 ik_max_word,即使用我们刚才安装的中文分词插件。如果不指定的话,则使用默认的英文分词器。
接下来,我们插入几条新数据:
from?elasticsearch?import?Elasticsearches?=?Elasticsearch()datas?=?[{'title':?'高考结局大不同','url':?'},{'title':?'进入职业大洗牌时代,“吃香”职业还吃香吗?','url':?'},{'title':?'乘风破浪不负韶华,奋斗青春圆梦高考','url':?'},{'title':?'他,活出了我们理想的样子','url':?'}]for?data?in?datas:pip3?install?elasticsearch3这里我们指定了 4 条数据,它们都带有 title 和url 字段,然后通过 index 方法将其插入 Elasticsearch 中,索引名称为 news。
接下来,我们根据关键词查询一下相关内容:
from?elasticsearch?import?Elasticsearches?=?Elasticsearch()result?=?es.indices.create(index='news',?ignore=400)print(result)2可以看到,这里查询出了插入的 4 条数据:
from?elasticsearch?import?Elasticsearches?=?Elasticsearch()result?=?es.indices.create(index='news',?ignore=400)print(result)3可以看到,返回结果会出现在 hits 字段里面,其中 total 字段标明了查询的结果条目数,max_score 代表了最大匹配分数。
另外,我们还可以进行全文检索,这才是体现 Elasticsearch 搜索引擎特性的地方:
from?elasticsearch?import?Elasticsearches?=?Elasticsearch()result?=?es.indices.create(index='news',?ignore=400)print(result)4这里我们使用 Elasticsearch 支持的 DSL 语句来进行查询,使用 match 指定全文检索,检索的字段是 title,内容是“中国 领事馆”,搜索结果如下:
from?elasticsearch?import?Elasticsearches?=?Elasticsearch()result?=?es.indices.create(index='news',?ignore=400)print(result)5这里我们看到匹配的结果有两条,第一条的分数为 1.7796917,第二条的分数为 0.81085134,这是因为第一条匹配的数据中含有“高考”和“圆梦”两个词,第二条匹配的数据中不包含“圆梦”,但是包含了“高考”这个词,所以也被检索出来了,但是分数比较低。
因此,可以看出,检索时会对对应的字段进行全文检索,结果还会按照检索关键词的相关性进行排序,这就是一个基本的搜索引擎雏形。
另外,Elasticsearch 还支持非常多的查询方式,这里就不再一一展开描述了,总之其功能非常强大,详情可以参考官方文档:。
10. 总结以上便是对 Elasticsearch 的基本介绍以及使用 Python 操作 Elasticsearch 的基本用法,但这仅仅是 Elasticsearch 的基本功能,它还有更多强大的功能等待着我们去探索。
本节代码地址:。
非常感谢你的阅读,更多精彩内容,请关注我的公众号「进击的 Coder」和「崔庆才丨静觅」。
原文:在这篇文章里1。Kamatera_完全可定制的云VP,具有出色的Python应用程序性能2。Scala托管——价格合理的托管VP,完全支持Python3。1和1IONOS_非托管Python友好主机的最低价格4。SiteGround——基于云端的Python应用程序托管服务5。LiquidWeb_对Python6的最佳支持。HostPapa_具有多个管理级别的可更新Python主机哪个Python主机适合我?常见问题解答:为Python应用程序选择错误的web主机可能会浪费时间和金钱。许多web托管提供商将自己标记为“开发者友好型”,但仅将SSH访问锁定在高级计划中,或者不支持您想要使用的框架。
在最坏的情况下,由于缺乏CGI或mod_wsgi支持,Python甚至可能无法与某些主机一起工作。这通常是预算共享托管计划的一个问题,但阅读VP和云服务器的细节仍然是值得的,尤其是如果它们被管理的话。
我们已经测试了尽可能多的Python友好型主机,看看哪一个提供了最灵活、最舒适的工作环境。然后我把这个名单削减到前六名。请继续阅读,为您的发展需求找到合适的主机!
时间短?这些是最好的Python托管服务Kamatera_性能卓越的可定制云VP3Scala托管_价格合理的托管VP,具有出色的控制面板31和1IONOS_非托管VPS最便宜的选项之一参见Kamatera的最佳交易>>3更多优秀选项|比较表|FAQ
我们在最佳Python托管中寻找的内容托管服务没有成功,但提供了以下功能的托管服务:SSH根访问:您需要完全根访问权限来安装必要的开发框架(例如Django),连接到服务器并检查Python版本,切换到新版本,以及配置项目所需的任何模块。A功能强大的服务器控制面板:大多数主机对控制面板收取额外费用,但有些主机甚至在基本软件包中也包括一个。这意味着您只需点击几下就可以设置Python环境。Python支持:配置VPS或专用服务器会带来一些问题。最好的Pythonweb主机拥有全面的知识库和专业的支持团队,可以帮助调试。Value:许多web托管服务提供低价来吸引客户,但在这个过程中,它们往往会损害CPU、RAM、存储和带宽。我的列表中的托管解决方案提供了运行Pythonweb应用程序所需的所有资源,而不必为一堆你不会真正使用的额外资源收取过高的费用。1。Kamatera_完全可定制的云VPS具有出色的Python应用程序性能使用Kamatera,您可以从头构建云VPS,设置Python应用程序所需的确切vCPU核心和RAM。该平台比大多数其他VPS主机更具可定制性,而且价格相对较低。
KamateraVPSHostingPlanNames存储带宽PuramPricePlanNames存储带宽PuramPriceExpress1vCPU-LinuxCentOS830GB5TB1vCPU1GB$4.00更多详细信息按1vCPU-WindowsServer201930GB5TB1vCPU1GB$23.00更多详细信息按2vCPU-LinuxCentOS830GB5TB2vCPU2GB$12.00更多详细信息按2vCPU-WindowsServer201930GB5TB2vCPU2GB$29.00更多详细信息按4vCPU-LinuxCentOS850GB5TB4vCPU4GB$28.00更多详细信息按4vCPU-WindowsServer201950GB5TB4vCPU4GB$45.00更多详细信息按完全管理1vCPU20GB5TB1vCPU1GB$54.00更多详细信息按完全管理2vCPU50GB5TB2vCPU2GB$64.00更多详细信息按完全管理4vCPU100GB5TB4vCPU4GB$82.00更多详细信息按完全管理8vCPU250GB5TB8vvCPU8GB$133.00更多详细信息由于VPS未被管理,你将拥有一块空白的石板,拥有完全的根访问权限来构建任何你想要的东西。这非常适合希望带来定制操作系统或控制面板,或进行其他地方不可能的配置更改的Python开发人员。此外,我们的性能测试表明,Kamatera提供了该列表中一些最快的加载速度,以及良好的正常运行时间。
Kamatera唯一的缺点是,您需要自己维护服务器,这可能很耗时。托管服务是可用的,但它比许多其他主机更昂贵。
功能30天免费试用-Kamatera提供30天无风险试用。你可以创建一个价值高达100美元的云VPS,并且可以不受限制地访问大多数功能。全球数据中心——Kamatera有13个数据中心分布在各大洲,无论在哪里,都能让您以快速、低延迟的性能为观众服务。5TB月带宽——大多数云服务器配置的月带宽为5TB,无需额外收费。这应该能很好地服务于大多数开发人员。超过此限制将产生少量超额费用。快速且易于扩展——如果你的Python应用需要更多资源,只需点击几下,你就可以轻松添加RAM、CPU和存储。这一改变将在几秒钟内生效——你不会被一个苦苦挣扎的应用程序所左右。在我们的Kamatera评论中查看自己的性能测试结果。
非托管云VPSMoneyBackGuarante30天免费trialServer位置的起价4美元北美、欧洲、中东和亚洲地区支持是的,可选的附加Python支持共享计划不适用免费附加功能Sprivatecloudnetwork,服务器映像选择S 查看Kamatera最新的VPS交易>>2。ScalaHosting_价格合理的托管VP,具有完整的Python支持ScalaHosting是市场上最便宜的托管VPS提供商之一,起价低至每月14.95美元。如果你一直被托管服务的便利性所吸引,但价格却让你望而却步,那么Scala主机可能值得一看。
Scala托管VPS主机计划名称存储CPURAMPricePlan名称存储CPURAMPriceManagedCloudVPSStart20GBSSD1CORE2GB$14.95更多详细信息托管云VPSAdvanced30GBSSD2CORES4GB$32.95更多详细信息托管云VPS业务50GBSSD4CORES6GB$72.95更多详细信息托管云VPSEnterprise80GBSSD6CORES8GB$152.95更多详细信息自管云VPSStart50GBSSD1CORE2GB$26.00更多详细信息详细信息自管云VPS高级70GBSSD2核心4GB$30.00更多详细信息自管云VPS业务100GBSSD4核心6GB$42.00更多详细信息自管云VPS企业150GBSSD6核心8GB$68.00更多详细信息从ScalaHosting购买任何托管服务时包括免费域。托管服务范围广泛,涵盖初始服务器设置、优化、安全、,和维护。也就是说,您将不得不牺牲根访问。
Scala主机还提供了一个名为SPanel的专有控制面板,它方便地提供了完整的Python支持。它提供了SSH访问和Softaculous应用程序安装程序,您只需点击几下就可以轻松安装所选的Python框架。当然,cPanel可以完成上述所有功能,但SPanel可以说更为用户友好。
提供非托管服务器功能如果您希望拥有完整的根访问权限,ScalaHosting还提供非托管服务器。但是,非常基本的VPS不可用——入门级选项包括4个vCPU内核和8GBRAM,要价很高。可选cPanel——虽然Scala主机的SPanel是一个不错的选择,但您可以使用经过测试的cPanel。该许可证将产生少量额外费用。SShieldsecurity_如果您使用SPanel,您将受益于集成的SShield安全解决方案。它使用人工智能技术检测恶意活动,并阻止所有常见形式的网络攻击。每日备份和快照_ScalaHosting的托管VPS包括远程每日备份。此外,Scala主机将每天拍摄VP的快照,最后两个快照始终保持可用,以便恢复。要了解更多信息,请查看我们的Scala主机评论。
托管VPS的起价为14.95美元,提供30天的资金担保服务器位置北美和欧洲的eManaged支持共享计划上的Spython支持免费附加功能免费域名和专用IP地址请参阅ScalaHosting的最新VPS交易>>3。1&1IONOS_非托管Python友好型主机的最低价格如果预算紧张,1&1IONOS为非托管VPS计划提供了一些最低价格_在某些情况下甚至低于Kamatera。尽管如此,我们的测试表明性能良好——当然,这不是最快的选择,但它仍然具有竞争力。VPS的
价格起价仅为每月4.99美元。然而,它只有512MBRAM和1个vCPU。它肯定可以用于轻量级项目或原型,但对于严肃的工作,我建议使用VPSM。这将使RAM和vCPU比VPS翻一番,每月只需几美元。
1&1IONOSVPS主机计划名称存储CPURAMPRICEPLAN名称存储CPURAMPRICEPRICEVITUALServerS30GB1core512MB$4.99更多详细信息虚拟服务器M50GB1core1GB$4.99更多详细信息虚拟服务器L80GB2Core2GB$9.99更多详细信息虚拟服务器XL120GB2cores4GB$19.99更多详细信息虚拟服务器XXL160GB4cores8GB$29.99更多详细信息购买任何主机时都包括免费域如果你是Python开发新手,来自1&1IONOS1&1IONOS的服务价格低廉,这是一个很好的起点。没有托管服务,但您将获得使用非托管VPS的宝贵经验。
功能预算共享托管_1&1IONOS提供共享托管计划,并提供完整的Python支持,价格更低。最便宜的包括无限存储空间,可以存储任意数量的网站,但续费后价格会显著上涨。API可用_如果您想通过编程控制主机,可以使用1&1IONOS的API。您可以管理VP、发票、活动日志等。专用个人顾问_所有1号和1号IONOS定制声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。