1. 程式人生 > >c#關於網頁內容抓取,簡單爬蟲的實現。(包括動態,靜態的)

c#關於網頁內容抓取,簡單爬蟲的實現。(包括動態,靜態的)

整理一下最近做的幾個專案。總結幾個用到的知識點和關鍵部分程式碼,以供大家學習交流。
1、爬蟲抓取網頁內容資訊。可以用System.Net.WebRequest、webclient等類來處理。
2、對於某些動態網頁,生成頁面信心由javascript動態生成連結資訊的。也可以進行分析傳值的方式,在post的時候將引數帶進去(大多數網站的引數是有規則的)。實在不行也可以使用webbrowser控制元件,模擬點選。或傳值。
http://www.aslan.com.cn/Code.aspx網站為例。
部分程式碼如下:

//使用webbrowser訪問指定網頁。address為網頁地址

 private void Navigate(WebBrowser web,String address)
        {
            if (String.IsNullOrEmpty(address)) return;
            if (address.Equals("about:blank")) return;
            if (!address.StartsWith("http://")) address = "http://" + address;
            try
            {
                web.Navigate(new Uri(address));
            }
            catch (System.UriFormatException)
            {
                return;
            } 

        }

由於要抓取網頁內容及在載入完畢後提交引數所以需要驗證載入完畢即DocumentCompleted。而在實際使用過程當中,發現在一個頁面的載入過程中可能會有多次DocumentCompleted,所以在這裡採用+1、-1的方式來判斷是否載入完畢。

首先在formload中繫結網頁載入完畢事件。

   private void getCode3webBrowser_Load(object sender, EventArgs e)
        {

            string address = "http://www.aslan.com.cn/Code.aspx";
            this.Navigate(webBrowser1, address);   
            webBrowser1.Navigated += new WebBrowserNavigatedEventHandler(webBrowser_Navigated);
            webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
        }

並且定義標示count

 int count = 0;
然後在每次導航後給標示+1
private void webBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            count++;
        }

