這是我的第一個爬蟲代碼。。。算是一份測試版的代碼。大牛大神別噴。。。
通過給定一個初始的地址startPiont然后對網頁進行捕捉,然后通過正則表達式對網址進行匹配。
List<string> todo :進行抓取的網址的集合
List<string> visited :已經訪問過的網址的集合
下面實現的是,給定一個初始地址,然后進行爬蟲,輸出正在訪問的網址和已經訪問的網頁的個數。
需要注意的是,下面代碼實現的鏈接匹配頁面的內容如圖一、圖二所示:
- 圖一:
- 圖二:
簡單代碼示范如下:(測試版)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Web.Security; using System.IO; using System.Net; using System.Text.RegularExpressions; using System.Web; namespace Demo1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Test1 a = new Test1(); a.getCurrentURL(); } public class Test1 { List<string> todo = new List<string>(); List<string> visited = new List<string>(); string startPoint = "http://www.cnblogs.com/lmei/";
public void getCurrentURL() { RequestSite(startPoint); while (todo.Count > 0)
{ string currentURL = todo[0]; RequestSite(currentURL); if (visited.Contains(currentURL)) //注釋1 { Console.WriteLine("已經訪問過了" + currentURL); todo.Remove((currentURL)); } else { Console.WriteLine("現在正在訪問:===> " + currentURL); visited.Add(currentURL); Console.WriteLine("目前已經訪問了:===> " + visited.Count + "個網頁" ); todo.Remove((currentURL)); } } } public void RequestSite(string url) { WebRequest req = WebRequest.Create(url); HttpWebResponse res; try{ res = (HttpWebResponse)(req.GetResponse()); } catch (WebException ex) { res = (HttpWebResponse)ex.Response; } Stream st = res.GetResponseStream(); StreamReader rdr = new StreamReader(st); string s = rdr.ReadToEnd(); todo.AddRange(GetLink(s)); } List<string> GetLink(string htmlPage) { Regex regx = new Regex("http://www\\.cnblogs\\.com\\/lmei\\/p\\/[0-9a-zA-Z]+\\.html*" ,RegexOptions.IgnoreCase); MatchCollection matches = regx.Matches(htmlPage); List<string> results = new List<string>(); foreach (Match match in matches) { if (!visited.Contains(match.Value)) //注釋2 { results.Add(match.Value); } } return results; } } } }
注釋1 :是將已經訪問過的網址排除。
注釋2 :是將已經訪問過的網址排除,但是可能由於同個網頁中包含的兩個(或兩個以上)相同的鏈接,而且都沒被訪問過的,這樣使得todo隊列中會有相同的網址,所以需要注釋1那部分進行再次過濾排除。其實也可以將注釋2那部分刪去,直接讓注釋1過濾就行。
接下來會進一步補充爬蟲抓取的內容。。。