源:http://www.searchtb.com/2011/01/an-introduction-to-crawler.html
评:作者 淘宝 长孙秦
网络爬虫(web crawler)又称为网络蜘蛛(web spider)是一段计算机程序,它从互联网上按照一定的逻辑和算法抓取和下载互联网的网页,是搜索引擎的一个重要组成部分。一般的爬虫从一部分start url开始,按照一定的策略开始爬取,爬取到的新的url在放入到爬取队列之中,然后进行新一轮的爬取,直到抓取完毕为止。
我们看一下crawler一般会遇到什么样的问题吧:
抓取的网页量很大
网页更新量也很大,一般的网站,比如新闻,电子商务网站,页面基本是实时更新的
大部分的网页都是动态的,多媒体,或者封闭的(facebook)
海量网页的存在就意味着在一定时间之内,抓取只能的抓取其中的一部分,因此需要定义清楚抓取的优先级;网页更新的频繁,也就意味着需要抓取最新的网页和保证链接的有效性,因此一个更有可能带来新网页的列表页显得尤为重要;对于新闻网站,新的网站一般出现在首页,或者在指定的分类网页,但是对于淘宝来说,商品的更新就很难估计了;动态网页怎么办呢?现在的网页大都有JS和AJAX,抓取已经不是简单的执行wget下载,现代的网页结构需要我们的爬虫更加智能,需要更灵活的应对网页的各种情况。
因此,对一个通用的爬虫个,我们要定义
抓取策略,那些网页是我们需要去下载的,那些是无需下载的,那些网页是我们优先下载的,定义清楚之后,能节省很多无谓的爬取
更新策略,监控列表页来发现新的页面;定期check页面是否过期等等
抽取策略,我们应该如何的从网页中抽取我们想要的内容,不仅仅包含最终的目标内容,还有下一步要抓取的url
抓取频率,我们需要合理的去下载一个网站,却又不失效率
抓取策略
使用URL的正则特征是一个简单但却很高效的模式;对于定向抓取,一般的网站的URL有一定的特征,比如可能仅仅关心 .html, .htm, .asp, .aspx, .php, .jsp, .jspx类型的网页;或者是如果可以得到目标网站的正则,则可以大大的降低抓取的数量;又或者我们无需关心某一类网页,比如我们不抓取bbs.taobao.com下面的内容;仅仅需要抓取淘宝的商品页面(http://item.taobao.com/item.htm?id=\d+ )。通过URL的正则能极大的降低抓取数量;
也可以通过网页的文本特征来确定;不过要复杂得多了,一般需要一定数量已知页面的训练集合,然后提取页面的文本特征,然后通过向量空间模型或者其其他基于主题词提取的模型计算目标网页和训练集网页的距离,决定是否是目标网页。
更新策略
Freshness:表示抓取到的网页是否已经被修改
Age:表示抓取的网页过期的时间
对于更新来说,目标是让平均age时间越小,freshness越高;一般的更新策略有两种:定期批量更新和按更新周期更新;定期批量更新指对一批URL,按照失效时间定期去刷新,按周期更新指的是按照页面更新变化频率而修正是更新频率,一般来说,更新越频繁的网页更新也就越快。
抽取策略:
XPATH是一个简单直观,但是很有效的一个方案,XPATH能精准的定位网页的任意一个位置,意味着我们可以很精准的抽取页面上的任意位置,当面临很多网站的时候,当然配置XPATH就是一个很艰巨的任务,也许存在一个自适应的XPATH识别的方法。
JS和AJAX
在java下面,HtmlUnit是一个不错的解决方案,HtmlUnit是Junit 的扩展测试框架之一,该框架模拟浏览器的行为,开发者可以使用其提供的API对页面的元素进行操作,套用官方网站的话HtmlUnit“是Java程序的浏览器”。HtmlUnit支持HTTP,HTTPS,COOKIE,表单的POST和GET方法,能够对HTML文档进行包装,页面的各种元素都可以被当作对象进行调用,另外对JavaScript的支持也比较好。一般来说,HtmlUnit是在java环境下解决JS的很好的选择
WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS;目前比较主流的浏览器Google Chrome和Apple的safari,都是基于WebKit的内核写的。使用浏览器作为抓取能更好的模拟用户浏览的行为,能够天然的解决JS和AJAX等问题,问题可能就是性能是一个瓶颈,
抓取频率
同时开启N个线程抓取一个网站,相信很快就会被对方网站封掉;因此抓取的频率也很重要;抓取网站同时不对对方网站造成压力;在robot.txt协议里面定义Crawl-delay来确定抓取的频率也是一种网站的通用的做法,对于一般的抓取而言,10到20秒抓取一次是一个比较保险的频率,也有提出10*t的抓取间隔(t是download时间)比较合理
定向抓取的框架
通用抓取架构,如下图
多线程下载模块(Multi-threaded downloader)
该模块一般包含:
下载模块,下载网页,并应对一些web的一些错误,包括redirect等等
DNS解析模块,网页数量很多的时候,我们需要一个本地的DNS解析模块来维护domain到IP的映射
链接抽取模块,抽取下一步要抓取的链接(follow link)
调度模块(schedule)
调度模块是抓取系统的核心,调度模块从url队列里面选择一批url喂到下载模块下载;其中会涉及到
url调度,调度模块按照一定的策略,选取url进入抓取系统
url除重,一定时期之内已经抓取的网页,不再抓取
实例:使用开源的scrapy爬虫抓取B2C站点的商品
Scrapy(http://scrapy.org/)是基于Twisted的异步处理框架,纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便,现在我们以scrapy为例子,简单配置一个抓取商品的例子。
Scrapy的安装请参考 http://doc.scrapy.org/intro/install.html#intro-install
定义起始页面:http://www.xxxx.com
定义详情页,例如:http://product.xxxx.com/product.htm?id=\d+
执行scrapy startproject mycrawler,新建一个mycrawler的工程
在mycrawler/mycrawler/spiders目录下,写抓取的python代码:mycrawlerspider.py
from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.utils.url import urljoin_rfc
from scrapy.http import Request
class MySpider(BaseSpider):
name = 'test'
allowed_domains = ['xxxx.com']
start_urls = [
'http://www.xxxx.com',
]
download_delay = 10
def parse(self, response):
for link in SgmlLinkExtractor(allow=" product.htm\?id=\d+").extract_links(response):
yield Request(link.url,callback=self.parse_detail)
hxs = HtmlXPathSelector(response)
for url in hxs.select('//a/@href').extract():
url = self._urljoin(response,url)
#print url
yield Request(url, callback=self.parse)
def parse_detail(self, response):
hxs = HtmlXPathSelector(response)
what_u_want= hxs.select("/xpath/text()").extract()[0]
print 'url=',response.url, what_u_want.strip()
return
def _urljoin(self, response, url):
"""Helper to convert relative urls to absolute"""
return urljoin_rfc(response.url, url, response.encoding)
from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.utils.url import urljoin_rfc
from scrapy.http import Request
class MySpider(BaseSpider):
name = 'test'
allowed_domains = ['xxxx.com']
start_urls = [
'http://www.xxxx.com',
]
download_delay = 10
def parse(self, response):
for link in SgmlLinkExtractor(allow=" product.htm\?id=\d+").extract_links(response):
yield Request(link.url,callback=self.parse_detail)
hxs = HtmlXPathSelector(response)
for url in hxs.select('//a/@href').extract():
url = self._urljoin(response,url)
#print url
yield Request(url, callback=self.parse)
def parse_detail(self, response):
hxs = HtmlXPathSelector(response)
what_u_want= hxs.select("/xpath/text()").extract()[0]
print 'url=',response.url, what_u_want.strip()
return
def _urljoin(self, response, url):
"""Helper to convert relative urls to absolute"""
return urljoin_rfc(response.url, url, response.encoding)
最后,在工程目录里面执行 scrapy crawl mycrawler
简单几步,我们就可以抓取得到一个站点想要的页面了,并且可以抽取指定xpath的内容。
一个简单的定向爬虫就搭建起来了,关键是一个能够大规模的分布式的爬虫可能是一个挑战,后续再进一步介绍如何在分布式环境进行大规模的抓取,以及抓取遇到的一些更为棘手的问题,see u
分享到:
相关推荐
#####使用python开发定向抓取器mini_spider.py,实现对种子链接的广度优先抓取,并把URL长相符合特定pattern的网页保存到磁盘上。程序运行:python mini_spider.py -c spider.conf#####配置文件spider.conf:[spider]...
《Python开发的迷你定向抓取器——minispider.tar.gz深度解析》 在信息技术日新月异的今天,网络爬虫作为一种重要的数据获取工具,被广泛应用于数据分析、搜索引擎优化、市场研究等领域。其中,"minispider.tar.gz...
利用Python实现GUI编程,通过构造不用类,实现定向抓取商品来获取目标商品最新价格、优惠、销量信息。程序内附一定反爬技术。以上全部基于移动端抓取实现。利用--pyinstaller
利用Python实现GUI编程,通过构造不用类,实现定向抓取淘宝商品、每日优鲜商品、比价网商品、天猫超市商品来获取目标商品最新价格、优惠、销量信息。程序内附一定反爬技术。以上全部基于移动端抓取实现。 打包利用--...
学习python之后的一个总结,主要实现了定向抓取58同城和赶集网,对新纪录提醒的功能,同时使用了mvc搭了一个界面 1,目录说明 html_file:抓取的页面的临时缓存文件夹,解析完毕或是解析失败之后都会清空 subscribe:...
scrapy 爬虫示例代码-小白篇,是用来演示scrapy爬虫抓取页面用的,主要是让小白学习使用爬虫,定位于入门级编码者
关于一个分布式定向抓取集群的简单实现。目前实现功能多线程下载,线程数可配置。无需修改代码,按照规则添加配置就可以完成页面抽取、入库。利用Redis的list作为抓取队列,zset作为已抓取集合。支持分布式部署多个...
在摄影测量领域,相对定向和绝对定向是两个关键步骤,用于确定航空或卫星影像的几何关系,从而构建出准确的三维空间模型。本项目由C#编写,采用WinForm界面,提供了一套实用的工具来执行这两个过程,并包含了测试...
运用最新Jsoup技术开发,比httClient容易多了
good-coder-python在调研过程中,经常需要对一些网站进行定向抓取。由于python包含各种强大的库,使用python做定向抓取比较简单。请使用python开发一个迷你定向抓取器mini_spider.py,实现对种子链接的广度优先抓取...
Spider调用PageProcesser模块解析Page对象中的页面数据,并存入Page对象中的PageItems中(以Key-Value对的形式保存),同时存入解析结果中的待抓取链接,Spider会将待抓取链接存入Scheduler模块中的Request队列中...
摄影测量相对定向是遥感与测绘领域中的一个重要概念,它涉及到多张航空或航天影像的匹配、几何校正以及三维空间信息的恢复。在本专题中,我们将深入探讨摄影测量相对定向的理论基础,以及如何利用VC++编程语言来实现...
本主题将详细阐述四种常见的定向方法:后方交会、前方交会、相对定向和绝对定向,以及一步定向法。 首先,后方交会是一种基于已知地面控制点来确定影像在空间坐标系中位置的方法。通过计算影像上控制点的像点坐标与...
一、立体像对的相对定向 将各偏导数代入: 得: 等式两边同时乘以 并视 3、单独像对的相对定向 方程式线性化 X1 x1 Y1 Z1 S1 y1 Y2 Z2 S2 y2 X2 x2 B a1 a2 (xt2,yt2) (xt1,yt1) 一、立体像对的相对定向 3、单独像对...
[爬虫框架 (golang)] An awesome Go concurrent Crawler(spider) framework. The crawler is flexible and modular. It can be expanded to a Individualized crawler easily or can only use the default crawl ...
和Google等,作为一个辅助人们检索信息的工具也存在着一定的局限性,通用搜索引擎的目标是尽可能大的网络覆盖率,返回的结果包含大量用户不关心的网页,为了解决上述问题,定向抓取相关网页资源的爬虫应运而生。...
在摄影测量学中,相对定向和绝对定向是两个关键步骤,用于从航空或航天影像中恢复三维地理信息。本文将详细讲解这两个概念及其C#程序实现,并探讨它们在测绘工程中的应用。 相对定向主要是确定同一架相机拍摄的两幅...
通过配置这些信息,工具能够定向到特定的邮件服务器进行数据抓取。 “抓取邮箱列表的报文格式和组包内容”涉及了网络协议和数据包分析的概念。报文是网络通信中的基本单元,包含了传输的数据以及必要的控制信息。...
解析法绝对定向 模型的绝对定向:把模型点在像空间辅助坐标系的坐标转化为地面测量坐标。 描述立体像对在摄影瞬间的绝对位置和姿态的参数称绝对定向元素。 通过将相对定向模型进行缩放、平移和旋转,使其达到绝对...