我的小蛛蛛还在慢慢的爬行着 今天遇到的问题是什么呢?
今天的问题是 想把这个站点的全部链接读出的string 写到文件中去 用什么方式呢? 当然是递归! 这个貌似别无选择。
对代码的解释:
第一 我们知道网站中的一些东西是不用动的 也就像文章的详情页面 一旦写好了 如果没有什么大的改动一般来说是不用懂来动去的
所以我们有了一个参数 List<string> NotBuidingFilekey 这个参数就是为了解决这个问题的。
判断这个文件是不是存在的。如果不存在写下来 如果文件是存在的 return
第二点:我写蛛蛛是写成一个服务的 用的是windows server 写的 所以在这里fileName 是不可以用上文中的server对象中的方法的 怎么办呢? 只可以用相同的规则来代替server对象中的方法。代码就是下文中的第二个方法。
唉 又过了12点了 明天在继续我的code!
/// <summary> /// 循环写入文件 /// 代云超 /// </summary> /// <param name="lists">这是第一层的list</param> /// <param name="NotBuidIngFilekey">如果有这个关键字的话就不用生成文件</param> /// <param name="urlkey">url关键词</param> public static void SetFiles(List<string> lists,string urlkey,string filepath,int OutTime,List<string> NotBuidIngFilekey) { //查看这个文件是不是存在的 for (int i = 0; i < lists.Count; i++) { string fileName = GetTureFileName(filepath, lists[i]); bool IsHasValueKey = false; for (int j = 0; j < NotBuidIngFilekey.Count; j++) { lists[i].Contains(NotBuidIngFilekey[j]);//如果有这些关键字的话 IsHasValueKey = true; break; } if (IsHasValueKey)//如果有这个关键字 { if (RwFile.IsHasFile(fileName))//如果文件真的是存在的 { return;//说明这个文件就不用在一次的生成了 } } if (RwFile.IsHasFile(fileName, OutTime)) { //文件是存在的 return; } else//如果文件是不存在的 没有这个文件 { //读取这个文件 string source = GetPageTxt.GetPage(); //得到这个页面的全部链接 List<string> getLinks = GetPageTxt.GetLinks(source); List<string> getTrueLink = GetPageTxt.GetTrueUrl(getLinks, lists[i], urlKey); RwFile.WriteFile(fileName, source);//将文件写好 //调用递归的方法 ForSetFiles.SetFiles(getLinks, urlkey, filepath, OutTime, NotBuidIngFilekey); } } } /// <summary> /// 得到文件名称的完整方法 /// 代云超2010 12 23 /// </summary> /// <param name="filePath">文件前路径</param> /// <returns></returns> public static string GetTureFileName(string filePath, string urlName) { //将url转义 没有server对象 用相同的规则代替server中的Encode方法 string returnurl = urlName.Replace(":", "%3a").Replace("/", "%2f"); return filePath + returnurl; }
本文介绍了一种使用递归方法抓取网站链接并将其写入文件的技术方案。通过设置排除关键字避免重复抓取静态页面,利用自定义方法替代服务器对象实现文件路径转换。
294

被折叠的 条评论
为什么被折叠?



