简单爬虫-抓取博客园文章列表
2014-05-20 08:39 李明成 阅读(7296) 评论(28) 编辑 收藏 举报如果使用对方网站数据,而又没有响应的接口,或者使用接口不够灵活的情况下,使用爬虫在合适不过了。爬虫有几种,对方网站展示形式有几种都是用分析,每个网站展示有相似的地方,有不同的地方。
大部分使用httpRequst就能完成,不管是否添加了口令、随即码、请求参数、提交方式get或者post、地址来源、多次响应等等。但是有些网站使用ajax如果是返回json或固定格式的也好处理,如果是很复杂的,可以使用webbrower控件进行抓取,最后正则解析,获取所需要的数据即可。
那我们来抓取去首页网站列表 文章标题、文章摘要、文章发布时间、文章作者、文章评论次数、文章浏览次数。看下结构图。
get请求返回静态html附代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | public class HttpCnblogs { public static List<CnblogsModel> HttpGetHtml() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create( "http://www.cnblogs.com/" ); request.Method = "GET" ; request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" ; request.UserAgent = " Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0" ; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream stream = response.GetResponseStream(); StreamReader sr = new StreamReader(stream); string articleContent = sr.ReadToEnd(); List<CnblogsModel> list = new List<CnblogsModel>(); #region 正则表达式 //div post_item_body列表 Regex regBody = new Regex( @"<div\sclass=""post_item_body"">([\s\S].*?)</div>" , RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace); //a标签 文章标题 作者名字 评论 阅读 Regex regA = new Regex( "<a[^>]*?>(.*?)</a>" , RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace); //p标签 文章内容 Regex regP = new Regex( @"<p\sclass=""post_item_summary"">(.*?)</p>" , RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace); //提取评论 阅读次数如:评论(10)-》10 Regex regNumbernew = new Regex( @"\d+" , RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace); //提取时间 Regex regTime = new Regex( @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}" , RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace); #endregion MatchCollection mList = regBody.Matches(articleContent); CnblogsModel model = null ; String strBody = String.Empty; for ( int i = 0; i < mList.Count; i++) { model = new CnblogsModel(); strBody = mList[i].Groups[1].ToString(); MatchCollection aList = regA.Matches(strBody); int aCount = aList.Count; model.ArticleTitle = aList[0].Groups[1].ToString(); model.ArticleAutor = aCount == 5 ? aList[2].Groups[1].ToString() : aList[1].Groups[1].ToString(); model.ArticleComment = Convert.ToInt32(regNumbernew.Match(aList[aCount-2].Groups[1].ToString()).Value); model.ArticleTime = regTime.Match(strBody).Value; model.ArticleView = Convert.ToInt32(regNumbernew.Match(aList[aCount-1].Groups[1].ToString()).Value); model.ArticleContent = regP.Matches(strBody)[0].Groups[1].ToString(); list.Add(model); } return list; } } public class CnblogsModel { /// <summary> /// 文章标题 /// </summary> public String ArticleTitle { get ; set ; } /// <summary> /// 文章内容摘要 /// </summary> public String ArticleContent { get ; set ; } /// <summary> /// 文章作者 /// </summary> public String ArticleAutor { get ; set ; } /// <summary> /// 文章发布时间 /// </summary> public String ArticleTime { get ; set ; } /// <summary> /// 文章评论量 /// </summary> public Int32 ArticleComment { get ; set ; } /// <summary> /// 文章浏览量 /// </summary> public Int32 ArticleView { get ; set ; } } |
最后看看获取的文章model
写的不好,还请见谅,准备下面试去。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?