网络爬虫(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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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 = [
]
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实现GUI编程,通过构造不用类,实现定向抓取淘宝商品、每日优鲜商品、比价网商品、天猫超市商品来获取目标商品最新价格、优惠、销量信息。程序内附一定反爬技术。以上全部基于移动端抓取实现。 打包利用--...
《Python开发的迷你定向抓取器——minispider.tar.gz深度解析》 在信息技术日新月异的今天,网络爬虫作为一种重要的数据获取工具,被广泛应用于数据分析、搜索引擎优化、市场研究等领域。其中,"minispider.tar.gz...
利用Python实现GUI编程,通过构造不用类,实现定向抓取商品来获取目标商品最新价格、优惠、销量信息。程序内附一定反爬技术。以上全部基于移动端抓取实现。利用--pyinstaller
这种控制技术的核心在于将电机的物理模型转换到一个特定的坐标系下,使得转子磁场的定向变得直观且易于控制。在这样的坐标系中,电机的动态性能可以得到显著改善,从而实现高精度、高效能的电机运行。 SVPWM(Space...
转子磁链定向是电机控制领域中的关键技术之一,特别是在交流电机的矢量控制中占有重要地位。本主题将深入探讨转子磁链定向的概念、重要性以及与SVPWM(空间电压矢量调制)的关系,并结合MATLAB源码进行实践解析。 ...
现代导航技术中的自动定向机(ADF)是一种用于飞行导航的关键无线电设备,其工作原理基于无线电技术的测向功能。ADF通过接收地面无线电台的信号,可以测量无线电波的来波方向,并计算得到飞机相对于地面无线电台的...
【基于动态模型按转子磁链定向的矢量控制系统】是一种高级的电机控制技术,主要应用于交流电机,尤其是感应电机的调速与控制。该系统借鉴了直流电机的控制思想,通过对电机内部电磁场的精确建模和控制,实现类似于...
在摄影测量领域,相对定向和绝对定向是两个关键步骤,用于确定航空或卫星影像的几何关系,从而构建出准确的三维空间模型。本项目由C#编写,采用WinForm界面,提供了一套实用的工具来执行这两个过程,并包含了测试...
掘进机自动定向技术是实现掘进机自动化技术的重要组成部分,在分析现有自动定向技术特点的基础上,针对各自动定向技术存在的局限性,指出了掘进机自动定向技术的发展趋势,为进一步研究自动定向技术提供一定的理论基础...
《专业技术人员职业定向的策略》是一项重要的议题,尤其对于刚刚踏入职场或正在职业生涯中期的专业人员而言,明确自己的职业定位和规划至关重要。以下是一些关键的知识点: 首先,职业定向涉及的首要因素是个人兴趣...
综上所述,MATLAB/Simulink在电机控制系统的建模与仿真中发挥着至关重要的作用,而异步电机的转子磁场定向矢量控制技术则为电机的高性能调速提供了有力的技术支持。通过对矢量控制系统的仿真分析,可以对电机的控制...
学习python之后的一个总结,主要实现了定向抓取58同城和赶集网,对新纪录提醒的功能,同时使用了mvc搭了一个界面 1,目录说明 html_file:抓取的页面的临时缓存文件夹,解析完毕或是解析失败之后都会清空 subscribe:...
自动抓取jstack
2. **复合垂直搜索引擎模块**:结合传统的垂直搜索和实时补充抓取程序,YOYI构建了复合搜索引擎,用于提取页面重点关键词,为BT定向的用户行为分析服务提供支持。 3. **YOYI数据中心分布式存储 - DFS**:采用Hadoop...
本文主要介绍了带时间窗的定向问题(TOPTW)的特点和目标,并重点提出了一种简单快捷并且行之有效的迭代式局部搜索算法。本算法包括寻找到局部最优的插入算子(insertion step)和逃离局部最优扰动算子(shake step...
摄影测量相对定向是遥感与测绘领域中的一个重要概念,它涉及到多张航空或航天影像的匹配、几何校正以及三维空间信息的恢复。在本专题中,我们将深入探讨摄影测量相对定向的理论基础,以及如何利用VC++编程语言来实现...