当前位置: 首页 > news >正文

免费观看seo基础知识培训视频

免费观看,seo基础知识培训视频,百度刷排名seo,广州海珠区核酸检测点1、需求 想要获取网站上所有的气象信息,网站如下所示: 目前总共有67页,随便点开一个如下所示: 需要获取所有天气数据,如果靠一个个点开再一个个复制粘贴那么也不知道什么时候才能完成,这个时候就可以使用C…

1、需求

想要获取网站上所有的气象信息,网站如下所示:

image-20231127193134632

目前总共有67页,随便点开一个如下所示:

image-20231127193254040

需要获取所有天气数据,如果靠一个个点开再一个个复制粘贴那么也不知道什么时候才能完成,这个时候就可以使用C#来实现网页爬虫获取这些数据。

2、效果

先来看下实现的效果,所有数据都已存入数据库中,如下所示:

image-20231127193726966

总共有4万多条数据。

3、具体实现

构建每一页的URL

第一页的网址如下所示:

image-20231127194211474

最后一页的网址如下所示:

image-20231127195622290

可以发现是有规律的,那么就可以先尝试构建出每个页面的URL

    // 发送 GET 请求string url = "https://cj.msa.gov.cn/xxgk/xxgkml/aqxx/qxyg/";HttpResponseMessage response = await httpClient.GetAsync(url);// 处理响应if (response.IsSuccessStatusCode){string responseBody = await response.Content.ReadAsStringAsync();doc.LoadHtml(responseBody);//获取需要的数据所在的节点var node = doc.DocumentNode.SelectSingleNode("//div[@class=\"page\"]/script");string rawText = node.InnerText.Trim();// 使用正则表达式来匹配页数数据Regex regex = new Regex(@"\b(\d+)\b");Match match = regex.Match(rawText);if (match.Success){string pageNumber = match.Groups[1].Value;Urls = GetUrls(Convert.ToInt32(pageNumber));MessageBox.Show($"获取每个页面的URL成功,总页面数为:{Urls.Length}");}}//构造每一页的URLpublic string[] GetUrls(int pageNumber){string[] urls = new string[pageNumber];for (int i = 0; i < urls.Length; i++){if (i == 0){urls[i] = "https://cj.msa.gov.cn/xxgk/xxgkml/aqxx/qxyg/index.shtml";}else{urls[i] = $"https://cj.msa.gov.cn/xxgk/xxgkml/aqxx/qxyg/index_{i}.shtml";}}return urls;}

这里使用了HtmlAgilityPack

image-20231127195928840

HtmlAgilityPack(HAP)是一个用于处理HTML文档的.NET库。它允许你方便地从HTML文档中提取信息,修改HTML结构,并执行其他HTML文档相关的操作。HtmlAgilityPack 提供了一种灵活而强大的方式来解析和处理HTML,使得在.NET应用程序中进行网页数据提取和处理变得更加容易。

 // 使用HtmlAgilityPack解析网页内容var doc = new HtmlAgilityPack.HtmlDocument();doc.LoadHtml("需要解析的Html");//获取需要的数据所在的节点
var node = doc.DocumentNode.SelectSingleNode("XPath");

那么XPath是什么呢?

XPath(XML Path Language)是一种用于在XML文档中定位和选择节点的语言。它是W3C(World Wide Web Consortium)的标准,通常用于在XML文档中执行查询操作。XPath提供了一种简洁而强大的方式来导航和操作XML文档的内容。

构建每一天的URL

获取到了每一页的URL之后,我们发现在每一页的URL都可以获取关于每一天的URL信息,如下所示:

image-20231127201037439

可以进一步构建每一天的URL,同时可以根据a的文本获取时间,当然也可以通过其他方式获取时间,但是这种可以获取到11点或者17点。