在每次DocumentCompleted中給count-1,最後當count=0時即表示頁面載入完畢。可以進行對頁面資訊的處理等操作了。

    private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)         {             count = count - 1;             string eventTarget = "dg_Code$ctl24$ctl";                         if (0 == count && isComplete == false && j<=10)             {                 eventTarget = eventTarget + getPage(j);                 if (!isLastPage(webBrowser1))                 {                     InvokeScriptMethod(webBrowser1, eventTarget, "");                 }                 else                 {                     MessageBox.Show("抓取完畢");                 }                     postComplete = true;                     j++;                                  }             else if (postComplete == true)             {                 dealWithByDOM(webBrowser1);                 postComplete = false;             }             else if (0 == count && isComplete)             {                System.Windows.Forms.HtmlDocument  htdoc = webBrowser1.Document;                 for (int i = 0; i < htdoc.All.Count; i++)                 {                     if (htdoc.All[i].Name == "btn_search")                     {                         htdoc.All[i].InvokeMember("click");//引發”CLICK”事件                         isComplete = false;                         break;                     }                 }             }                     }                  

剩下的就是對html的分析,如何在茫茫多的html程式碼中找到我們需要的資訊呢?在這裡我是通過HtmlAgilityPack類來處理html內容提取的。

其中HtimlAgilityPack類是codeplex上的提供的一個類,下載地址http://htmlagilitypack.codeplex.com/用來處理html檔案還是非常不錯的(個人感覺挺好用)

 private void dealWithByDOM(WebBrowser webBro)
        {
            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();

            htmlDoc.LoadHtml(webBro.DocumentText);
            HtmlNode Node1 = htmlDoc.GetElementbyId("dg_Code_ctl03_Label5");
            HtmlNode Node2 = htmlDoc.GetElementbyId("dg_Code_ctl03_Label6");
            HtmlNode Node3 = htmlDoc.GetElementbyId("dg_Code_ctl03_Label7");
            HtmlNode Node4 = htmlDoc.GetElementbyId("dg_Code_ctl03_Label8");
            HtmlNode Node5 = htmlDoc.GetElementbyId("dg_Code_ctl03_Label9");
         
            DataRow dr = dt_finallyResult.NewRow();
            dr["三字碼"] = Node1.InnerText;
            dr["城市碼"] = Node2.InnerText;
            dr["城市中文名"] = Node3.InnerText;
            dr["城市英文名"] = Node4.InnerText;
            dr["國家"] = Node5.InnerText;
            dt_finallyResult.Rows.Add(dr);
            dataGridView1.DataSource = dt_finallyResult;
        }

以上就是該程式的部分實現程式碼。最後效果圖如下:(不過不到萬不得已最好不要使用webbrowser的方式做爬蟲,它的速度太慢了,我要抓取的資訊只有286頁,可是花了我將近10分鐘的時間)

下面是程式執行效果圖:(為了展示方便,左邊為webBrowser控制元件導航到目標網站的結果,右邊dataGridview為抓取後經過提取的所需資訊。)


 

相關推薦

c#關於網頁內容簡單爬蟲實現包括動態靜態

整理一下最近做的幾個專案。總結幾個用到的知識點和關鍵部分程式碼,以供大家學習交流。 1、爬蟲抓取網頁內容資訊。可以用System.Net.WebRequest、webclient等類來處理。 2、對於某些動態網頁,生成頁面信心由javascript動態生成連結資訊的。也可以

跳一跳輔助工具的原理分析和Java實現其實沒那麼複雜

一、前言(Java程式碼的實現是基於另外一篇部落格,我精簡了計算方法而成,參考部落格地址http://blog.csdn.net/lihushiwoa/article/details/78942322)先說一說我的感受,之前覺得能做出做出輔助工具的技術要求一定很高,然而當自己

Python3學習(34)--簡單網頁內容爬蟲入門一

基礎講多了也不好,懂的人看了煩躁,半懂的人看多了沒耐心,我也不能打消了你們學習Python的積極性了,開始爬蟲系列基礎篇之前,先上一張圖,給大腦充充血: 很多人,學習Python,無非兩個目的,

二.爬蟲:Python三種網頁內容方法

使用 Beautiful Soup 解析 html 檔案 #!/usr/bin/pytho

【PHP-網頁內容網頁內容的兩種常用方法

說到網頁內容的抓取,最常用的兩種方式: 1.利用file_get_contents()函式,簡簡單單; 2.CURL抓取工具。CURL是一個非常強大的開源庫,支援很多協議,包括HTTP、FTP、TEL

自己定義View時用到Paint Canvas的一些溫故簡單的幀動畫動畫一 &quot;掏糞男孩Gif&quot;順便再提提onWindowFocusChanged

eat android 內容 rri generated 簡單的 fadein spl onclick 轉載請註明出處:王亟亟的大牛之路 之前在繪畫的過程中提到了靜態的旋轉啊,縮放啊,平移等一些效果。那麽自己定義的View當然也有動態的效果也就是我們的

C語言 單鏈表實現佇列初始化入隊出隊元素個數隊首元素是否為空

單鏈表實現佇列: 連結串列為空的判斷條件:pQueue->pFront==pQueue->pRear或者若結構體中存在數的個數時,判斷pQueue->size==0,即元素個數為0 標頭檔案:佇列.h #pragma once #include<

C#LeetCode刷題之#225-用佇列實現Implement Stack using Queues

問題 使用佇列實現棧的下列操作: push(x) -- 元素 x 入棧 pop() -- 移除棧頂元素 top() -- 獲取棧頂元素 empty() -- 返回棧是否為空 注意: 你只能使用佇列的基本操作-- 也就是 push to back, peek/pop f

簡述 fbprophetPyStan庫安裝win10-64位系統

fbprophet依賴於PyStan,所以首先要安裝PyStan庫,而要安裝PyStan,首先要安裝C++編譯器 在自己剛用到的時候首先百度了下發現好多坑,試了很多百度的方法還是不行。  本人是win10-64位系統,使用的是Python3.7的Anaconda。廢話不說了,開始安

SSM框架開發專案--用到的註解記錄及詳解先記錄後研究再總結---未完

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) //保證序列化json的時候,如果是null的物件,key也會消失 public c

給一個字串有大小寫字母要求寫一個函式把小寫字母放在前面 大寫字母放在後面儘量使用最小空間時間複雜度即用指標做 如:aAbBcCdD ---àabcdABCD

#include <stdlib.h> int SmallToCaptial( char *str, char *outbuf ) {char *p = str;if (str == NULL || outbuf == NULL){return -1;}while (*p){if (*p >

win864位下安裝PythonPyQt4和Sip最終失敗只做記錄

樓主因為業務需求需要做一個爬蟲,在網上爬蟲主要使用python,於是就進行了環境的搭建,安裝python2.7本身沒有遇到困難。相反,在安裝pyQT的時候,遇到了一些問題,網上主流的聲音是在linux端進行配置和安裝,windows端的較少,windows64位端的更少,筆

android 開發--網頁解析網頁內容的若干方法(網路爬蟲)正則表示式

網頁有兩種格式,一種是xml另一種是html,目前似乎好像大部分都是html格式的,檢視網頁格式的方法是在瀏覽器中右鍵-->檢視原始碼 一,XML解析的三大方法 (1) SAX: Simple API for XML SAX是一個解析速度快並且佔用記憶體少的XML解析

爬蟲如何對網頁動態內容

我們進入淘寶網,在首頁檢視原始碼 可以看到全是js,並沒有直觀的頁面元素,因為首頁的內容都是動態生成的,這時候我們就需要對網頁的連結做一些分析了。 現在我想爬取淘寶網上所有關於Ipad的資訊,那麼現在首頁的搜尋框輸入‘Ipad’ 檢視連結得到 h

.net使用webBrowser爬頁面標籤內容簡單爬蟲的幾個關鍵方法

在.net中 可能會碰到需要使用webBrowser進行網頁標籤的操作的情況,下面介紹幾個常用方法,僅供參考 特別說明wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)需要給

Golang 簡單爬蟲實現小說

為什麼要使用Go寫爬蟲呢? 對於我而言,這僅僅是練習Golang的一種方式。 所以,我沒有使用爬蟲框架,雖然其很高效。 為什麼我要寫這篇文章? 將我在寫爬蟲時找到資料做一個總結,希望對於想使用Golang寫爬蟲的你能有一些幫助。 爬蟲主要需要解決兩個問題: 獲取網頁 解析網頁 如果這

爬蟲入門爬蟲簡單的入門庫Beautifulsoup庫,解析網頁簡單用法-案例篇5

           BeautifulSoup 庫是一個非常流行的Python的模組。通過BeautifulSoup 庫可以輕鬆的解析請求庫請求的網頁,並把網頁原始碼解析為湯文件,以便過濾提取資料

爬蟲入門酷狗歌單top500簡單爬蟲案例

import requests from bs4 import BeautifulSoup import time headers = { 'User-Agent': 'Mozilla/5.0

PyhtonBOSS直聘職位描述和資料清洗簡單沒有那麼難

一、抓取詳細的職位描述資訊 詳情頁分析 Python學習資料或者需要程式碼、視訊加Python學習群:960410445   在詳情頁中,比較重要的就是職位描述和工作地址這兩個 由於在頁面程式碼中崗位職責和任職要求是在一個 div 中的,所以在抓的時候就不太好分,

python爬蟲新浪科技的文章beautifulsoup+mysql

這幾天的辛苦沒有白費,總算完成了對新浪科技的文章抓取,除非沒有新的內容了,否則會一直爬取新浪科技的文章。 想了解更多可以關注我的github:https://github.com/libp/WebSpider 如果想要資料庫表結構可以留下郵箱~ # -*- coding: