C#简化工作之实现网页爬虫获取数据
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
1、需求想要获取网站上所有的气象信息,网站如下所示:
目前总共有67页,随便点开一个如下所示:
需要获取所有天气数据,如果靠一个个点开再一个个复制粘贴那么也不知道什么时候才能完成,这个时候就可以使用C#来实现网页爬虫获取这些数据。 2、效果先来看下实现的效果,所有数据都已存入数据库中,如下所示:
总共有4万多条数据。 3、具体实现构建每一页的URL第一页的网址如下所示:
最后一页的网址如下所示:
可以发现是有规律的,那么就可以先尝试构建出每个页面的URL // 发送 GET 请求 这里使用了HtmlAgilityPack
// 使用HtmlAgilityPack解析网页内容 那么XPath是什么呢?
构建每一天的URL获取到了每一页的URL之后,我们发现在每一页的URL都可以获取关于每一天的URL信息,如下所示:
可以进一步构建每一天的URL,同时可以根据a的文本获取时间,当然也可以通过其他方式获取时间,但是这种可以获取到11点或者17点。 代码如下所示: for (int i = 0; i < Urls.Length; i++) 在这一步骤需要注意的是XPath的书写,以及每一天URL的构建,以及时间的获取。 XPath的书写: var nodes = doc.DocumentNode.selectNodes("//div[@class=\"lie\"]/ul/li"); 表示一个类名为"lie"的div下的ul标签下的所有li标签,如下所示:
构建每一天的URL: var a = nodes[j].ChildNodes[3]; 这里获取li标签下的a标签,如下所示:
string urlText = a.GetAttributeValue("href", ""); 这段代码获取a标签中href属性的值,这里是./202311/t20231127_3103490.shtml。 string urlText = a.GetAttributeValue("href", ""); 这里是在拼接每一天的URL。 var name = nodes[j].ChildNodes[3].InnerText; 这里是从文本中获取时间,比如文本的值也就是name的值为:“2023年7月15日17点气象预告”,name获得的date就是2023-7-15 17:00。 // 将数据存入SQLite数据库 这里是将数据存入数据库中,ORM使用的是SQLSugar,类DayUrl如下: internal class DayUrl 最后获取每一天URL的效果如下所示: 获取温度数据需要获取的内容如下:
设计对应的类如下: internal class WeatherData 增加了一个时间,方便以后根据时间获取。 获取温度数据的代码如下: var list = db.Queryable<DayUrl>().ToList(); |