爬蟲技術 -- 進階學習(七)簡單爬蟲抓取示例(附c#代碼)


這是我的第一個爬蟲代碼。。。算是一份測試版的代碼。大牛大神別噴。。。

通過給定一個初始的地址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過濾就行。

接下來會進一步補充爬蟲抓取的內容。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM