1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Text;
  7. using System.Text.RegularExpressions;
  8. using System.Threading.Tasks;
  9.  
  10. namespace MeiZi
  11. {
  12. public class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. new GetMeiziPic();
  17. }
  18. }
  19. /// <summary>
  20. /// 获取妹子图片
  21. /// </summary>
  22. public class GetMeiziPic
  23. {
  24. private readonly string _path;
  25. private const string ImgRegex = @"<img[^>]*?src\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?>";//图片的正则表达式
  26. private const string LinkRegex = @"<h2><a\s+[^>]*?>[^<>]*?<\/a></h2>";
  27. public GetMeiziPic()
  28. {
  29. _path = DealDir(Path.Combine(Environment.CurrentDirectory, "Images"));
  30. Console.WriteLine("=============== 开始采集 ===============");
  31. for (var i = ; i < ; i++)
  32. {
  33. Console.WriteLine("===============正在下载第{0}页数据===============", i);
  34. DoFetchStep1(i);
  35. }
  36.  
  37. Console.WriteLine("=============== 采集完成 ===============");
  38. }
  39. private string DealDir(string path)
  40. {
  41. if (!Directory.Exists(path))
  42. Directory.CreateDirectory(path);
  43. return path;
  44. }
  45. private void DoFetchStep1(int pageNum)
  46. {
  47. var request = (HttpWebRequest)WebRequest.Create("http://www.sepaidui.com/?sort=4&page=" + pageNum);
  48. request.Credentials = CredentialCache.DefaultCredentials;
  49. var response = (HttpWebResponse)request.GetResponse();
  50. if (response.StatusCode != HttpStatusCode.OK) return;
  51. var stream = response.GetResponseStream();
  52. if (stream == null) return;
  53. using (var sr = new StreamReader(stream))
  54. {
  55. FetchLinksFromSource1(sr.ReadToEnd());
  56. }
  57. }
  58.  
  59. private void FetchLinksFromSource1(string htmlSource)
  60. {
  61. var matchesLink = Regex.Matches(htmlSource, LinkRegex, RegexOptions.IgnoreCase | RegexOptions.Singleline);
  62. foreach (Match m in matchesLink)
  63. {
  64. string href = m.Groups[].Value.Split('"')[];
  65. DoFetchStep2(href);
  66. }
  67. }
  68.  
  69. private void DoFetchStep2(string href)
  70. {
  71. var request = (HttpWebRequest)WebRequest.Create(href);
  72. var h = request.Headers;
  73. request.Credentials = CredentialCache.DefaultCredentials;
  74. var response = (HttpWebResponse)request.GetResponse();
  75. if (response.StatusCode != HttpStatusCode.OK) return;
  76. var stream = response.GetResponseStream();
  77. if (stream == null) return;
  78. using (var sr = new StreamReader(stream))
  79. {
  80. FetchLinksFromSource2(sr.ReadToEnd());
  81. }
  82. }
  83. private void FetchLinksFromSource2(string htmlSource)
  84. {
  85. var matchesImgSrc = Regex.Matches(htmlSource, ImgRegex, RegexOptions.IgnoreCase | RegexOptions.Singleline);
  86. foreach (Match m in matchesImgSrc)
  87. {
  88. var href = m.Groups[].Value;
  89. //只选取来自新浪相册的图片
  90. if (href.Contains("sinaimg") && CheckIsUrlFormat(href) && !href.Contains("60d02b59tw1eq6g7srmiwj20pv03mdg8"))
  91. {
  92. Console.WriteLine(href);
  93. }
  94. else
  95. continue;
  96. using (var myWebClient = new WebClient())
  97. {
  98. try
  99. {
  100. myWebClient.DownloadFile(new Uri(href), Path.Combine(_path, Path.GetRandomFileName() + Path.GetExtension(href)));
  101. }
  102. catch (Exception ex)
  103. {
  104. Console.WriteLine(ex.Message);
  105. }
  106. }
  107. }
  108. }
  109.  
  110. private readonly Regex _isUrlFormat = new Regex(@"http://?([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?");
  111. private bool CheckIsUrlFormat(string value)
  112. {
  113. return _isUrlFormat.IsMatch(value);
  114. }
  115. }
  116. }

C#程序的更多相关文章

  1. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  2. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  3. 微信小程序开发心得

    微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...

  4. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  5. 微信应用号(小程序)开发IDE配置(第一篇)

    2016年9月22日凌晨,微信宣布“小程序”问世,当然只是开始内测了,微信公众平台对200个服务号发送了小程序内测邀请.那么什么是“小程序”呢,来看微信之父怎么说 看完之后,相信大家大概都有些明白了吧 ...

  6. 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)

    建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...

  7. 【探索】在 JavaScript 中使用 C 程序

    JavaScript 是个灵活的脚本语言,能方便的处理业务逻辑.当需要传输通信时,我们大多选择 JSON 或 XML 格式. 但在数据长度非常苛刻的情况下,文本协议的效率就非常低了,这时不得不使用二进 ...

  8. 通过Jexus 部署 dotnetcore版本MusicStore 示例程序

    ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...

  9. Code Review 程序员的寄望与哀伤

    一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...

  10. 使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序

    直接切入正题,这是我09年到11年左右业余时间编写的项目,最初的想法很简单,做一个能拖拖拽拽就直接生成应用程序的工具,不用写代码,把能想到的业务操作全部封装起来,通过配置的方式把这些业务操作组织起来运 ...

随机推荐

  1. 关于IOS时间日历的一些注意事项 NSDateFormatter

    1.时间或者日期格式化的格式化,在真机上运行的是hi,必须指定是在哪个区域的,不然在真机无法显示 // 1.日期格式化 NSDateFormatter *fmt = [[NSDateFormatter ...

  2. 【BZOJ-3033】太鼓达人 欧拉图 + 暴搜

    3033: 太鼓达人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 204  Solved: 154[Submit][Status][Discuss] ...

  3. 【BZOJ-2502】清理雪道 有上下界的网络流(有下界的最小流)

    2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 594  Solved: 318[Submit][Status][Discuss] ...

  4. springMVC-JSR303数据效验

    JSR 303 是java为Bean数据合法性校验提供的标准框架, 它已经包含在javaEE6.0中 JSR 303 通过Bean属性上标注类似于@NotNull.@Max等标准的注解指定校验规则, ...

  5. [NOIP2012] 提高组 洛谷P1084 疫情控制

    题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...

  6. POJ 2533 Longest Ordered Subsequence(最长上升子序列(NlogN)

    传送门 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subseque ...

  7. UVa 11889 Benefit(数论)

    题目链接: 传送门 Benefit Time Limit: 5000MS     Memory Limit: 32768 KB Description Recently Yaghoub is play ...

  8. 快捷键&小技巧&备忘录

    shift+鼠标滚轮:实现左右移动 alt+鼠标左键双击:打开属性 chrome中在F12下的Element中,可以先选中某一项,可以直接按住F2进行编辑 chrome中element的右下方我们可以 ...

  9. mysql php query steps

    1.mysql connect $db=new mysqli ('localhost','database','user','password'); 2. query $query=select id ...

  10. D/A转换器实验

    1.代码: #include<reg52.h>typedef unsigned char u8;typedef unsigned int u16;void delay (u16 num){ ...