搜索推荐技术在电商导购领域的应用(二):爬虫

搜索推荐技术在电商导购领域的应用(二):爬虫,第1张

搜索推荐技术在电商导购领域的应用(二):爬虫

文/高杨

什么是爬行动物?

爬虫只是对品牌形象的描述,不是那种到处跑的树枝...爬虫是一种全自动获取网页的程序流,是百度搜索引擎的关键组成部分,也是数据处理的第一阶段方法。大致可以分为传统型和立式两种。传统型是google和百度大搜索爬虫。这个详细介绍的就是电子商务的垂直爬虫。

做一个简单的爬虫是非常容易的。如果你写下下面一行代码:

wgethttp://www.meituan.com/

然后...

听着,很简单,对吧?大家都觉得写爬虫很简单,也预示着爬虫生命的开始…

以上代码足够学生教了,但实战演练还有很多难题要处理。爬行动物的基本工作包括抓取、提取和存储。来说说他们吧。

(I)抓取

1。编号识别和换页

互联网上的大部分网页都是基于http协议的,但是它们的编号各不相同,比如utf-8,gbk,gb2312。如果忽略了编号问题,有些浏览器会下载错误的代码,导致无法应用。

一般会在网页的头部logo中识别号码。比如总会有不靠谱的网址维护者不按规范来。具体数字不一定是utf8。大家都制定了一个通用的技术方案:数字智能识别。大家把每个数字的公共字段名的二进制码嵌入进去,然后把网页二进制化,找出匹配度较大的那个作为这个网页的真实数字。这个方法很合理,准确率99%,就是消耗一点CPU。大家基本都是用这种方法来识别网页的页码,忽略了字符集标志。

另外,很多电商产品的网页,有些是ajax多线程加载的,经常是POST使用。马上应用wget和curl有很多麻烦,一定要应用。大家对它进行了整体封装,内部称这个类库为httpfetcher。

2。智能生产调度和升级

电商页面变化频繁,尤其是产品价格的字段名称,有时候基本上十几分钟就变一次。上亿的产品库很难保证每一个产品都能马上升级。如何用相对有限的资源去抢最应该升级的产品,是一个难点。以产品升级为例,大家根据门店场景选择生产调度方式。不同的商店场景有不同的升级频率,每个爬虫承担日常抓取特殊场景的任务,称为一环。发现环进行细粒度发现,升级环进行细粒度升级,杀伤环进行限时秒杀类的粗粒度升级,如下图所示

3。反复抓挠以避免

网络带宽,嗯,网络带宽……说到网络带宽,爬虫们都皱起了眉头。个体户小公司不是BAT那样不缺钱的老板。北京等地区的网络带宽很贵。如果能省下一点网络带宽,年终奖就出来了。gzip减少了这类升级包的内容后,大家还必须应对反复的网页抓取,以节省网络带宽。

人人管理方法的网址是亿级的。hashmap一般不能保存在运行内存中,所以必须应用BloomFilter。

BloomFilter是室内空中一个任意的高效算法设计。它用位数组简单地表示一个组合,可以区分一个元素是否属于这个组合。

实际上,下面好像是BloomFilter如何指示与位数组的组合。在初始状态下,BloomFilter是一个由M位组成的位数组,每个位都设置为0。

为了更好地表达像S={x1,x2,…,xn}这样的n个元素的组合,BloomFilter应用了k个独立同分布的Hash函数,它们各自将组合中的每个元素投影到{1,…,m}的范畴中。对于任意一个素数x,第I个哈希函数投影的位置hi(x)将被设置为1(1≤i≤k)。注意,如果一个部分被多次设置为1,那么只有第一次有效,后面的几次没有实际效果。下图中k=3,有两个哈希函数选择同一个部分(左起第五个)。

在区分Y是否属于这个组合时,我们对Y使用第k个哈希函数,如果hi(y)的所有部分都是1(1≤i≤k),那么我们会认为Y是组合中的元素,否则我们会认为Y不是组合中的元素。下图中的Y1不是绑定元素。Y2要么属于这种组合,要么恰好是假阳性。

这种高效率的布鲁姆过滤器有一定的成本:

1.在区分某个元素是否属于某个组合时,有可能将不属于这个组合的元素误认为属于这个组合(假阳性)。但是根据爬虫情况,判断一个网址是否被爬取是可以接受的。

2.无法取消设置。如果某个网页之前已经抢过了,由于各种原因想再抢,在BloomFilter下无法清除情况再抢。根据实际情况,我们选择按时清除BloomFilter,在网络带宽消耗和未设置之间取得平衡。

另外,防堵等。应该在抢的时候处理。

(二)提取

垂直爬虫涉及的网页空之间的相关性相对集中,对算法的设计要求高,必须按照模板来处理。我们定义并应用了四种模板:URL模板、目录模板、产品模板和评估模板。下面简单说说前三种。

