c#抓取网页数据(静态网页爬取的基本流程(一)(图))

优采云 发布时间: 2022-04-11 03:02

  c#抓取网页数据(静态网页爬取的基本流程(一)(图))

  内容

  爬虫有两种,静态网页爬虫和动态网页爬虫。与动态网页爬虫相比,它非常简单。静态网页的爬取不需要执行JavaScript等代码,只需要获取页面Html代码并解析目标内容即可。也就是本文介绍了静态网页爬取的基本流程。

  识别目标内容和目标站点

  明确要求,比如这篇文章需要爬取北京过去一段时间的所有天气,先找一个合适的网站,比如在这个网站,可以找到站点北京的历史气象。

  

  分析目标站点结构

  在浏览器中打开北京历史天气站点后,无法直接获取天气,但是获取了很多超链接,包括指向不同时间段的天气链接。因此,需要解析这个页面来分析目标链接。

  目标站点中的链接有两种类型,一种是目标链接,另一种是其他链接。接下来在浏览器中按F12查看网页源代码,查看目标链接的特征。这些特征可能是 Html 节点或 Html 属性。简而言之,你需要找到一个特征来区分目标链接和其他链接。

  

  在Html代码中,可以看到链接的两个区别

  

  网络访问

  位于 System.Net 空间的 WebClient 可以轻松获取网页。主要代码如下

  public static string GetHtml(string url)

{

string res = "";

WebClient client = new WebClient();

Stream stream = client.OpenRead(url);

StreamReader sr = new StreamReader(stream, Encoding.Default);

res = sr.ReadToEnd();

sr.Close();

client.Dispose();

return res;

}

  网页节点分析

  有一个著名的库 HtmlAgilityPack 可以帮助我们从字符串的网页的 html 代码生成 Dom 树,并让我们可以快速轻松地选择 Dom 树的节点,完成上一节的想法。VS打开工具->NuGet包管理器->管理解决方案的Nuget包,从这里可以搜索对应安装的HtmlAgilityPack包。使用该库时,需要导入 HtmlAgilityPack 命名空间。

  using HtmlAgilityPack;

  接下来,采用上一节的第二个思路,解析出目标链接。

  public static List ParseLink(string html)

{

List res = new List();

var doc = new HtmlDocument();

doc.LoadHtml(html);

var linkNodes = doc.DocumentNode.SelectNodes("//a[@href]");

foreach (var linkNode in linkNodes)

{

string link = linkNode.GetAttributeValue("href", "");

if (link.StartsWith("/lishi/beijing/month"))

{

res.Add(link);

}

}

return res;

}

  至此,收录过去时间段的站点的所有链接都已被解析。接下来,需要分析每个链接对应的具体网页的结构,从中获取天气信息。

  分析天气网页结构

  上一个链接是站点链接,具体天气网页对应的链接集合在上一节已经分析过了,例如。

  

  现在我们需要从这个页面分析天气,就像解析站点结构中的目标链接一样,在浏览器中观察Html代码,发现天气的目标内容在一个表格中,所以我们只需要选择节点,因为节点表示给定日期的天气(天气条件、气温和风向)。

  

  public static void ParseDailyWeather(string html)

{

var doc = new HtmlDocument();

doc.LoadHtml(html);

var rows = doc.DocumentNode.SelectNodes("//tr");

StringBuilder sb = new StringBuilder();

rows.RemoveAt(0);

foreach (var row in rows)

{

var cols = row.SelectNodes("td");

foreach (var col in cols)

{

string temp = col.InnerText.Replace("\r\n", "").Replace(" ", "").Trim();

sb.Append(temp + ",");

}

sb.Append("\r\n");

}

FileStream fs = new FileStream("output.csv", FileMode.Append, FileAccess.Write);

StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding("gbk"));

sw.WriteLine(sb);

sw.Close();

fs.Close();

}

  最后,为了实现对网站的爬取,需要一个循环来实现对所有网页的爬取

  public static void ParseWebsite(string url)

{

string html = Weather.GetHtml(url);

var links = Weather.ParseLink(html);

foreach (var link in links)

{

url = "http://www.tianqihoubao.com" + link;

html = Weather.GetHtml(url);

Weather.ParseDailyWeather(html);

}

}

  总结

  静态网页的爬取比较简单,可以分为以下几个步骤

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线