基于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 ...
随机推荐
- 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- RequireJS+JQueryMobile
RequireJS提供了JS下模块化开发的充分条件.之前我自己也在多个项目中尝试模块化开发,但是由于没有类似RequireJS这样的框架,最后的效果都不是很理想. 在RequireJS中,所有的JS都 ...
- 使用hovertree菜单作为后台导航
hovertree是一个jquery菜单插件,官方网址:http://keleyi.com/jq/hovertree/ ,可以登录该网址体验效果. 0.1.3版本:http://keleyi.com/ ...
- 纯HTML+CSS带说明的黄色导航菜单
HoverTree带说明的CSS菜单:纯HTML+CSS结构链接带说明的黄色导航 在线体验效果:http://hovertree.com/texiao/css/1.htm 代码如下,保存到HTML文件 ...
- git 提交解决冲突
一:git命令在提交代码前,没有pull拉最新的代码,因此再次提交出现了冲突. error: You have not concluded your merge (MERGE_HEAD exists) ...
- [转]利用JitPack发布自己项目让别人可以在dependencies中compile的简单方法
JitPack的地址为:https://jitpack.io/ 发布 登陆 jitpack 在编辑框中输入github的网址,完成后点击LookUp 使用 点击 Get it. 之后网页就会自动导航到 ...
- AEAI Portal V3.5.4升级说明,门户集成平台
1 总体说明 本次升级是AEAI Portal的一次重要升级,主要扩展了开发社区(论坛).移动门户功能,同时修正一些功能BUG等,具体内容如下: 2 升级内容 功能扩展: 扩展开发社区导航 扩展移动门 ...
- Windows on Device 项目实践 1 - PWM调光灯制作
在前一篇文章<Wintel物联网平台-Windows IoT新手入门指南>中,我们讲解了Windows on Device硬件准备和软件开发环境的搭建,以及Hello Blinky项目的演 ...
- SQL Server解决孤立用户浅析
孤立用户概念 所谓孤立用户即指在服务器实例上未定义或错误定义了其相应 SQL Server 登录名的数据库用户无法登录到实例. 这样的用户被称为此服务器实例上的数据库的"孤立用 ...
- CSS white-space 属性
实例 规定段落中的文本不进行换行: p { white-space: nowrap } nowrap:文本不会换行,文本会在在同一行上继续,直到遇到 <br> 标签为止.