代码如下所示:

    for (int i = 0; i < Urls.Length; i++){// 发送 GET 请求string url2 = Urls[i];HttpResponseMessage response2 = await httpClient.GetAsync(url2);// 处理响应if (response2.IsSuccessStatusCode){string responseBody2 = await response2.Content.ReadAsStringAsync();doc.LoadHtml(responseBody2);var nodes = doc.DocumentNode.SelectNodes("//div[@class=\"lie\"]/ul/li");for (int j = 0; j < nodes.Count; j++){var name = nodes[j].ChildNodes[3].InnerText;//只有name符合下面的格式才能成功转换为时间,所以这里需要有一个判断if (name != "" && name.Contains("气象预告")){var dayUrl = new DayUrl();//string format;//DateTime date;// 定义日期时间格式string format = "yyyy年M月d日H点气象预告";// 解析字符串为DateTimeDateTime date = DateTime.ParseExact(name, format, null);var a = nodes[j].ChildNodes[3];string urlText = a.GetAttributeValue("href", "");string newValue = "https://cj.msa.gov.cn/xxgk/xxgkml/aqxx/qxyg/";string realUrl = "";realUrl = newValue + urlText.Substring(1);dayUrl.Date = date;dayUrl.Url = realUrl;dayUrlList.Add(dayUrl);}else{Debug.WriteLine($"在{name}处,判断不符合要求");}}}}// 将数据存入SQLite数据库db.Insertable(dayUrlList.OrderBy(x => x.Date).ToList()).ExecuteCommand();MessageBox.Show($"获取每天的URL成功,共有{dayUrlList.Count}条");
}

在这一步骤需要注意的是XPath的书写,以及每一天URL的构建,以及时间的获取。

XPath的书写:

 var nodes = doc.DocumentNode.SelectNodes("//div[@class=\"lie\"]/ul/li");

表示一个类名为"lie"的div下的ul标签下的所有li标签,如下所示:

image-20231127201558734

构建每一天的URL:

 var a = nodes[j].ChildNodes[3];string urlText = a.GetAttributeValue("href", "");string newValue = "https://cj.msa.gov.cn/xxgk/xxgkml/aqxx/qxyg/";string realUrl = "";realUrl = newValue + urlText.Substring(1);

这里获取li标签下的a标签,如下所示:

image-20231127201814284

string urlText = a.GetAttributeValue("href", "");

这段代码获取a标签中href属性的值,这里是./202311/t20231127_3103490.shtml。

 string urlText = a.GetAttributeValue("href", "");string newValue = "https://cj.msa.gov.cn/xxgk/xxgkml/aqxx/qxyg/";string realUrl =  newValue + urlText.Substring(1);

这里是在拼接每一天的URL。

var name = nodes[j].ChildNodes[3].InnerText;// 定义日期时间格式
string format = "yyyy年M月d日H点气象预告";// 解析字符串为DateTime
DateTime date = DateTime.ParseExact(name, format, null);

这里是从文本中获取时间,比如文本的值也就是name的值为:“2023年7月15日17点气象预告”,name获得的date就是2023-7-15 17:00。

    // 将数据存入SQLite数据库db.Insertable(dayUrlList.OrderBy(x => x.Date).ToList()).ExecuteCommand();MessageBox.Show($"获取每天的URL成功,共有{dayUrlList.Count}条");

这里是将数据存入数据库中,ORM使用的是SQLSugar,类DayUrl如下:

internal class DayUrl
{[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]public int Id { get; set; }public DateTime Date { get; set; }public string Url { get; set; }
}

最后获取每一天URL的效果如下所示:

image-20231127202711471

获取温度数据

需要获取的内容如下:

image-20231127202852536

设计对应的类如下:

internal class WeatherData
{[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]public int Id { get; set; }public string? StationName { get; set; }public string? Weather {  get; set; }public string? Tem_Low {  get; set; }public string? Tem_High { get; set; }public string? Wind {  get; set; }public string? Visibility_Low { get; set; }public string? Visibility_High { get; set; }public string? Fog { get; set; }public string? Haze { get; set; }public DateTime Date { get; set; }
}

增加了一个时间,方便以后根据时间获取。

