[转载]简单爬虫-抓取博客园文章列表 - 成天 - 博客园

[转载]简单爬虫-抓取博客园文章列表 – 成天 – 博客园.

    如果使用对方网站数据,而又没有响应的接口,或者使用接口不够灵活的情况下,使用爬虫在合适不过了。爬虫有几种,对方网站展示形式有几种都是用分析,每个网站展示有相似的地方,有不同的地方。

    大部分使用httpRequst就能完成,不管是否添加了口令、随即码、请求参数、提交方式get或者post、地址来源、多次响应等等。但是有些网站使 用ajax如果是返回json或固定格式的也好处理,如果是很复杂的,可以使用webbrower控件进行抓取,最后正则解析,获取所需要的数据即可。

     那我们来抓取去首页网站列表 文章标题、文章摘要、文章发布时间、文章作者、文章评论次数、文章浏览次数。看下结构图。

  get请求返回静态html附代码如下

public class HttpCnblogs
{
public static List 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 list = new List();

#region 正则表达式
//div post_item_body列表
Regex regBody = new Regex(@"<div\sclass=""post_item_body"">([\s\S].*?)

", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
//a标签 文章标题 作者名字 评论 阅读
Regex regA = new Regex("<a[^>]*?>(.*?)", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
//p标签 文章内容
Regex regP = new Regex(@"<p\sclass=""post_item_summary"">(.*?)

", 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
{
///
/// 文章标题
///

public String ArticleTitle { get; set; }
///
/// 文章内容摘要
///

public String ArticleContent { get; set; }
///
/// 文章作者
///

public String ArticleAutor { get; set; }
///
/// 文章发布时间
///

public String ArticleTime { get; set; }
///
/// 文章评论量
///

public Int32 ArticleComment { get; set; }
///
/// 文章浏览量
///

public Int32 ArticleView { get; set; }
}

最后看看获取的文章model

写的不好,还请见谅,准备下面试去。。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