Python爬虫设计入门重庆大学软件服务工程实验室余俊良UsingPythonToDesignACrawlerSummarize•基本的爬虫工作原理•简单爬虫设计–入门库:•下载网页:urllib,Requests•解析网页:BeautifulSoup•模拟交互,处理JS动态网页:Selenium•高级爬虫框架Scrapy•分布式爬虫设计–分布式队列–布隆过滤器(BloomFilter)•网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。什么是爬虫•批量型爬虫–批量型爬虫有明确的抓取范围和目标,当爬虫达到这个设定的目标后,即停止抓取过程。•增量型爬虫–增量型爬虫会持续不断的抓取,对于抓取的网页,要定期更新。通用的商业搜索引擎爬虫基本都属于此类。•垂直型爬虫–垂直型爬虫关注特定主题内容或者属于特定行业的网页,其他主题或者其他行业的内容不再考虑范围。爬虫的分类通用爬虫框架基本工作流程•网络爬虫的基本工作流程如下:1.首先选取一部分精心挑选的种子URL;2.将这些URL放入待抓取URL队列;3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。从爬虫的角度对互联网进行划分从爬虫的角度对互联网进行划分•对应的,可以将互联网的所有页面分为五个部分:1.已下载未过期网页2.已下载已过期网页:抓取到的网页实际上是互联网内容的一个镜像与备份,互联网是动态变化的,一部分互联网上的内容已经发生了变化,这时,这部分抓取到的网页就已经过期了。3.待下载网页:也就是待抓取URL队列中的那些页面4.可知网页:还没有抓取下来,也没有在待抓取URL队列中,但是可以通过对已抓取页面或者待抓取URL对应页面进行分析获取到的URL,认为是可知网页。5.还有一部分网页,爬虫是无法直接抓取下载的。称为不可知网页。抓取策略•在爬虫系统中,待抓取URL队列是很重要的一部分。待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪个页面。而决定这些URL排列顺序的方法,叫做抓取策略。下面重点介绍几种常见的抓取策略:–1.深度优先遍历策略–2.宽度优先遍历策略–3.反向链接数策略–4.PartialPageRank策略抓取策略•depth-first:遍历的路径:A-F-GE-H-IBCD•breadth-first:遍历的路径:A-B-C-D-E-FGHI网页更新策略•互联网是实时变化的,具有很强的动态性。网页更新策略主要是决定何时更新之前已经下载过的页面。常见的更新策略又以下三种:•1.历史参考策略–顾名思义,根据页面以往的历史更新数据,预测该页面未来何时会发生变化。一般来说,是通过泊松过程进行建模进行预测。网页更新策略•2.用户体验策略尽管搜索引擎针对于某个查询条件能够返回数量巨大的结果,但是用户往往只关注前几页结果。因此,抓取系统可以优先更新那些显示在查询结果前几页中的网页,而后再更新那些后面的网页。这种更新策略也是需要用到历史信息的。用户体验策略保留网页的多个历史版本,并且根据过去每次内容变化对搜索质量的影响,得出一个平均值,用这个值作为决定何时重新抓取的依据网页更新策略•3.聚类抽样策略前面提到的两种更新策略都有一个前提:需要网页的历史信息。这样就存在两个问题:第一,系统要是为每个系统保存多个版本的历史信息,无疑增加了很多的系统负担;第二,要是新的网页完全没有历史信息,就无法确定更新策略。这种策略认为,网页具有很多属性,类似属性的网页,可以认为其更新频率也是类似的。要计算某一个类别网页的更新频率,只需要对这一类网页抽样,以他们的更新周期作为整个类别的更新周期。分布式抓取系统结构•一般来说,抓取系统需要面对的是整个互联网上数以亿计的网页。单个抓取程序不可能完成这样的任务。往往需要多个抓取程序一起来处理。一般来说抓取系统往往是一个分布式的三层结构。如图所示:分布式抓取系统结构•最下一层是分布在不同地理位置的数据中心,在每个数据中心里有若干台抓取服务器,而每台抓取服务器上可能部署了若干套爬虫程序。这就构成了一个基本的分布式抓取系统。•对于一个数据中心内的不同抓去服务器,协同工作的方式有几种:–1.主从式(Master-Slave)–2.对等式(PeertoPeer)主从式抓取系统结构主从式抓取系统结构•对于主从式而言,有一台专门的Master服务器来维护待抓取URL队列,它负责每次将URL分发到不同的Slave服务器,而Slave服务器则负责实际的网页下载工作。Master服务器除了维护待抓取URL队列以及分发URL之外,还要负责调解各个Slave服务器的负载情况。以免某些Slave服务器过于清闲或者劳累。•这种模式下,Master往往容易成为系统瓶颈。对等式抓取系统结构对等式抓取系统结构•在这种模式下,所有的抓取服务器在分工上没有不同。每一台抓取服务器都可以从待抓取在URL队列中获取URL,然后对该URL的主域名的hash值H,然后计算Hmodm(其中m是服务器的数量,以上图为例,m为3),计算得到的数就是处理该URL的主机编号。•这种模式有一个问题,当有一台服务器死机或者添加新的服务器,那么所有URL的哈希求余的结果就都要变化。也就是说,这种方式的扩展性不佳。对等式抓取系统结构•在这种模式下,所有的抓取服务器在分工上没有不同。每一台抓取服务器都可以从待抓取在URL队列中获取URL,然后对该URL的主域名的hash值H,然后计算Hmodm(其中m是服务器的数量,以上图为例,m为3),计算得到的数就是处理该URL的主机编号。•这种模式有一个问题,当有一台服务器死机或者添加新的服务器,那么所有URL的哈希求余的结果就都要变化。也就是说,这种方式的扩展性不佳。布隆过滤器•在构建分布式爬虫时抓取海量网页时,通常需要维护一个很长的已抓取URL集合,避免重复抓取已经下载过的网页。然而即使使用哈希表来构建这个集合,依然面临着冲突和内存利用率不高的缺点。通常的判重做法是使用BloomFilter(布隆过滤器)来进行已抓取网页查找。布隆过滤器•布隆过滤器(BloomFilter)是由布隆(BurtonHowardBloom)在1970年提出的。它实际上是由一个很长的二进制向量和一系列无关的哈希函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。即BloomFilter报告某一元素存在于某集合中,但是实际上该元素并不在集合中,但是没有识别错误的情形,如果某个元素在该集合中,那么BloomFilter是不会报告该元素不在集合中的,所以不会漏报。布隆过滤器•相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数。另外,Hash函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。Python高级爬虫框架Scrapy•Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持