爬东东的小结
最近我们(可以叫做公司)做一个社区型的区域性信息门户网站。
?
栏目比较多、杂,主要面向年轻人,所以**时尚,**教育培训,**趣闻等,内容性的东西一时还不够丰富,所以,就想办法去一些目标网站上爬东东,说白了,就字符串正则匹配、本地入库么。
?
下面小结下中间遇到的问题和解决方法:
?
工具:
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,不会因为这个闹官司吧