c#抓取网页数据(静态网页爬取的基本流程(一)(图))
优采云 发布时间: 2022-04-11 03:02c#抓取网页数据(静态网页爬取的基本流程(一)(图))
内容
爬虫有两种,静态网页爬虫和动态网页爬虫。与动态网页爬虫相比,它非常简单。静态网页的爬取不需要执行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);
}
}
总结
静态网页的爬取比较简单,可以分为以下几个步骤