目的:收集北京餐馆的信息,建立一个中文数据库用作以后的分析。
资源:众多专业网站,http://www.dianping.com/(大众点评网,Unicode(UTF8) 编码)
http://www.bjdianping.com/(北京点评网,Chinese Simplified(GB2312)编码)
http://lianmeng.fantong.com/(饭桶网,Unicode(UTF8) 编码)
方法:第一步:趴网页;
第二步:网页结构分析;
第三步:导入数据库。
这里介绍一下怎么扒网页的,后续步骤以后一一奉上。
static void Main(string[] args) { FileOperation fo = new FileOperation(); String baseURL = "http://www.。。。.com/shop/"; WebClient wc = new WebClient(); string dstName = null; // 1001600 -- 3001600 left // 3001600 -- 3099433 finished for (int i = 3099433; i < 5000000; i++) { string URL = baseURL + i.ToString(); dstName = @"D:\Data\dianping\" + i.ToString() + ".htm"; Console.WriteLine(i.ToString()); System.Threading.Thread.Sleep(250); try { //Stream st = wc.OpenRead(URL); wc.DownloadFile(URL, dstName); } catch(Exception e) { Console.WriteLine(e.Message); continue; } } Console.ReadLine(); }
不难,但有2个需要注意的地方:
1.一定记得设置等待时间,大部分网站服务器都有阻断过高频繁访问网站的功能,我的ip一段就被封了1个小时,这还算幸运的,要是因此公司对外访问被封,那就是千古罪人了,所以扒网页这种事不是你一个人的事,一定注意安全。解决办法:一是写多线程任务,让不同的机器去扒,这样依然可以很快(但其实还是担心它自己会不会被荡掉);二,加点等待时间,由于本人没有多台电脑也不好发动群众,就只有加等待时间了,
System.Threading.
Thread.Sleep(500); 0.5秒。
2. 之前不是直接用的DownloadFile(adress,filename)的方法,而是用的stream读网页再存本地的方法。这就涉及到用什么编码方式读取和保存的事了,UTF8一般是默认设置,不会有太大问题,像“北京点评网”的网页编码就很诡异,GB2312,C#中就没有 ,自己也不想再外部添加了。所以果断放弃了扒他的网页。
3. 有的网页加载方式不一样,如“饭桶网”餐馆介绍的网页,是先加载的框架结构,在加载的里面的店面信息(这点你可以通过F5刷新时明显看到),所以哪怕我另存为网页后也没有我需要的店面信息。所以果断放过这个网站。
后来找了很久,找到一个不错的网站,各方面都挺好的,做得很不错。
这里本人珍重申明,下载下来的网页,只用于研究所用,不做商业用途,实验结束后会全部删去,谢谢。如该网站有疑问,请联系我本人v-xyang@microsoft.com。