基于webmagic的爬虫项目经验小结
大概在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的爬虫项目经验小结的更多相关文章
- 基于python的爬虫项目
一.项目简介 1.1 项目博客地址 https://www.cnblogs.com/xsfa/p/12083913.html 1.2 项目完成的功能与特色 爬虫和拥有三个可视化数据分析 1.3 项目采 ...
- 基于webmagic的爬虫小应用--爬取知乎用户信息
听到“爬虫”,是不是第一时间想到Python/php ? 多少想玩爬虫的Java学习者就因为语言不通而止步.Java是真的不能做爬虫吗? 当然不是. 只不过python的3行代码能解决的问题,而Jav ...
- 基于webmagic的爬虫小应用
以前没有写过爬虫程序,最近两天就研究了一下java的爬虫框架webmagic.然后写了一个demo 写爬虫的基本思想: 1.抓取目标连接 2.根据页面中标签,抓捕你需要的内容 3.保存结果集 以下是实 ...
- Java 基于WebMagic 开发的网络爬虫
第一次接触爬虫,之所以选择WebMagic,是因为文档齐全.用法简单.而且框架一直在维护. WebMagic是一个简单灵活的Java爬虫框架.基于WebMagic,我们可以快速开发出一个高效.易维护的 ...
- 安利一个基于Spring Cloud 的面试刷题系统。面试、毕设、项目经验一网打尽
推荐: 接近100K star 的Java学习/面试指南 Github 95k+点赞的Java面试/学习手册.pdf 今天给小伙伴们推荐一个朋友开源的面试刷题系统. 这篇文章我会从系统架构设计层面详解 ...
- 最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备
在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面 ...
- WebMagic之爬虫监控
访问我的博客 前言 年前闲着无聊,研究了一阵子爬虫技术,接触到爬虫框架 WebMagic,感觉很好用. 在之后的工作中,接手了新站与第三方接口对接的工作,主要的工作是去抓取对方接口的内容:初始的时候, ...
- Atitit.attilax的 case list 项目经验 案例列表
Atitit.attilax的 case list 项目经验 案例列表 1. Atian inputmethod 输入法3 2. Ati desktop engine桌面引擎3 3. Acc资金账户系 ...
- 基于webmagic的种子网站爬取
代码地址如下:http://www.demodashi.com/demo/12175.html 1. 概述 因为无聊,闲来没事做,故突发奇想,爬个种子,顺便学习爬虫.本文将介绍使用Spring/Myb ...
随机推荐
- [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍
[连载]<C#通讯(串口和网络)框架的设计与实现>- 0.前言 目 录 第一章 通讯框架介绍... 2 1.1 通讯的本质... 2 1 ...
- Hibernate @OneToMany等注解设置查询过滤条件等
1.如实体PdOrg对象中有users对象,数据库user表有字段DEL_FLAG(0:删除:1:未删除): private List<User> users= new ArrayList ...
- Asp.net mvc5开源项目"超级冷笑话"
业务时间做了个小网站,超级冷笑话,地址:http://www.superjokes.cn/ 开发技术: asp.net mvc5 +SQLServer2012 ORM:NPoco 用了简单的三层结构 ...
- RequireJS+JQueryMobile
RequireJS提供了JS下模块化开发的充分条件.之前我自己也在多个项目中尝试模块化开发,但是由于没有类似RequireJS这样的框架,最后的效果都不是很理想. 在RequireJS中,所有的JS都 ...
- Dog_Hybird的诞生
起因 开玩笑说“iOS搞不动了”,另外一方面iOS组的哥哥们给力,少一个我也妥妥的.又听闻web前端组来了一个不得了的人物,“老司机,带带我”这种机会不能错过,1个多月前就申请转web前端了.开始是苦 ...
- CSS中Position 的用法详解。
记得一年前,到一家公司面试的时候,问我position有哪几个属性,我憋半天才回答出2个,大家估计都清楚,就是我们经常用到的2个(relative,absolute). 最近又用到了好多,深入研究了下 ...
- ks
http://www.codeproject.com/Articles/207820/The-Repository-Pattern-with-EF-code-first-Dependen
- UTF-8和GBK等中文字符编码格式介绍及相互转换
我们有很多时候需要使用中文编码格式,比如gbk.gb2312等,但是因为主要针对中文编码设置,因此并不完全通用,这样一来就有了在各编码间相互转换的需求,比如和UTF8的转换.可是在我使用的过程中,却发 ...
- spring mvc生成注册验证码
通过Spring MVC为系统添加验证码 1:布局登陆页面,用户名,密码,填写验证码的文本框,及验证码的图片及点击换图 <%@ taglib prefix="c" uri=& ...
- mysql安装及配置服务
第一次安装mysql 1.本地环境:windows 7 -64,mysql版本5.5.28(mysql-5.5.28-winx64.msi) 2.双击mysql-5.5.28-winx64.msi,进 ...