网络爬虫(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)
简单几步,我们就可以抓取得到一个站点想要的页面了,并且可以抽取指定xpath的内容。
一个简单的定向爬虫就搭建起来了,关键是一个能够大规模的分布式的爬虫可能是一个挑战,后续再进一步介绍如何在分布式环境进行大规模的抓取,以及抓取遇到的一些更为棘手的问题,see u
原文地址:http://www.searchtb.com/2011/01/an-introduction-to-crawler.html
如有版权问题请与原文作者联系
分享到:
相关推荐
网络爬虫是一种自动化程序,用于从互联网上抓取大量数据,包括网页内容、图片、视频等。本项目提供了一个基础的Java实现,帮助你理解网络爬虫的工作原理,并且可以根据自己的需求进行配置来抓取特定的网页和云盘中的...
【C#网络爬虫:抓取网络资源】 网络爬虫是一种自动遍历互联网并抓取网页内容的程序,常用于数据分析、搜索引擎索引、市场研究等领域。C#作为一款强大的编程语言,同样可以构建高效的网络爬虫。在这个项目中,我们将...
python 编写的DHT Crawler 网络爬虫,抓取DHT网络的磁力链接。 文件 collector.py dht网络爬虫脚本 抓取dht网络的磁力链接,使用 libtorrent 的python绑定库开发 collectord.py dht爬虫服务监控程序 启动并监控...
文件----### collector.py dht网络爬虫脚本 抓取dht网络的磁力链接,使用 libtorrent 的python绑定库开发### collectord.py dht爬虫服务监控程序 启动并监控dht爬虫进程,在爬虫进程退出后重启启动爬虫,使用 ...
一个简单的网络爬虫,抓取当前页面的内容,以文本形式存放到本地。 没有什么难度,适合初学网络java的童鞋。
利用python抓取网络图片的步骤: 1.根据给定的网址获取网页源代码 2.利用正则表达式把源代码中的图片地址过滤出来 3.根据过滤出来的图片地址下载网络图片
人工智能-项目实践-网络爬虫-抓取学校正方教务处系统的课程表数据,成绩数据以及个人信息,修改个人密码等功能,使用java实现爬虫 抓取学校正方教务处系统的课程表数据,成绩数据以及个人信息,修改个人密码等功能...
Java网络爬虫是一种自动化程序,用于从互联网上抓取大量数据。它的工作原理是模拟浏览器发送HTTP请求到服务器,接收响应,并解析返回的HTML或XML文档以提取所需信息。在这个过程中,HttpClient是一个常用的Java库,...
网页爬虫,也被称为网络蜘蛛或网络机器人,是一种自动遍历和抓取网页的程序。它们遵循超链接结构,从一个网页跳转到另一个网页,收集网页上的信息。爬虫的主要任务包括获取HTML源代码、解析页面内容、提取有用信息,...
网络爬虫是互联网数据挖掘的一种重要工具,它能够自动化地从网页中提取大量信息,尤其在视频信息抓取方面有着广泛的应用。在这个项目中,我们将使用Structs、Hibernate和Spring这三个核心框架构建一个完整的Web应用...
磁力链 【磁力链】python编写的DHTCrawler网络爬虫,抓取磁力链接.zip
蜘蛛日志在线分析工具是一款开源的工具,可用于快速分析网站访问日志中搜索引擎网络爬虫的抓取记录。如果你的服务器运行在linux宝塔面板环境下,你只需要登录宝塔面板的linux控制面板,在左侧导航栏中点击”文件”,...
网络爬虫,又称网页抓取或网络蜘蛛,是一种自动遍历互联网并抓取网页信息的程序。它通过遵循网页间的超链接关系,系统性地获取大量网页内容,为搜索引擎提供索引,或者为数据分析师提供原始数据。 Python是网络爬虫...
本文档是关于Python网络爬虫的复习大纲,涵盖了爬虫的基本概念、实现原理、技术、网页请求原理、抓取网页数据、数据解析、并发下载、抓取动态内容、图像识别与文字处理、存储爬虫数据、爬虫框架Scrapy等知识点。...
Python网络编程基础+python网络爬虫(抓取网页的含义和URL基本构成) 中文 PDF版 更多内容见: Python学习资料篇 - 趣思行的博客 - CSDN博客 http://blog.csdn.net/bjarnecpp/article/details/78702210
手写网络爬虫 能抓取网页 广度优先 可设置深度 vs2008测试 能进行网页提取 内容提取 标题提取 meta提取 server数据入库 欢迎参考 有好的建议请发送邮件blackjunes@sina.com
python爬虫,如何抓取网页数据; python爬虫,如何抓取网页数据; python爬虫,如何抓取网页数据; python爬虫,如何抓取网页数据; python爬虫,如何抓取网页数据; python爬虫,如何抓取网页数据; python爬虫,...
磁力链接 基于python 编写的DHT Crawler 网络爬虫,抓取磁力链接 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。
在IT行业中,网络爬虫是一种自动化程序,用于从互联网上抓取大量数据,其中包括图片。在本场景下,我们关注的是“抓取图片”的技术,它对于数据分析、图像处理、内容聚合等领域都至关重要。网络爬虫可以理解为一种在...