大概在1个月前,利用webmagic做了一个爬虫项目,下面是该项目的一些个人心得,贴在这里备份:

一、为什么选择webmagic?

说实话,开源的爬虫框架已经很多了,有各种语言(比如:python、java)实现的,有单机的,还有大型分布式的,多达上百种,详情可见:

http://www.oschina.net/project/tag/64/spider?lang=0&os=0&sort=view&

github上随手搜索一下spider之类的关键字,也不计其数,如何选择呢?

我的标准其实很简单:

a) 要有一定量的使用群体(即:用的人越多越好),有人实际在用的项目,才会有生命力

b) 文档要全(没有文档或文档不全的项目,学起来太费劲)

c) 使用起来要简单,越傻瓜越好(否则,如果要先安装这,安装那,弄一堆依赖的东西,太花时间了)

d) 爬虫的主要功能要有,比如:支持多线程,url自动去重复,html解析方便(至少要能支持css选择器,xpath选择器,正则表达式等常见的解析方式

e) 架构不要太庞大,越轻巧越好,简单的设计,意味着扩展起来比较容易,有些功能如果要自行扩展,直接继承一个类就完事了

把这些因素考虑进去后,综合下来,选择了webmagic,作者很用心,有一个很完整的教科书式的在线文档:http://webmagic.io/docs/zh/基本上花半天时间看完,就明白爬虫是怎么回事了。

二、如何设计自己的项目架构

选定好一款爬虫开源框架后,就要考虑自己的业务特点,设计自己的项目架构了,大多数用爬虫的人,基本需求其实是类似的:

a) 将目标网站的页面尽可能快速的扒下来

b) 然后解析出有用的内容

c) 落地存储到db中

但凡稍微成熟一些的爬虫的开源框架,步骤a)所需的技术细节,基本上都已经实现了(比如:如何发起http请求,如何进行多线程控制等等),直接拿来用即可,但是解析哪些内容,用什么规则解析,这是每个项目的业务来决定的,需要自己处理,解析完了以后,如何落地,以及目标网站的内容变了,如何设计自己的更新爬取策略,这也是要认真考虑的。

我的个人经验:

项目分成3个模块:

---- 1)spider(爬取模块) ,

---- 2)parser(解析及db入库模块) ,

---- 3)schdule(更新爬取计划任务模块)

模块1)与3)可以打包在同一个jar中集中部署,模块2)单独部署,之所以这样设计,出于以下考虑:

通常最终保存内容的db小型项目中只会有一个,尽管爬虫支持多线程并发爬取,可以分布式的高效狂爬,但是db是一个慢速的IO瓶颈,如果把 "爬取->解析->入库"全放在一个模块中按顺序同步处理,最后的结果相当于前面有几个水管收集水源,但是最后进入水库的总管道不给力,整体的蓄水效率还是很慢。

分开之后,爬取模块可以同时部署多个,然后将得到的html集中存储在1个目录下,再按子目录存储(比如:一个大型网站,会有很多分站,可以实例A爬上海站,实例B爬北京站...),这样可以尽可能快的把内容先捞回来。然后由解析模块,再到这个目录下将文件取出来慢慢解析入库,解析成功后将原始文件删除(或移到其它目录备份,这个看情况而定),如果代码有问题,比如解析规则有bug,导致某些页面解析失败,因为原始html文件已经在本机存储,修正解析的bug后,可以再试重新解析失败的文件,而不需要重新爬取。

至于爬取模块完成后,如何通知解析模块去开始解析入库,有很多办法,比如消息队列,zookeeper订阅节点状态变化,或者在某个目录下放置一个标记文件 之类的都可以。

三、如何更有效的更新爬取

通常爬取时,会先从一个所谓的"种子URL"层层引导,直到发现最终的目标url,首次爬取时,可以将最终页面的url及http的返回码(404,500,200之类)记录下来,下次更新爬取时,直接重新爬取这些http状态为200的最终页面即可,这样省去了再次从seed页面层层分析的过程。(当然,这个要看自身项目的特点,如果seed页的内容本身会周期性的变化,那就省不了从seed页重新爬取的过程)

四、其它一些可能会遇到的问题

a) xpath的问题

webmagic提供的xpath解析工具,不支持xpath2.0的一些高级特性,比如:查找父节点之类,解析时可以考虑引入其它一些第三方开源库,比如dom4j来处理,反正html内容已经保存到硬盘上了,想咋解析都行(但是dom4j也有一个缺点,返回的html必须是严格符合xml规范的,有些网页的html源代码,标签没有正常结束,会导致dom4j出错)

b) ajax的问题

有些数据是通过ajax动态请求得到的,在目标网站上并未以a链接的方式明显给出,这种情况可以根据用一些浏览器的开发者工具,观察最终发出去的ajax请求,如果ajax请求的url是有规律的,可以直接在webmagic中用类似 page.addTargetRequests("xxx")的方式手动添加。

c) post的问题

webmagic目前的版本,不支持post方式的url爬取,据说以后的版本会考虑,这个暂时可以手动写httpclient来发起post请求,最终拿到数据

d)如何对应有防爬机制的网站

这个没有一劳永逸的办法,具体情况具体分析,

-- 有些网站会限制url访问的频率(比如:同1个ip1分钟内只能访问某个页面N次),这种需要手动在代码里控制下节奏,比如每次http请求后,加入sleep(5000)之类的,

