1. 程式人生 > >徹底解決VB.NET獲取網頁原始碼的問題

徹底解決VB.NET獲取網頁原始碼的問題

在解決這個問題之前,我一直很苦惱。在網上到處搜尋,都找不到相應的解決辦法。網上,雖然有提及完全相同的問題的帖子,但是答案最後往往沒有得到發帖人的肯定,或者帖子就此die在論壇中。為了解決我設計網路爬蟲程式所不可迴避的獲取網頁編碼的問題,我克服重重困難,在MSDN的一個帖子中的一個高人的一句話點醒了我。我似乎已經找到了解決問題的辦法,但是後來,發現找到的那種辦法的確可以解決亂碼的問題,但是會出現獲取的網頁不完整的問題。

在我堅韌不拔的意志的支援下,我不停的嘗試,不停的改進,終於設計出了一個可以完全解決此問題的程式碼,在這裡和大家分享,並宣告:不可用於商業目的,僅用於愛好者學習思想。相信大家可以設計出更加好,更加高效的程式。

 Function GetWebCode(ByVal strURL As String) As String
        Dim httpReq As System.Net.HttpWebRequest
        Dim httpResp As System.Net.HttpWebResponse
        Dim httpURL As New System.Uri(strURL)
        Dim ioS As System.IO.Stream, charSet As String, tCode As String
        Dim k() As Byte
        ReDim k(0)
        Dim dataQue As New Queue(Of Byte)
        httpReq = CType(WebRequest.Create(httpURL), HttpWebRequest)
        Dim sTime As Date = CDate("1990-09-21 00:00:00")
        httpReq.IfModifiedSince = sTime
        httpReq.Method = "GET"
        httpReq.Timeout = 7000

        Try
            httpResp = CType(httpReq.GetResponse(), HttpWebResponse)
        Catch
            Debug.Print("weberror")
            GetWebCode = "<title>no thing found</title>" : Exit Function
        End Try
        '以上為網路資料獲取
        ioS = CType(httpResp.GetResponseStream, Stream)
        Do While ioS.CanRead = True
            Try
                dataQue.Enqueue(ioS.ReadByte)
            Catch
                Debug.Print("read error")
                Exit Do
            End Try
        Loop
        ReDim k(dataQue.Count - 1)
        For j As Integer = 0 To dataQue.Count - 1
            k(j) = dataQue.Dequeue
        Next
            '以上,為獲取流中的的二進位制資料
        tCode = Encoding.GetEncoding("UTF-8").GetString(k) '獲取特定編碼下的情況,畢竟UTF-8支援英文正常的顯示
        charSet = Replace(GetByDiv2(tCode, "charset=", """"), """", "") '進行編碼型別識別
            '以上,獲取編碼型別
        If charSet = "" Then 'defalt
            If httpResp.CharacterSet = "" Then
                tCode = Encoding.GetEncoding("UTF-8").GetString(k)
            Else
                tCode = Encoding.GetEncoding(httpResp.CharacterSet).GetString(k)
            End If
        Else
            tCode = Encoding.GetEncoding(charSet).GetString(k)
        End If
        Debug.Print(charSet)
        'Stop
            '以上,按照獲得的編碼型別進行資料轉換
            '將得到的內容進行最後處理,比如判斷是不是有出現字串為空的情況
            GetWebCode = tCode
            If tCode = "" Then GetWebCode = "<title>no thing found</title>"
    End Function
    Function GetByDiv2(ByVal code As String, ByVal divBegin As String, ByVal divEnd As String)  '獲取分隔符所夾的內容[完成,未測試]
        '僅用於獲取編碼資料
        Dim lgStart As Integer
        Dim lens As Integer
        Dim lgEnd As Integer
        lens = Len(divBegin)
        If InStr(1, code, divBegin) = 0 Then GetByDiv2 = "" : Exit Function
        lgStart = InStr(1, code, divBegin) + CInt(lens)

        lgEnd = InStr(lgStart + 1, code, divEnd)
        If lgEnd = 0 Then GetByDiv2 = "" : Exit Function
        GetByDiv2 = Mid(code, lgStart, lgEnd - lgStart)
    End Function

將如上程式碼複製,並引用:

Imports System.Net
Imports System.IO
Imports System.Text.Encoding
Imports System.Text

然後,就可以使用這個程式碼完成網頁原始碼下載的工作了。

歡迎提出改進意見看法。

相關推薦

徹底解決VB.NET獲取網頁原始碼的問題

在解決這個問題之前,我一直很苦惱。在網上到處搜尋,都找不到相應的解決辦法。網上,雖然有提及完全相同的問題的帖子,但是答案最後往往沒有得到發帖人的肯定,或者帖子就此die在論壇中。為了解決我設計網路爬蟲程式所不可迴避的獲取網頁編碼的問題,我克服重重困難,在MSDN的一個帖子中

asp.net C# 獲取網頁原始碼的幾種方式

1 方法 System.Net.WebClient aWebClient = new System.Net.WebClient(); aWebClient.Encoding = System.Text.Encodin

VB獲取網頁數據

div net true asi open ges explicit 信息 cnblogs 以下是在Microsoft Visual Basic 6.0 中文版下做的 VB可以抓取網頁數據,所用的控件是Inet控件。 第一步:單擊工程-->部件 選擇Microsoft

C#/VB.NET 獲取電腦屬性(硬盤ID、硬盤容量、Cpu序列號、MAC地址、系統類型)

mic class network pcm .cn bbb alt OS -h 原文:C#/VB.NET 獲取電腦屬性(硬盤ID、硬盤容量、Cpu序列號、MAC地址、系統類型)在開發過程中,經常需要獲取電腦的一些屬性,如獲取硬盤ID/CPU序列號/MAC地址作為來加密字符串

PHP獲取網頁原始碼最簡單的兩種方法

第一種:curl 廢話不多說,直接上程式碼 //1,獲取curl控制代碼 $ch = curl_init(); // 2. 設定選項,包括URL curl_setopt($ch,CURLOPT_URL,"http://www.baidu.com/"); curl_

Linux獲取網頁原始碼的幾種方法 linux爬蟲程式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Python3 Selenium WebDriver網頁的前進、後退、重新整理、最大化、獲取視窗位置、設定視窗大小、獲取頁面title、獲取網頁原始碼獲取Url等基本操作

Python3 Selenium WebDriver網頁的前進、後退、重新整理、最大化、獲取視窗位置、設定視窗大小、獲取頁面title、獲取網頁原始碼、獲取Url等基本操作 通過selenium webdriver操作網頁前進、後退、重新整理、最大化、獲取視窗位置、設定視窗大小、獲取頁面title、獲取網頁

C#獲取網頁原始碼

/// <summary> /// 獲取網頁原始碼 /// </summary> /// <param name="url"></param> /// <returns></returns> protected string

[Xcode10 實際操作]八、網路與多執行緒-(9)使用非同步Get方式獲取網頁原始碼

本文將演示如何通過Get請求方式,非同步獲取網頁原始碼。 非同步請求與同步請求相比,不會阻塞程式的主執行緒,而會建立一個新的執行緒。 在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 1 import UIKit 2 3 class ViewCont

vb.net 獲取程式執行中的路徑問題

// 獲取程式的基目錄。 System.AppDomain.CurrentDomain.BaseDirectory // 獲取模組的完整路徑。 System.Diagnostics.Process.GetCurrentProcess().MainModule.FileN

[C#]一個簡單的獲取網頁原始碼的函式

獲取網頁原始碼,顯示在richTextBoxWeb中: private void Show_Web() { // 獲取網頁原始碼

asp.net 下載網頁原始碼

//指定下載的檔名 string fileName = "網頁原始碼.txt";//客戶端儲存的檔名 //指定下載的url地址:http://www.baidu.com string url = "http://www.baidu.com"; WebClient client = new W

Python篇----Requests獲取網頁原始碼(爬蟲基礎)

1 下載與安裝 見其他教程。 2 Requsts簡介 Requests is an Apache2 Licensed HTTP library, written inPython, for human beings. Python’s standard urllib2

OKhttp3 get/post使用及獲取網頁原始碼

Okhttp現在已經成為Android開發者的標配,現在我們進行Okhttp基本功能實現,包括get請求,post請求。 首先在AndroidStudio專案中開啟build.gradle(Module:app),然後匯入Okhttp庫 dependencies {

vb.net 獲取程序列表

這個方法肯定不是最好的,查到的資料還有使用程序快照的,但是不知道為什麼vs中不能使用程序的結構體PROCESSENTRY32 Public Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "Creat

ASP程式碼獲取網頁原始碼

在使用ajax的時候,我們無法跨域獲取不屬於自己的伺服器的資料,故引出了這麼一種方法來輾轉獲取: 1、向本域中的網頁請求資料,包含一個網址資訊 2、被請求的本域的網頁中的asp程式碼向跨域的伺服器請求資料,然後返回給本域中的asp檔案 程式碼: Function getH

JS 獲取網頁原始碼

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-type" conte

vb.net 獲取程式執行中的路徑

// 獲取程式的基目錄。 System.AppDomain.CurrentDomain.BaseDirectory // 獲取模組的完整路徑。 System.Diagnostics.Process.GetCurrentProcess().MainModule.FileNam

使用vb.net 獲取資料夾下選中檔案的檔名稱

1. 前言 今天在配置cppunit的附加依賴項的時候, 需要輸入相應的附加依賴項的檔名, 這個很費勁, 我們又不想自己手工一個個的copy, 就希望能夠找到一種方法可以直接獲取到我們的檔名 2. 處理思路 我們這裡想到了vb.net, 利用他的拖拽功

繞過微信客戶端授權,獲取網頁原始碼

首先有人寫出來一個比較不錯的例子,我先貼出來 http://chitanda.me/2015/06/29/debug-wechat-website-in-pc/ 本來想直接連結文字的,結果發現MarkDown這種模式沒找到 但是別人講的情況都是非常基礎的情況,