日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET Core玩转爬虫系列之借助正则表达式入门篇

發布時間:2023/12/4 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core玩转爬虫系列之借助正则表达式入门篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

接下來一段時間,我會花些時間研究C#玩轉爬蟲的方法及其實踐。

話不多說,開始吧~

一般來說:

設計并實現一個爬蟲的步驟是:

模擬登錄 -> 模擬發送request請求 -> 取回response數據 -> 提取所需信息并將其進行重新組織 -> 存入DB或文件中 -> 后期處理或展示

流程圖

當然,有時還需要適當地應對所抓取目標站點的反爬蟲策略,也就是大家常說的反反爬!

下文以抓取豆瓣音樂為例來具體說明:

比如,我們在豆瓣音樂中搜索"搖滾"后爬取相關內容,然后寫入csv文件中。

目標網址是:

https://music.douban.com/tag/搖滾?start=0&type=T

抓取大概分為如下幾個步驟:

獲取頁數

  • 發請求

每一頁中都可以看到總的頁數,直接取第1頁的就好。

byte[] buffer = webclient.DownloadData("https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=0&type=T");// utf-8, gb2312, gbk, utf-1......string html = System.Text.Encoding.GetEncoding("utf-8").GetString(buffer);

借助以上兩行代碼,就可以看到該網址Response的HTML字符串(debug時上面一行代碼中html的值)為:

  • 使用正則表達式匹配到頁數

我們選用模式串?">[0-9][0-9]{0,}</a>"?進行匹配,由于下面的頁碼是從第一頁算起的,選最大頁數就是總頁數。

相應的函數GetTotalCount如下:

private static int GetTotalCount(System.Net.WebClient webclient, int startIdx){//html下載/* https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=0&amp;type=T */byte[] buffer = webclient.DownloadData("https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=" + startIdx + "&amp;type=T");// utf-8, gb2312, gbk, utf-1......string html = System.Text.Encoding.GetEncoding("utf-8").GetString(buffer);MatchCollection pageCount_matches = new Regex("&gt;[0-9][0-9]{0,}&lt;/a&gt;").Matches(html);if (pageCount_matches.Count == 0)return 0;string tempPageNum = pageCount_matches[pageCount_matches.Count - 1].Value;int.TryParse(tempPageNum.Replace("&lt;/a&gt;", string.Empty).Substring(1), out int lastPageNum);return lastPageNum;}

獲取當前頁的數據

  • 發請求

用與上一步相同的方法

byte[] buffer = webclient.DownloadData("https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=0&amp;type=T");// utf-8, gb2312, gbk, utf-1...... string html = System.Text.Encoding.GetEncoding("utf-8").GetString(buffer);

debug時可得到當前頁對應的HTML字符串:

  • 使用正則表達式匹配到每一天記錄

我們選用模式串?"<p class=\"pl\">([\\s\\S]*?)</p>"?進行匹配,可得到如下格式的內容:

刺猬 / 2018-01-08 / 單曲 / 數字(Digital) / 搖滾,

接著進行split可得到一個記錄的各個屬性。

具體的函數GetCurrentPageRecords如下:

private static void GetCurrentPageRecords(System.Net.WebClient webclient, int startIdx){byte[] buffer = webclient.DownloadData("https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=" + startIdx + "&amp;type=T");// utf-8, gb2312, gbk, utf-1......string html = System.Text.Encoding.GetEncoding("utf-8").GetString(buffer);// Console.WriteLine(html);// html分析// 通過正則獲取到需要的數據// &lt;p class="pl"&gt;刺猬 / 2018-01-08 / 單曲 / 數字(Digital) / 搖滾&lt;/p&gt;MatchCollection musicItem_matches = new Regex("&lt;p class=\"pl\"&gt;([\\s\\S]*?)&lt;/p&gt;").Matches(html);int count = musicItem_matches.Count;for (int i = 0; i &lt; count; i++){string item = musicItem_matches[i].Result("$1");string[] strArr = item.Trim().Split('/');Record record = new Record{SongName = strArr[0],Date = strArr.ElementAtOrDefault(1),Album = strArr.ElementAtOrDefault(2),Type = strArr.ElementAtOrDefault(3),Topic = strArr.ElementAtOrDefault(4)};_records.Add(record);}}

獲取所有頁的數據

  • 循環修改url中start的值

https://music.douban.com/tag/搖滾?start=0&type=T

第一頁的start=0,每頁20條,于是后面每一頁的start是前一頁start的值+20

  • 發請求

  • 將每頁的數據加入到Array或List中

寫入csv

  • 在VS的NuGet包管理器中為當前項目引入CSVHelper.

  • 將一條記錄封裝成一個類Record

Record.cs

using System; using System.Collections.Generic; using System.Text;namespace CsSpider {public class Record{public string SongName { get; set; }public string Date { get; set; }public string Album { get; set; }public string Type { get; set; }public string Topic { get; set; }} }// 舉例: 萬能青年旅店 / 2010-11-12 / 專輯 / CD / 搖滾
  • 使用CSVHelper把獲得的所有數據寫入到csv中

if (_records.Count &gt; 0){var writer = new StreamWriter(_filename);using (var csv = new CsvWriter(writer)){csv.WriteRecords(_records);Console.WriteLine("導出完成.");}}

解決亂碼問題

只需要給上述writer設置Encoding即可~

if (_records.Count &gt; 0){var writer = new StreamWriter(_filename, false, System.Text.Encoding.UTF8); // 設置Encoding,防止亂碼using (var csv = new CsvWriter(writer)){csv.WriteRecords(_records);Console.WriteLine("導出完成.");}}

運行結果

最后得到的CSV文件如下:

接下來,會發現一個問題:

如果多執行幾次,前面的HTML字符串會變成下面這種內容:

&lt;script&gt;var d=[navigator.platform,navigator.userAgent,navigator.vendor].join("|");window.location.href="https://sec.douban.com/a?c=3d001f&amp;d="+d+"&amp;r=https%3A%2F%2Fmovie.douban.com%2Fsubject%2F26590960%2F";&lt;/script&gt;

說明此時,你觸發了豆瓣的反作弊功能。如果再多執行幾次,會出現 403 Error.

解決辦法是模擬登錄,這個留在下一篇文章再說,敬請關注!

CsSpider · yanglr/csharp_spiderhttps://github.com/yanglr/csharp_spider/tree/master/spider-test/CsSpider

歡迎star、fork或拉取使用和研究!!!

你點的每一個"在看"

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?我都當成了喜歡!

總結

以上是生活随笔為你收集整理的.NET Core玩转爬虫系列之借助正则表达式入门篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。