URL模板

1。URL规范化

一个产品url可以标记一个独特的产品,同样的产品很可能在网站上有不同的URL。这有很多原因。第一,渠道不一样,点开上一个网页,目录页和搜索页不一样。第二,URL背后往往包含统计数据。那会导致很多杜兰特产品重复,其BloomFilter失效。所以必须选择一定的标准,将这类网址转换成同类网址,由大家来归一化。

2。URL功能

制定不同的标准来判断是目录网址还是商品网址,方便采取不同的抓取对策。举一些URL模板的例子:

产品URL模板

www.jd.com|^/product/[0-9]\.html.*$

book.jd.com|^/[0-9]\.html.*$

目录模板

今天的描述是一个目录模板,从模板中获取的信息内容必须是产品的总页数。

目录连接意味着这个连接的顶部充满了跳出连接。根据获取所有的连接,然后与当今网站产品的URL特征进行匹配,就可以获得纯粹的产品URL连接,从而 *** 纵发现连接的准确性。

当网页可以更改时,种子URL模板如下

http://www.JD.com/products/652-828-1107-0-0-0-0-0-0-0-1-5-[xx]。超文本标记语言

当一个爬虫收到这种连接时,会按照原来的默认设置启动页面,大步爬上第一个网页。

http://www.JD.com/products/652-828-1107-0-0-0-0-0-0-0-1-5-1.html.抓取完成后,根据目录模板获取产品的总页数,加载到连接目标中进行持久化。然后,这个连接探索和找到的产品连接及其本身被加载到URLDB中。当爬虫下一次从URLDB获取这个连接时,发现这个连接可以换页,于是根据今天的pageIndex,pageStep,计算下一个网页。然后抓取下一个网页。

产品模板

在初始产品模板中,使用Xpath正则表达式、JS子模板和自定义关系表达式来分析产品信息。Xpath正则表达式很常见,百度独立搜索。JS子模板用于处理一些技术问题。

1.完成在分析一个网页的时候启用他儿子的网页(ajax),因为有时候产品页面的html编码里没有一些产品信息(比如评价数量),只能得到产品页面的子网页(比如评价页面);

2.完成从网页中提取内容,并将其转移到一个中间变量(虚拟模板项)。因为有时候一个最终结果只能通过求解两个正的和中间的结果才能得到,所以需要建立几个中间变量。

JS子模板这个名字不太好。一开始我会处理以后javascript带来的问题,所以以后不想改了。随着技术的迭代更新和升级,一种发达的开发语言(内部编号,庞然大物)慢慢被应用来简化模板提取。由于开发语言的协调能力,behemoth基本可以保证所有级别的解决方案,可以用来提取产品SKU、评价等。在这个阶段,人正在慢慢向庞然大物转变。

Behemoth大大简化了模板编写工作,隐藏了很多技术信息内容(比如常见的xpath和正则表达式封装),让模板编写人员只关心领域模型。此外,大多数电子商务网页都是由具有重叠根的ajax实现的。behemoth首先在dom3D中渲染所有网页,然后提取它们。每个提取的模板都是一个代码单元,大大降低了模板编写的复杂度。

Behemoth的成本也很高,因为在许多3D渲染工作中,提取一个网页所需的时间是以前的几倍。总的来说,还是利大于弊。

这是一些早期模板的例子。

就是这个阶段模板的演变。

是的,还有一个问题。模板太多了。如果模板无效,我们如何检测它们?所以我们的产品开发了全自动智能机器人进行检测,会准时挑出有任何问题的模板,让人力更换升级。这种架构,维护几千个网站不成问题。

另外,大家都把技术从三代产品研发中提炼出来了,模板工作可能会进一步减少50%。

(3)保存

管理办法的URL链接肯定是几百亿,产品是几十亿。为了更好地分析和方便地加载,必须应用任意写入和顺序写入的分布式存储。关系型数据信息不可能满足所有人的要求,所以一定是no-sql。前期我们开发了一套系统文件——MiniStore。随着信息量的增加,维护成本很高。中后期改用Cassandra,现在应用更新的Hadoopredis。关于Cassandra,Redis,Hadoop的文章很多,两个系统软件各有特点,这里就不讨论了。

摘要

要写好一个爬虫,必须是苦练内功,堪称技术领域的活雷锋。

一个优秀的爬虫在百度搜索引擎中起着至关重要的作用。它是关键数据信息的根源。越高的解,对之后的解的帮助越大。

拓宽阅读文章:
  • 推荐技术在电子商务导购行业的应用:词性标注
  • 推荐技术在电子商务导购行业的应用(三):自动分类
  • 欢迎分享,转载请注明来源:内存溢出

    原文地址: https://outofmemory.cn/zz/765307.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-02
    下一篇 2022-05-02

    发表评论

    登录后才能评论

    评论列表(0条)

    保存