了解、学习新的IT技术, 老方法:有定义则先从定义入手;其次分析理解定义,思考应用场景;了解、学习已有使用案例,并与预设想的场景对比。另外,了解新事物的历史也是非常有必要的。
一、定义:
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了 页面抓取 (更确切来说是网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。
二、解释:
从定义中,可以提取中一下几点重要信息:
1、应用框架
应用:是相对于”理论“而言,可以方便被使用、应用。
框架:IT语境中的框架,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构。在此结构上可以根据具体问题扩展、安插更多的组成部分,从而更迅速和方便地构建完整的解决问题的方案。可以初步猜想此框架还是属于web 框架范畴,框架原理还是基于MVC,但考虑到该框架是用来做爬虫的,所以它主要是偏重于M和C层的。
2、爬取网站数据
为该框架的核心功能,底层用到的应该是urllib和urllib2模块。但作为一个爬虫框架还应该可以轻松配置发送多并发web请求的,配置各种特有功能中间件等,设置请求cookie、请求头、缓存等等,爬虫状态监测及获取、异常处理等等。
3、提取结构性数据
关于提取结构性数据这块,python已有组件如:beautifulsoup,xml。可以设想在分析结构性数据这块时,scrapy可能既会保留对beautifulsoup、xml调用的支持,也有可能自己写一套解析模块。
三、知识过渡与整体理解:
Items:爬取的主要目标就是从非结构性的数据源提取结构性数据,Item就是用来保存爬取到的结构性数据的容器,数据类型为python的dict。
Spider:简而言之,就是定义爬取的动作及分析某个网页(或者部分网页)的地方。
Selectors:称作选择器(seletors),是指通过特定的 XPath 或者 CSS 表达式来“选择” HTML文件中的某个部分。
Item Pipeline:当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。
与web框架概念对比:
Scrapy | Items | Spider | selectors | Item Pipeline |
web框架 | models(M层) | views(视图控制函数) | model中的field值 | 类似于models中对应的save函数 |
四、举例:
就拿自己做过的一个项目举例吧。
大致需求是:获取同行业网站的所有产品以及产品下面的评论,并提取对应产品的标题以及评论中的关键词(主要为名词和形容),最后将数据存储到mongodb中。
(以下省略)
协同推荐算法有两种:1、基于用户的协同推荐 2、基于商品的协同推荐。
一、基于用户的协同推荐
鉴于它只是一个算法、思想而非一门具体的技术或者编程语言, 所以可跳过定义部分,直接进入分析理解阶段。
(以下省略)
前面已对elasticsearch做过简单的介绍:Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。
一、定义:
Elasticsearch is a highly scalable open-source full-text search and analytics engine. It allows you to store, search, and analyze big volumes of data quickly and in near real time. It is generally used as the underlying engine/technology that powers applications that have complex search features and requirements.
二、解释:
elasticsearch是一个高可扩展的开源全文搜索和分析引擎。它可以做到快速并接近于实时地存储、搜索和分析大容量数据。它通常被用作那些有复杂搜索特性和需求的大型应用的底层引擎(技术)。
三、知识过渡与整体理解:
elasticsearch主要对象概念有:集群(cluster)、节点(node)、索引(index)、类型(type)、文档(document)、分片以及备份(Shards & Replicas)、字段(field)、mapping(字段类型映射)、结构体(dsl)等。
集群:一个或者一个以上节点的集合,可以访问到全部的节点数据以及可以发送请求到该名下所有节点(即可以在所有节点上提供联合索引和搜索功能)。
节点:是指一台服务器,可以存储数据、创建索引以及提供搜索功能。
索引:是具有相似特性的文档集合。
类型:官网没有确切的定义,一个索引可以包含一个或者一个以上的类型,可以理解成索引的逻辑类别/分区。
文档:是指可以被索引的信息的基本单位。
分片:由于索引可以存储大量的数据,这些数据可能超过单个节点的硬件限制, 因此Elasticsearch提供细分你的指标分成多个块称为碎片的能力。
备份(副本)分片:顾名思义当主分片出现故障时, 将使用一套完整的副本分片进行工作。
字段:一份文档由多个字段组成。
字段类型映射:给文档的每个字段指定对应elastcisearch的数据类型。
结构体:用于创建索引、查询、过滤等的结构化数据。
与最常用的关系型数据库对比如下:
另:es创建索引的方式是采取倒排索引的数据方式,而关系型数据库只是对特定的表字段创建索引且方式也有不同:如 B-Tree索引。
四、交互、语法指令以及查询结构体(DSL):
交互:如何与Elasticsearch交互取决于你是否使用Java,对于java用户有两种客户端:节点客户端(node client)与传输客户端(Transport client),这里不做详细讲解。
这里主要介绍下另一种交互方式:基于HTTP协议,以JSON为数据交互格式的RESTful API。其他所有程序语言都可以使用RESTful API,通过9200端口的与Elasticsearch进行通信,你可以使用你喜欢的WEB客户端,事实上,如你所见,你甚至可以通过curl
命令与Elasticsearch通信。注:Elasticsearch官方提供了多种程序语言的客户端——Groovy,Javascript, .NET,PHP,Perl,Python,以及 Ruby——还有很多由社区提供的客户端和插件,所有这些可以在文档中找到。
语法指令:向Elasticsearch发出的请求的组成部分与其它普通的HTTP请求是一样的:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
结构体:结构体相当于上述语法指令中BODY, 三中已提到。
关于结构体首先要了解过滤与查询命令的区别:查询语句不仅要查找相匹配的文档,还需要计算每个文档的相关性,所以一般来说查询语句要比 过滤语句更耗时,并且查询结果也不可缓存,过滤语句的目的就是缩小匹配的文档结果集, 因此过滤语句不参与匹配度值的计算而查询语句的匹配与否会加入到匹配度的计算中。除上述区别外,查询语句与过滤语句的子句写法基本是一致的。关于查询和过滤子句的写法主要了解下以下几种命令的使用:
match:用于基本的匹配子句。
must:值为列表,表示其包含子句都必须全部满足,缺一不可。
should:值为列表, 表示只要满足其包含的部分子句即可,默认为1条,可通过变量minimum_should_match设定满足条数或者百分数
must_not:值为列表,表示其包含子句都必须全部不满足,满足任何一条都不可。
phrase_match:用于词组匹配子句,表示输入的词必须全部满足,词与词可以被其他词隔开,可通过变量slop来控制隔其他词的数量。
term:用于完全匹配子句,表示被匹配的内容必须完全与输入的匹配词一致。
dis_max:或查询,功能可以说与should 类似,一般用于得到多个搜索逻辑相差很大的搜索结果的并集。
另外and or等命令比较容易理解,用于匹配语句之中。
四、例子:
略,结合上述讲解的命令,基本已经能满足任何搜索需求了。如有问题可邮件联系。
Copyright © 2021.aoyanming个人博客站