最近应朋友的邀请,帮忙做了个简单的爬虫程序,要求不高,主要是方便对不同网站的爬取进行扩展,获取到想要的数据信息即可。当然,基于数据的后期分析功能是后话,以后的随笔我会逐步的介绍。
开源的爬虫框架比较多,之前我研究过java的nutch,同时它还兼备基于Lucene全文检索的功能,还有Python爬虫等等。为什么我会选择用DotnetSpider呢,我之前有使用.net开发过一套分布式框架,框架的实现机制和DotnetSpider有相似之处,所以上手之后,甚是喜欢。
先看下解决方案的整体分层情况:
InternetSpider:控制台程序,后续可以服务的方式部署在windows环境中
ISee.Shaun.Spiders.Business:爬虫程序的中心调度层,负责爬虫的配置,启动,执行等
ISee.Shaun.Spiders.Common:通用类,包括反射代码、大众点评的数据字典、回调委托的定义等
ISee.Shaun.Spiders.Pipeline:BasePipeline的实现层,主要实现了数据保存
ISee.Shaun.Spiders.Processor:BasePageProcessor的实现层,主要实现了通过xpath的数据提取
ISee.Shaun.Spiders.SpiderModel:数据模型层,负责实体定义和EF数据操作
以爬取大众点评湘菜数据为例,程序的执行过程如下:
InternetSpider读取配置文件,获取需要爬取的URL地址,大众点评数据分页仅支持50页,所以,需要获取更多数据我们需要将检索条件进行细化,观察后发现通过重点地区进行爬取,效果尚可,地址为湖南菜/{0}p{1}。
图一:湘菜检索地址
图二:分类检索地址,共11页
那么行政区地址从哪里来的呢?我们直接使用谷歌浏览器,代码全在里面了
字典直接附上:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ISee.Shaun.Spiders.Common { public static class DazhongdianpingArea { private static Dictionary<string, string> areaDic = null; public static Dictionary<string, string> GetAreaDic() { if (areaDic == null) { areaDic = new Dictionary<string, string>(); areaDic.Add("r16", "西城区"); areaDic.Add("r15", "东城区"); areaDic.Add("r17", "海淀区"); areaDic.Add("r328", "石景山区"); areaDic.Add("r14", "朝阳区"); areaDic.Add("r20", "丰台区"); areaDic.Add("r9158", "顺义区"); areaDic.Add("r5950", "昌平区"); areaDic.Add("r5952", "大兴区"); areaDic.Add("r9157", "房山区"); areaDic.Add("r5951", "通州区"); areaDic.Add("c4453", "怀柔区"); areaDic.Add("c435", "延庆区"); areaDic.Add("c434", "密云区"); areaDic.Add("c4454", "门头沟区"); areaDic.Add("c4455", "平谷区"); } return areaDic; } } }