-- 有些网站会根据http请求header中的User-Agent来判断是否是同一款浏览器在恶意刷,这种可以在代码中手动弄一个User-Agent列表,把市面上的所有User-Agent全加进去,每次请求前,随机从列表中取一个User-Agent,这样看起来,貌似有很多不同的浏览器在访问,显得真实一点。但是有一点要注意,目前很多大型网站都提供了pc版与移动版的页面,如果在pc浏览器上访问,对方会返回pc版的网页,如果用手机访问,会返回移动版的页面,很多就是根据User-Agent来判断的(因为PC浏览器与手机浏览器对应的User-Agent信息不同),如果你希望每次爬虫访问的都是PC版的页面,用代码设置User-Agent时,要小心别弄错了。

-- 有些网站会限制IP,甚至有IP黑名单机制,对于这种出狠招的网站,我们也只能放大招:花点钱,找一群代理服务器,在爬虫代码里,随机切换代理服务器。

最后,希望大家爬取顺利。

基于webmagic的爬虫项目经验小结的更多相关文章

  1. 基于python的爬虫项目

    一.项目简介 1.1 项目博客地址 https://www.cnblogs.com/xsfa/p/12083913.html 1.2 项目完成的功能与特色 爬虫和拥有三个可视化数据分析 1.3 项目采 ...

  2. 基于webmagic的爬虫小应用--爬取知乎用户信息

    听到“爬虫”,是不是第一时间想到Python/php ? 多少想玩爬虫的Java学习者就因为语言不通而止步.Java是真的不能做爬虫吗? 当然不是. 只不过python的3行代码能解决的问题,而Jav ...

  3. 基于webmagic的爬虫小应用

    以前没有写过爬虫程序,最近两天就研究了一下java的爬虫框架webmagic.然后写了一个demo 写爬虫的基本思想: 1.抓取目标连接 2.根据页面中标签,抓捕你需要的内容 3.保存结果集 以下是实 ...

  4. Java 基于WebMagic 开发的网络爬虫

    第一次接触爬虫,之所以选择WebMagic,是因为文档齐全.用法简单.而且框架一直在维护. WebMagic是一个简单灵活的Java爬虫框架.基于WebMagic,我们可以快速开发出一个高效.易维护的 ...

  5. 安利一个基于Spring Cloud 的面试刷题系统。面试、毕设、项目经验一网打尽

    推荐: 接近100K star 的Java学习/面试指南 Github 95k+点赞的Java面试/学习手册.pdf 今天给小伙伴们推荐一个朋友开源的面试刷题系统. 这篇文章我会从系统架构设计层面详解 ...

  6. 最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备

    在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面 ...

  7. WebMagic之爬虫监控

    访问我的博客 前言 年前闲着无聊,研究了一阵子爬虫技术,接触到爬虫框架 WebMagic,感觉很好用. 在之后的工作中,接手了新站与第三方接口对接的工作,主要的工作是去抓取对方接口的内容:初始的时候, ...

  8. Atitit.attilax的 case list 项目经验 案例列表

    Atitit.attilax的 case list 项目经验 案例列表 1. Atian inputmethod 输入法3 2. Ati desktop engine桌面引擎3 3. Acc资金账户系 ...

  9. 基于webmagic的种子网站爬取

    代码地址如下:http://www.demodashi.com/demo/12175.html 1. 概述 因为无聊,闲来没事做,故突发奇想,爬个种子,顺便学习爬虫.本文将介绍使用Spring/Myb ...

随机推荐

  1. java web学习总结(十七) -------------------过滤器

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  2. CSS3 莲花盛开动画

    点击这里查看效果:http://keleyi.com/a/bjad/32gxxsaw.htm 或者:http://keleyi.com/keleyi/phtml/css3/10a.htm 效果图: 代 ...

  3. Android Gradle Build Error:Some file crunching failed, see logs for details解决办法

    转载请标明出处: http://www.cnblogs.com/why168888/p/5925756.html 本文出自:[Edwin博客园] 错误日志:Error:java.lang.Runtim ...

  4. VIEW SERVER STATE permission was denied on object 'server', database 'master'

    今天一同事反馈使用SQL Server 2012 Management Studio连接SQL Server 2014后,选择数据库中某个表,然后单击右键时,就会遇到下面错误: 这个错误初看以为是权限 ...

  5. java实现支付宝接口--文档..转载

    //实现java支付宝很简单,只要从支付宝官方下载   http://help.alipay.com/support/index_sh.htm下载程序,配置一下参数就OK了:   1.先到http:/ ...

  6. .NET应用架构设计—表模块模式与事务脚本模式的代码编写

    阅读目录: 1.背景介绍 2.简单介绍表模块模式.事务脚本模式 3.正确的编写表模块模式.事务脚本模式的代码 4.总结 1.背景介绍 要想正确的设计系统架构就必须能正确的搞懂每个架构模式的用意,而不是 ...

  7. .NET重构(类型码的设计、重构方法)

    阅读目录: 1.开篇介绍 2.不影响对象中的逻辑行为(枚举.常量.Entity子类来替代类型码) 3.影响对象中的逻辑行为(抽象出类型码,使用多态解决) 4.无法直接抽象出类型码(使用策略模式解决) ...

  8. php之验证码小程序

    验证码功能(个人理解): 减轻服务器的压力(如12306的验证码功能): 防止暴力注册 个人思路:在a-z,A-Z,1-9生成n位随机的数来构成新的验证码. 关于生成验证码的几个小函数 range() ...

  9. 【hive】——Hive四种数据导入方式

    Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...

  10. W3School-CSS 伪元素 (Pseudo-elements) 实例

    CSS 伪元素 (Pseudo-elements)实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin ...