徹底解決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這種模式沒找到 但是別人講的情況都是非常基礎的情況,