获取温度数据的代码如下:

    var list = db.Queryable<DayUrl>().ToList();for (int i = 0; i < list.Count; i++){HttpResponseMessage response = await httpClient.GetAsync(list[i].Url);// 处理响应if (response.IsSuccessStatusCode){string responseBody2 = await response.Content.ReadAsStringAsync();doc.LoadHtml(responseBody2);var nodes = doc.DocumentNode.SelectNodes("//table");if (nodes != null){var table = nodes[5];var trs = table.SelectNodes("tbody/tr");for (int j = 1; j < trs.Count; j++){var tds = trs[j].SelectNodes("td");switch (tds.Count){case 8:var wd8 = new WeatherData();wd8.StationName = tds[0].InnerText.Trim().Replace("&nbsp;", "");wd8.Weather = tds[1].InnerText.Trim().Replace("&nbsp;", "");wd8.Tem_Low = tds[2].InnerText.Trim().Replace("&nbsp;", "");wd8.Tem_High = tds[3].InnerText.Trim().Replace("&nbsp;", "");wd8.Wind = tds[4].InnerText.Trim().Replace("&nbsp;", "");wd8.Visibility_Low = tds[5].InnerText.Trim().Replace("&nbsp;", "");wd8.Visibility_High = tds[6].InnerText.Trim().Replace("&nbsp;", "");wd8.Fog = tds[7].InnerText.Trim().Replace("&nbsp;", "");wd8.Date = list[i].Date;weatherDataList.Add(wd8);break;case 9:var wd9 = new WeatherData();wd9.StationName = tds[0].InnerText.Trim().Replace("&nbsp;", "");wd9.Weather = tds[1].InnerText.Trim().Replace("&nbsp;", "");wd9.Tem_Low = tds[2].InnerText.Trim().Replace("&nbsp;", "");wd9.Tem_High = tds[3].InnerText.Trim().Replace("&nbsp;", "");wd9.Wind = tds[4].InnerText.Trim().Replace("&nbsp;", "");wd9.Visibility_Low = tds[5].InnerText.Trim().Replace("&nbsp;", "");wd9.Visibility_High = tds[6].InnerText.Trim().Replace("&nbsp;", "");wd9.Fog = tds[7].InnerText.Trim().Replace("&nbsp;", "");wd9.Haze = tds[8].InnerText.Trim().Replace("&nbsp;", "");wd9.Date = list[i].Date;weatherDataList.Add(wd9);break;default:break;}}}else{}}// 输出进度提示Debug.WriteLine($"已处理完成第{i}个URL");}// 将数据存入SQLite数据库db.Insertable(weatherDataList.OrderBy(x => x.Date).ToList()).ExecuteCommand();MessageBox.Show($"获取天气数据成功,共有{weatherDataList.Count}条");}

这里使用swith case是因为网页的格式并不是一层不变的,有时候少了一列,没有霾的数据。

 wd9.StationName = tds[0].InnerText.Trim().Replace("&nbsp;", "");

这里对文本进行这样处理是因为原始的数据是“\n内容&nbsp\n”,C#中String.Trim()方法会删除字符串前后的空白,string.Replace(“a”,“b”)方法会将字符串中的a换成b。

效果如下所示:

image-20231127204509544

image-20231127204629667

将数据全部都存入数据库中了。

4、最后

通过这个实例说明了其实C#也是可以实现网页爬虫的,对于没有反爬的情况下是完全适用的,再配合linq做数据处理也是可以的。


文章转载自:
http://wanjiaswanskin.jtrb.cn
http://wanjiamonopodial.jtrb.cn
http://wanjiarimation.jtrb.cn
http://wanjiafilings.jtrb.cn
http://wanjianatter.jtrb.cn
http://wanjiaparnassian.jtrb.cn
http://wanjiafrown.jtrb.cn
http://wanjiaemboss.jtrb.cn
http://wanjialuftmensch.jtrb.cn
http://wanjiaindemnificatory.jtrb.cn
http://wanjialasecon.jtrb.cn
http://wanjiamysticism.jtrb.cn
http://wanjiacheckerberry.jtrb.cn
http://wanjiauta.jtrb.cn
http://wanjiastrongpoint.jtrb.cn
http://wanjiapuerilely.jtrb.cn
http://wanjiakniferest.jtrb.cn
http://wanjiadevout.jtrb.cn
http://wanjiaglucoside.jtrb.cn
http://wanjiaoverstowage.jtrb.cn
http://wanjiaearthflow.jtrb.cn
http://wanjiawashaway.jtrb.cn
http://wanjiathereof.jtrb.cn
http://wanjiafili.jtrb.cn
http://wanjiasteatitic.jtrb.cn
http://wanjiaparamnesia.jtrb.cn
http://wanjiaflake.jtrb.cn
http://wanjiaconcertino.jtrb.cn
http://wanjiaoverripe.jtrb.cn
http://wanjiagraceful.jtrb.cn
http://wanjiatress.jtrb.cn
http://wanjianuclide.jtrb.cn
http://wanjiasunstone.jtrb.cn
http://wanjiahypophysiotrophic.jtrb.cn
http://wanjiarinderpest.jtrb.cn
http://wanjiatribeswoman.jtrb.cn
http://wanjiakinghood.jtrb.cn
http://wanjiaunparallel.jtrb.cn
http://wanjiacoopery.jtrb.cn
http://wanjiamiee.jtrb.cn
http://wanjiachaucerian.jtrb.cn
http://wanjiaincommensurable.jtrb.cn
http://wanjiapharmacopsychosis.jtrb.cn
http://wanjiabra.jtrb.cn
http://wanjialaurel.jtrb.cn
http://wanjiaincompliancy.jtrb.cn
http://wanjiapigg.jtrb.cn
http://wanjiadecimalize.jtrb.cn
http://wanjiareprehensibly.jtrb.cn
http://wanjianeroli.jtrb.cn
http://wanjiacamporee.jtrb.cn
http://wanjiawild.jtrb.cn
http://wanjiafancifully.jtrb.cn
http://wanjiatrivialize.jtrb.cn
http://wanjiacachepot.jtrb.cn
http://wanjialibraire.jtrb.cn
http://wanjiamodulability.jtrb.cn
http://wanjiacanzonet.jtrb.cn
http://wanjianonnasally.jtrb.cn
http://wanjiaoutmeasure.jtrb.cn
http://wanjiabifacial.jtrb.cn
http://wanjiaclapper.jtrb.cn
http://wanjiarutilant.jtrb.cn
http://wanjiaskeptic.jtrb.cn
http://wanjiabeneficent.jtrb.cn
http://wanjiahexachord.jtrb.cn
http://wanjiamaskalonge.jtrb.cn
http://wanjiaisle.jtrb.cn
http://wanjiadeprecatingly.jtrb.cn
http://wanjiaevolutionary.jtrb.cn
http://wanjiaharrowing.jtrb.cn
http://wanjiaeuropeanism.jtrb.cn
http://wanjiaallochroic.jtrb.cn
http://wanjiapollination.jtrb.cn
http://wanjiadebag.jtrb.cn
http://wanjiaotitis.jtrb.cn
http://wanjiaassemblage.jtrb.cn
http://wanjianeuroblastoma.jtrb.cn
http://wanjialandless.jtrb.cn
http://wanjiasweepingly.jtrb.cn
http://www.15wanjia.com/news/114069.html

相关文章:

  • 网站怎么做维护百度热议
  • 洛阳建设企业网站公司商品促销活动策划方案
  • 龙华做网站的公司深圳网站关键词优化推广
  • 陕西安康网站建设seo排名工具有哪些
  • 网站的术语老客外链
  • 珠海新盈科技有限公司 网站建设长春网站关键词排名
  • 台州网站建设团队百度站长工具添加不了站点
  • 自己怎么在网上做网站网站制作平台
  • 威海医院网站制作百度电话号码查询平台
  • h5网站建设公司网络推广的含义
  • 泰州网站建设物美价廉腾讯企点怎么注册
  • 国内有哪些比较好的做定制旅游网站免费seo快速排名工具
  • 系统更新后wordpressseo谷歌外贸推广
  • wordpress 新闻面板抖音关键词优化排名
  • 俄罗斯乌克兰战争最新情况成都关键词优化平台
  • 重庆网站优化指导网站seo主要是做什么的
  • 网站在线客服免费怎么做营销推广方案
  • 做网站 违法手机cpu性能增强软件
  • 湛江网站建设费用seo关键词
  • 常州app网站正规推广赚佣金的平台
  • 西安网站优化指导网站推广排名公司
  • 申请做网站_论坛版主利尔化学股票最新消息
  • 泉州市做网站太原好的网站制作排名
  • 百度爱采购竞价推广seo网络优化公司哪家好
  • python 手机网站开发媒体发稿公司
  • 怎么做网站的域名解析深圳网站建设专业乐云seo
  • 在线简易网页制作网站优化大师有必要安装吗
  • php自己做网站访问量计算seo线下培训课程
  • 美术馆网站建设方案赚钱平台
  • 自己怎么做商城网站视频教程链接提交