C#簡化工作之實(shí)現(xiàn)網(wǎng)頁爬蟲獲取數(shù)據(jù)
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
1、需求想要獲取網(wǎng)站上所有的氣象信息,網(wǎng)站如下所示:
目前總共有67頁,隨便點(diǎn)開一個如下所示:
需要獲取所有天氣數(shù)據(jù),如果靠一個個點(diǎn)開再一個個復(fù)制粘貼那么也不知道什么時候才能完成,這個時候就可以使用C#來實(shí)現(xiàn)網(wǎng)頁爬蟲獲取這些數(shù)據(jù)。 2、效果先來看下實(shí)現(xiàn)的效果,所有數(shù)據(jù)都已存入數(shù)據(jù)庫中,如下所示:
總共有4萬多條數(shù)據(jù)。 3、具體實(shí)現(xiàn)構(gòu)建每一頁的URL第一頁的網(wǎng)址如下所示:
最后一頁的網(wǎng)址如下所示:
可以發(fā)現(xiàn)是有規(guī)律的,那么就可以先嘗試構(gòu)建出每個頁面的URL // 發(fā)送 GET 請求 這里使用了HtmlAgilityPack
// 使用HtmlAgilityPack解析網(wǎng)頁內(nèi)容 那么XPath是什么呢?
構(gòu)建每一天的URL獲取到了每一頁的URL之后,我們發(fā)現(xiàn)在每一頁的URL都可以獲取關(guān)于每一天的URL信息,如下所示:
可以進(jìn)一步構(gòu)建每一天的URL,同時可以根據(jù)a的文本獲取時間,當(dāng)然也可以通過其他方式獲取時間,但是這種可以獲取到11點(diǎn)或者17點(diǎn)。 代碼如下所示: for (int i = 0; i < Urls.Length; i++) 在這一步驟需要注意的是XPath的書寫,以及每一天URL的構(gòu)建,以及時間的獲取。 XPath的書寫: var nodes = doc.DocumentNode.selectNodes("//div[@class=\"lie\"]/ul/li"); 表示一個類名為"lie"的div下的ul標(biāo)簽下的所有l(wèi)i標(biāo)簽,如下所示:
構(gòu)建每一天的URL: var a = nodes[j].ChildNodes[3]; 這里獲取li標(biāo)簽下的a標(biāo)簽,如下所示:
string urlText = a.GetAttributeValue("href", ""); 這段代碼獲取a標(biāo)簽中href屬性的值,這里是./202311/t20231127_3103490.shtml。 string urlText = a.GetAttributeValue("href", ""); 這里是在拼接每一天的URL。 var name = nodes[j].ChildNodes[3].InnerText; 這里是從文本中獲取時間,比如文本的值也就是name的值為:“2023年7月15日17點(diǎn)氣象預(yù)告”,name獲得的date就是2023-7-15 17:00。 // 將數(shù)據(jù)存入SQLite數(shù)據(jù)庫 這里是將數(shù)據(jù)存入數(shù)據(jù)庫中,ORM使用的是SQLSugar,類DayUrl如下: internal class DayUrl 最后獲取每一天URL的效果如下所示: 獲取溫度數(shù)據(jù)需要獲取的內(nèi)容如下:
設(shè)計(jì)對應(yīng)的類如下: internal class WeatherData 增加了一個時間,方便以后根據(jù)時間獲取。 獲取溫度數(shù)據(jù)的代碼如下: var list = db.Queryable<DayUrl>().ToList(); |