首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

爬东东的总结

2012-09-01 
爬东东的小结最近我们(可以叫做公司)做一个社区型的区域性信息门户网站。?栏目比较多、杂,主要面向年轻人,所

爬东东的小结

最近我们(可以叫做公司)做一个社区型的区域性信息门户网站。

?

栏目比较多、杂,主要面向年轻人,所以**时尚,**教育培训,**趣闻等,内容性的东西一时还不够丰富,所以,就想办法去一些目标网站上爬东东,说白了,就字符串正则匹配、本地入库么。

?

下面小结下中间遇到的问题和解决方法:

?

工具:

H2 数据库(或Mysql **),自己熟悉,Java的,Java交互效率高;

Groovy,脚本么,好改撒;

HttpClient Commons工具包的,用作登陆用的;

PowerCMD,脚本组织么,这个Windows下的命令行工具很好用;

一个编辑器——***,***,Editplus——这个东东是我用Windows的80%的原因所在。

?

后俩纯属额外“广告”,小推荐一下么。

?

需求分析:

1. 文章型内容,做过**站的,多少都知道,数据库设计,就那几个表么,关键字段标题,时间之类的。所以查询出来显示一般一个列表,然后点击标题链接,到具体文章页面——So,查询出来的二维数据结果集,一般都遍历么,应该有个比较明显的begin和end。根据这个begin和end再加一个正则,就把那些关键字段信息,弄出来了。

?

2. 文章内容也如此。

?

过程步骤:

1. 目标URL列表,http://domain/urlpre/pagination_action/page_param么,俺还没做到deep > 1的多层爬取——不过这样,简单也好调试,不至于一次搞n个正则匹配的;

?

2. Download URL页面到本地(纯是为了后面的定时任务的时间核对准确,网速好的省了撒);

?

3. 遍历URL到源码,根据begin和end找到List<[title, link, date]>,对应那个抽象的**_thread表的内容,然后遍历,正则,入库;

?

4. 根据一个文章对应的URL的源码,写一个能获取文章内容的Runnable,然后开个定时任务,update文章内容就是了;

?

5. 如果目标网站的内容获取,需要登录,那就用httpclient登陆后,获取cookie,然后再读取URL的流;

?

?

问题:

1. 网页编码——Groovy URL有个eachLine(encoding, Closure)的方法,很方便啊!!

?

2. 中文字符的正则匹配——这个一开始以为遇到bug了呢,不知道那些编码怎么搞的,一段字符串

中文</a>?

有时候硬是搞成了中??/a>,

.+<\/a>

就是匹配不了,后来google了下,用[^x00-xff]+或其他的才弄好——对编码了解皮毛——汗啊!

?

3. 重用性的设计

入库的表格结构,可以搞以下几列:

来源 正则匹配组1?正则匹配组2?正则匹配组3?正则匹配组4 *** 内容

?

一些数据库操作的弄成一个DAO

?

一个通用的表示一个目标网站的数据组织结构:

比如:

Map website1 = [des, beginUrl, paginationUrlList,

htmlListItemBegin, htmlListItemEnd, htmlListItemPat,

contentUrlPatGroup,

htmlContentBegin, htmlContentEnd, htmlContentPat,

spiderThreadNum, spiderThreadDelayInSeconds, spiderThreadPeriodInSeconds]

这样,写一个MySpider,一个方法,把上面的那个参数传进来,下面的就看日志和数据库的东东就好了

?

如果对方的URL组织比较麻烦,比如Content URL也是分页的,那就需要多写点针对性的代码

?

Web元素的download:

这个就没啥说的,正则,匹配那些图片之类的,download下来,然后用本地的文件路径replace掉

?

增量采集:

也没啥说的,开个定时任务,从beginUrl找到contentUrl列表,如果数据库已经存在的,continue就是了

?

我在自己一台笔记本和网络环境下,2s的Thread间距,弄下来1w个,还是很快的,一共(数据库,两三个任务进程)才100M不到内存,一下午加上调试,就把人家的积累的东东搞过来的——话说再加一个“伪原创”工具,就很BT了。

?

话说好多Website也不做这些反爬的,即便做了,用httpclient工具想必也差不多(Groovy有个HttpBuilder,包装了下),JE的新闻,我试了,貌似不成呢,呵呵!

?

代码就不献丑了,一点小心得,分享下!关注此方面的朋友,以后多多交流下,版权或侵权问题,到没仔细考虑过,555,不会因为这个闹官司吧爬东东的总结

热点排行