/// <summary> /// 根据详情页url下载此页面,解析其中的图片地址并下载 /// </summary> /// <param name="pageUrl"></param> /// <param name="type"></param> private void downloadPicture(string pageUrl, string type) { // 获取缓存路径 string[] arr = pageUrl.Split('/'); string pageId = arr[arr.Length - 2]; string cacheDir = homeDir + "cache\\"; CreateDir(cacheDir); string cacheFile = cacheDir + pageId; string pictureUrl = null; // 从缓存中获取地址 if (File.Exists(cacheFile)) { pictureUrl = File.ReadAllText(cacheFile); if (pictureUrl == "") { pictureUrl = null; } } if (pictureUrl == null) { //获取详情页面信息 string html = GetHtml(pageUrl); // 检查页面是否下载成功 if (html == null || html == "") { throw new Exception("请检查网络"); } //获取图片下载地址 pictureUrl = Analyze.GetPictureUrl(html); if (pictureUrl == null) { throw new Exception("无法分析出图片地址:" + pageUrl); } // 缓存下来图片地址 CreateFile(cacheFile); File.WriteAllText(cacheFile, pictureUrl); } // 获取文件名字 string pictureName = Analyze.GetFileName(pictureUrl); // 文件完整路径 string fullFilePath = filePath + type + pictureName; // 判断文件是否已经存在 if (File.Exists(fullFilePath)) { AddItemToTextBox(String.Format("第{0}页第{1}张已存在,跳过", startPageNum, startPicNum)); startPicNum++; skipDownloadNum++; return; } // 使用多线程下载 Task task = new Task() { pageNum = startPageNum, picNum = startPicNum, Url = pictureUrl, FilePath = filePath + type, FileName = pictureName, TaskStart = new Task.TaskStartDelegate(delegate(int id, Task t) { // 下载开始 }), TaskStop = new Task.TaskStopDelegate(delegate(int id, Task t) { // AddItemToTextBox("下载被终止" + t.FileName); }), TaskFinish = new Task.TaskFinishDelegate(delegate(int id, Task t) { totalDownloadNum++; // 计算下载所用时间 DateTime now = DateTime.Now; TimeSpan time = now - startTime; AddItemToTextBox(String.Format("第{0}页第{1}张下载完成,已经过{2}秒", t.pageNum, t.picNum, time.TotalSeconds)); }), TaskFail = new Task.TaskFailDelegate(delegate(int id, Task t) { AddItemToTextBox(String.Format("第{0}页第{1}张下载失败", t.pageNum, t.picNum)); }), }; DownloadManager.Add(task); startPicNum++; }
/// <summary> /// 下载图集 /// </summary> /// <param name="type">gallery或者scraps</param> private void download(string type) { AddItemToTextBox(type + "下载开始"); GetUserInput(); // 循环下载第pageNum页 while (true) { if (isStop) { throw new Exception("正在结束下载"); } // 存储当前页面地址 string nowUrl = string.Format("http://www.furaffinity.net/{0}/{1}/{2}", type, userName, startPageNum); // 下载当前页 string html = GetHtml(nowUrl); // 检查页面是否下载成功 if (html == null || html == "") { throw new Exception("请检查网络"); } // 检查此用户是否存在 if (!Analyze.HasUser(html)) { throw new Exception("未查询到该作者,请检查作者名称"); } // 检查此页是否需要登录才能访问 if (!Analyze.NeedLogin(html)) { throw new Exception("需要登陆后才能下载此作者的作品"); } //--------开始详情页下载循环------------ // 获得所有详情页 List <String> pages = Analyze.GetPages(html); // 检查此页是否还有图片,没有的话就结束并等待所有任务完成 AddItemToTextBox(String.Format("第{0}页共{1}张图片", startPageNum, pages.Count)); if (pages.Count == 0) { return; } for (int i = startPicNum - 1; i < pages.Count; ++i) { // 停止时不再添加新的任务 if (isStop) { throw new Exception("正在结束下载"); } downloadPicture(pages[i], type); } startPicNum = 1; startPageNum++; } }
/// <summary> /// 下载图集 /// </summary> /// <param name="type">gallery或者scraps</param> private State download(string type) { AddItemToTextBox(type + "下载开始"); initDownload(); //初始化参数 string[] allPages;//存储详情页地址 //循环下载第pageNum页 while (true) { State pageState; //存储当前页面地址 string nowUrl = string.Format("http://www.furaffinity.net/{0}/{1}/{2}", type, userName, startPageNum); //下载当前页 pageState = Download.GetGeneralContent(nowUrl, cookie); if (pageState.code == StateCode.error) { AddItemToTextBox(pageState.message); return(new State(StateCode.error)); } //检查此用户是否存在 string nowPage = pageState.message; if (Analyze.checkName(nowPage, userName) == false) { AddItemToTextBox("未查询到该作者,请检查作者名称"); return(new State(StateCode.error)); } //检查此页是否还有图片,没有的话输出错误日志 pageState = Analyze.checkPage(nowPage); if (pageState.code == StateCode.finish) { AddItemToTextBox(pageState.message); break; } else if (pageState.code == StateCode.error) { AddItemToTextBox(pageState.message); return(new State(StateCode.error)); } //--------开始详情页下载循环------------ //获得所有详情页 allPages = Analyze.getNextPages(nowPage); for (int i = startPicNum - 1; i < allPages.Length; ++i) { pageState = downloadPicture(allPages[i], type); if (pageState.code == StateCode.finish) { return(new State(StateCode.finish)); } else if (pageState.code == StateCode.error) { return(new State(StateCode.error)); } } startPicNum = 1; startPageNum++; } return(new State(StateCode.ok)); }
/// <summary> /// 根据详情页url下载此页面,解析其中的图片地址并下载 /// </summary> /// <param name="pageUrl"></param> /// <param name="type"></param> /// <returns></returns> private State downloadPicture(string pageUrl, string type) { State pageState; //如果已经到达最大下载量,则停止下载 if (maxDownloadNum > 0 && singleDownloadNum >= maxDownloadNum) { return(new State(StateCode.finish)); } //获取详情页面信息 pageState = Download.GetGeneralContent(pageUrl, cookie); if (pageState.code == StateCode.error) { AddItemToTextBox(pageState.message); return(new State(StateCode.error)); } //获取图片下载地址 string pictureUrl = Analyze.getPictureUrl(pageState.message); if (pictureUrl == null) { AddItemToTextBox("无法找到下载地址"); return(new State(StateCode.error)); } //获取文件名字 string pictureName = Analyze.getFilename(pictureUrl); //开始下载 AddItemToTextBox("第" + startPageNum + "页" + "第" + startPicNum + "张下载开始"); AddItemToTextBox("文件名:" + pictureName); //文件完整路径 string fullFilePath = filePath + type + pictureName; //判断文件是否已经存在 if (File.Exists(fullFilePath)) { AddItemToTextBox("文件已存在,跳过下载\r\n"); startPicNum++; skipDownloadNum++; singleDownloadNum++; return(new State(StateCode.ok)); } //获取下载前的时间 DateTime before = DateTime.Now; pageState = Download.GetFileContent(pictureUrl, filePath + type, pictureName); if (pageState.code == StateCode.error) { AddItemToTextBox("下载失败,原因是:" + pageState.message); return(new State(StateCode.error)); } //获取下载后的时间 DateTime after = DateTime.Now; //计算下载所用时间 TimeSpan speed = after - before; AddItemToTextBox(speed.TotalSeconds + "秒下载完成\r\n"); startPicNum++; fullDownloadNum++; singleDownloadNum++; return(new State(StateCode.ok)); }
/// <summary> /// 下载图集 /// </summary> /// <param name="type">gallery或者scraps</param> private void download(string type) { AddItemToTextBox(type + "下载开始"); GetUserInput(); // 循环下载第pageNum页 while (true) { try { if (isStop) { throw new Exception("正在结束下载"); } // 存储当前页面地址 string nowUrl = string.Format("https://www.furaffinity.net/{0}/{1}/{2}", type, userName, startPageNum); // 下载当前页 string html = GetHtml(nowUrl); // 检查页面是否下载成功 if (html == null || html == "") { throw new NetworkException("请检查网络"); } // 检查此用户是否存在 if (!Analyze.HasUser(html)) { throw new NoSuchArtistException("未查询到该作者,请检查作者名称"); } // 检查此页是否需要登录才能访问 if (!Analyze.NeedLogin(html)) { throw new NeedLoginException("需要登陆后才能下载此作者的作品"); } //--------开始详情页下载循环------------ // 获得所有详情页 List <String> pages = Analyze.GetPages(html); // 检查此页是否还有图片,没有的话就结束并等待所有任务完成 AddItemToTextBox(String.Format("第{0}页共{1}张图片", startPageNum, pages.Count)); if (pages.Count == 0) { return; } for (int i = startPicNum - 1; i < pages.Count; ++i) { // 停止时不再添加新的任务 if (isStop) { throw new InterruptException("正在结束下载"); } // 在到达最大下载量时停止 if (maxDownloadNum != 0 && currentDownloadTaskNum >= maxDownloadNum) { AddItemToTextBox("已到达最大任务量,正在等待下载完成"); return; } currentDownloadTaskNum++; downloadPicture(pages[i], type); } startPicNum = 1; startPageNum++; } catch (NetworkException) { if (checkBoxRetry.Checked) { AddItemToTextBox("网络不稳定,将在一秒后重试"); Thread.Sleep(1000); } else { throw; } } } }