ASP.NET 抓取網頁內容

(轉)ASP.NET 抓取網頁內容

ASP.NET 抓取網頁內容-文字

?

ASP.NET 中抓取網頁內容是非常方便的,而其中更是解決了 ASP 中困擾我們的編碼問題。

需要三個類:WebRequest、WebResponse、StreamReader。

WebRequest、WebResponse?的名稱空間是:

System.Net

StreamReader?的名稱空間是:

System.IO

核心代碼

WebRequest request = WebRequest.Create("http://www.cftea.com/");
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"));

?

  • WebRequest 類的 Create 為靜態方法,參數為要抓取的網頁的網址;
  • Encoding 指定編碼,Encoding 中有屬性 ASCII、UTF32、UTF8 等全球通用的編碼,但沒有 gb2312 這個編碼屬性,所以我們使用 GetEncoding 獲得 gb2312 編碼。

示例

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.IO" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">void Page_Load(object sender, EventArgs e){try{WebRequest request = WebRequest.Create("http://www.cftea.com/");WebResponse response = request.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"));tb.Text = reader.ReadToEnd();reader.Close();reader.Dispose();response.Close();}catch (Exception ex){tb.Text = ex.Message;}}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"><title>抓取網頁內容 - 千一網絡</title>
</head>
<body><form id="form1" runat="server"><div><asp:TextBox ID="tb" runat="server" Width="500" Height="300" TextMode="multiLine"></asp:TextBox></div></form>
</body>
</html>

?

ASP.NET 抓取網頁內容-圖片

?

本文不僅適用于圖片,同樣實用于其它二進制文件。

需要四個類:WebRequest、WebResponse、Stream、FileStream。

WebRequest、WebResponse?的名稱空間是:

System.Net

Stream、FileStream?的名稱空間是:

System.IO

核心代碼

WebRequest request = WebRequest.Create("http://www.cftea.com/images/logo.gif");
WebResponse response = request.GetResponse();
Stream reader = response.GetResponseStream();FileStream writer = new FileStream("D:\\logo.gif", FileMode.OpenOrCreate, FileAccess.Write);
byte[] buff = new byte[512];
int c = 0; //實際讀取的字節數
while ((c=reader.Read(buff, 0, buff.Length)) > 0)
{writer.Write(buff, 0, c);
}
writer.Close();

?

注意類 Stream,不是 StreamReader。

示例

ASP.NET 抓取網頁內容-Post 數據

?

在抓取網頁時,有時候,需要將某些數據通過 Post 的方式發送到服務器,將以下代碼添加在網頁抓取的程序中,以實現將用戶名和密碼 Post 到服務器:

string data = "userName=admin&passwd=admin888";
byte[] requestBuffer = System.Text.Encoding.GetEncoding("gb2312").GetBytes(data);
?
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = requestBuffer.Length;
using (Stream requestStream = request.GetRequestStream())
{
??? requestStream.Write(requestBuffer, 0, requestBuffer.Length);
??? requestStream.Close();
}
?
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312")))
{
??? string str = reader.ReadToEnd();
??? reader.Close();
}

以上是以編碼 gb2312 為例。

?

ASP.NET 抓取網頁內容-防止重定向

?

在抓取網頁時,成功登錄服務器應用系統后,應用系統可能會通過 Response.Redirect 將網頁進行重定向,如果不需要響應這個重定向,那么,我們就不要把 reader.ReadToEnd() 給 Response.Write 出來,就可以了。

?

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.IO" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">void Page_Load(object sender, EventArgs e){try{WebRequest request = WebRequest.Create("http://www.cftea.com/images/logo.gif");WebResponse response = request.GetResponse();Stream reader = response.GetResponseStream();FileStream writer = new FileStream("D:\\logo.gif", FileMode.OpenOrCreate, FileAccess.Write);byte[] buff = new byte[512];int c = 0; //實際讀取的字節數while ((c=reader.Read(buff, 0, buff.Length)) > 0){writer.Write(buff, 0, c);}writer.Close();writer.Dispose();reader.Close();reader.Dispose();response.Close();tb.Text = "保存成功!";}catch (Exception ex){tb.Text = ex.Message;}}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"><title>抓取網頁圖片并保存 - 千一網絡</title>
</head>
<body><form id="form1" runat="server"><div><asp:TextBox ID="tb" runat="server" Width="500" Height="300" TextMode="multiLine"></asp:TextBox></div></form>
</body>
</html>

?

?

ASP.NET 抓取網頁內容-保持登錄狀態

?

利用 Post 數據成功登錄服務器應用系統后,就可以抓取需要登錄的頁面了,那么我們就可能需要在多個 Request 間保持登錄狀態。

首先,我們要使用 HttpWebRequest,而不是 WebRequest。

與 WebRequest 相比,變化的代碼是:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);

注意:HttpWebRequest.Create 返回的類型仍是 WebRequest,所以要轉化一下。

其次,使用 CookieContainer。

System.Net.CookieContainer cc = new System.Net.CookieContainer();
request.CookieContainer = cc;
request2.CookieContainer = cc;

這樣 request 和 request2 之間就使用了相同的 Session,如果 request 登錄了,那么 request2 也是登錄狀態。

最后,如何在不同的頁面間使用同一個 CookieContainer。

要在不同的頁面間使用同一個 CookieContainer,只有把 CookieContainer 加入 Session。

Session.Add("ccc", cc); //存
?
CookieContainer cc = (CookieContainer)Session["ccc"]; //取

?

?

ASP.NET 抓取網頁內容-把當前會話帶到 WebRequest 中

?

比如說瀏覽器 B1 去訪問服務器端 S1,這會產生一個會話,而服務器端 S2 再用 WebRequest 去訪問服務器端 S1,這又會產生一個會話。現在的需求是讓 WebRequest 使用瀏覽器 B1 與 S1 之間的會話,也就是說要讓 S1 認為是 B1 在訪問 S1,而不是 S2 在訪問 S1。

這就要利用 Cookie 了,先在 S1 中取得與 B1 的?SessionID 的?Cookie,再將這個 Cookie 告訴 S2,S2 再將 Cookie 寫在 WebRequest 中。

WebRequest request = WebRequest.Create("url");
request.Headers.Add(HttpRequestHeader.Cookie, "ASPSESSIONIDSCATBTAD=KNNDKCNBONBOOBIHHHHAOKDM;");
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));
Response.Write(reader.ReadToEnd());
reader.Close();
reader.Dispose();
response.Close();

?

要說明的是:

  • 本文并不是 Cookie 欺騙,因為 SessionID 是 S1 告訴 S2 的,并不是 S2 竊取的,雖然有些古怪,但這可能在一些特定的應用系統中會有用。
  • S1?必須要向 B1 寫?Session,這樣 SessionID 才會保存到 Cookie 中,并且 SessionID 才會保持不變。
  • 在 ASP.NET 中取 Cookie 用 Request.Cookies,本文假設 Cookie 已經取出來。
  • 不同的服務器端語言,SessionID 在 Cookie 中上名稱并不一樣,本文是 ASP 的 SessionID。
  • S1 可能不僅僅依靠 SessionID 來判斷當前登錄,它可能還會輔助于 Referer、User-Agent 等,這取決于 S1 端程序的設計。
  • 其實本文算是本連載中“保持登錄狀態”的另一種方法。

?

?

ASP.NET 抓取網頁內容-如何更改來源 Referer 和 UserAgent

?


?

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://127.0.0.1/index.htm");
//request.Headers.Add(HttpRequestHeader.Referer, "http://www.cftea.com/"); // 錯誤
//request.Headers[HttpRequestHeader.Referer] = "http://www.cftea.com/"; // 錯誤
request.Referer = "http://www.cftea.com/"; // 正確

?

注釋掉的兩句是不對的,會發生錯誤:

此標頭必須使用適當的屬性進行修改。
參數名: name

UserAgent 類似。

轉載于:https://www.cnblogs.com/shide/p/3394980.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377642.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode 53. 最大子序和 動態規劃解法、貪心法以及二分法

題目 給定一個整數數組 nums &#xff0c;找到一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4] 輸出: 6 解釋: 連續子數組 [4,-1,2,1] 的和最大&#xff0c;為 6。 進階: 如果你…

四、卷積神經網絡(Convolution Neural Networks)

一、CNN(Convolution Neural Networks) 卷積神經網絡基本思想&#xff1a;識別物體的特征&#xff0c;來進行判斷物體 卷積Convolution&#xff1a;過濾器filter中的數值與圖片像素值對應相乘再相加&#xff0c;6 * 6卷積一次(步數為1)變成4 * 4 Max Pooling&#xff1a;對卷積…

POJ3096Surprising Strings(map)

題意&#xff1a;輸入很多字符串&#xff0c;以星號結束。判斷每個字符串是不是“Surprising Strings”&#xff0c;判斷方法是&#xff1a;以“ZGBG”為例&#xff0c;“0-pairs”是ZG&#xff0c;GB&#xff0c;BG&#xff0c;這三個子串不相同&#xff0c;所以是“0-unique”…

vs助手使用期過 編譯CEGUI的問題:error C2061: 語法錯誤: 標識符“__RPC__out_xcount_part” VS2010...

第一個問題&#xff0c;下一個破解版的VX_A.dll&#xff0c;將其覆蓋以前的dll即可&#xff0c; 但是目錄有所要求&#xff0c;如下&#xff1a; XP系統&#xff1a;系統盤\Documents and Settings\用戶名\Local Settings\Application win7或者vistaData\Microsoft\VisualStud…

五、項目實戰---識別人和馬

一、準備訓練數據 下載數據集 validation驗證集 train訓練集 數據集結構如下&#xff1a; 將數據集解壓到自己選擇的目錄下就行 最后的結構效果如下&#xff1a; 二、構建模型 ImageDataGenerator 真實數據中&#xff0c;往往圖片尺寸大小不一&#xff0c;需要裁剪成一樣…

leetcode 122. 買賣股票的最佳時機 II 思考分析

目錄題目貪心法題目 給定一個數組&#xff0c;它的第 i 個元素是一支給定股票第 i 天的價格。 設計一個算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易&#xff08;多次買賣一支股票&#xff09;。 注意&#xff1a;你不能同時參與多筆交易&#xff08;你必…

css設置a連接禁用樣式_使用CSS禁用鏈接

css設置a連接禁用樣式Question: 題&#xff1a; Links are one of the most essential aspects of any web page or website. They play a very important role in making our website or web page quite responsive or interactive. So the topic for discussion is quite pe…

服務器出現 HTTP 錯誤代碼,及解決方法

HTTP 400 - 請求無效 HTTP 401.1 - 未授權&#xff1a;登錄失敗 HTTP 401.2 - 未授權&#xff1a;服務器配置問題導致登錄失敗 HTTP 401.3 - ACL 禁止訪問資源 HTTP 401.4 - 未授權&#xff1a;授權被篩選器拒絕 HTTP 401.5 - 未授權&#xff1a;ISAPI 或 CGI 授權失敗 HTTP 40…

leetcode 55. 跳躍游戲 思考分析

題目 給定一個非負整數數組&#xff0c;你最初位于數組的第一個位置。 數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個位置。 示例1&#xff1a; 輸入: [2,3,1,1,4] 輸出: true 解釋: 我們可以先跳 1 步&#xff0c;從位置 0 到達 位置 1…

六、項目實戰---識別貓和狗

一、準備數據集 kagglecatsanddogs網上一搜一大堆&#xff0c;這里我就不上傳了&#xff0c;需要的話可以私信 導包 import os import zipfile import random import shutil import tensorflow as tf from tensorflow.keras.optimizers import RMSprop from tensorflow.kera…

修改shell終端提示信息

PS1&#xff1a;就是用戶平時的提示符。PS2&#xff1a;第一行沒輸完&#xff0c;等待第二行輸入的提示符。公共設置位置:/etc/profile echo $PS1可以看到當前提示符設置例如&#xff1a;顯示綠色&#xff0c;并添加時間和shell版本export PS1"\[\e[32m\][\uyou are right…

java 字謎_計算字謎的出現次數

java 字謎Problem statement: 問題陳述&#xff1a; Given a string S and a word C, return the count of the occurrences of anagrams of the word in the text. Both string and word are in lowercase letter. 給定一個字符串S和一個單詞C &#xff0c;返回該單詞在文本…

Origin繪制熱重TG和微分熱重DTG曲線

一、導入數據 二、傳到Origin中 三、熱重TG曲線 temp為橫坐標、mass為縱坐標 繪制折線圖 再稍微更改下格式 字體加粗&#xff0c;Times New Roman 曲線寬度設置為2 橫縱坐標數值格式為Times New Roman 根據實際情況改下橫縱坐標起始結束位置 四、微分熱重DTG曲線 點擊曲線…

【嵌入式系統復習】嵌入式網絡與協議棧

目錄開放式系統互連模型總線通信的報文組形式以及傳遞方式報文組形式報文傳遞方式網絡分配與調度嵌入式TCP/IP藍牙技術藍牙的節能狀態糾錯方案藍牙協議棧開放式系統互連模型 ISO/OSI七層模型展示了網絡結構與各層的功能。 應用層&#xff1a; 提供了終端用戶程序和網絡之間的應…

代碼兼容、技巧

代碼兼容、技巧 前端開發中&#xff0c;一個頭疼的事&#xff0c;就是代碼的不兼容&#xff0c;這里貼出自己在前端開發中的一些解決經驗。除了其瀏覽器本身的BUG外&#xff0c;不建議使用CSS hack來解決兼容性問題的。 IE和FF下對”li“的的高度解析不同 可以不定義高度&#…

Windows Phone 7 自定義事件

在Windows Phone的應用開發里面&#xff0c;對于事件這種東西我們可以隨處可見&#xff0c;系統本來就已經封裝好了各種各樣的事件機制&#xff0c;如按鈕的單擊事件等等的。在實際的開發中&#xff0c;我們需要自己去給相關的類自定義一些事件來滿足業務的要求&#xff0c;特別…

getcwd函數_PHP getcwd()函數與示例

getcwd函數PHP getcwd()函數 (PHP getcwd() function) The full form of getcwd is "Get Current Working Directory", the function getcwd() is used to get the name of the current working directory, it does not accept any parameter and returns the curren…

十四、數據庫的導出和導入的兩種方法

一、以SQL腳本格式導出&#xff08;推薦&#xff09; 導出 右擊需要導出的數據庫&#xff0c;任務—>生成腳本 下一步 選擇要導出的數據庫&#xff0c;下一步 內容根據需求修改&#xff0c;沒啥需求直接下一步 勾選 表 勾選需要導出的數據庫中的表 選擇腳本保存的路…

Apache中 RewriteCond 規則參數介紹

RewriteCond就像我們程序中的if語句一樣&#xff0c;表示如果符合某個或某幾個條件則執行RewriteCond下面緊鄰的RewriteRule語句&#xff0c;這就是RewriteCond最原始、基礎的功能&#xff0c;為了方便理解&#xff0c;下面來看看幾個例子。RewriteEngine onRewriteCond %{HTT…

【C++grammar】文件I/O流的基本用法

目錄1、輸入輸出類介紹1.C/C文件操作對比2.什么是流&#xff1f;3.C I/O流類層次4.帶緩沖的輸入輸出5.gcc編譯器cin.in_avail()2、向文件寫入數據1.寫文件小練習2.如何將信息同時輸出到文件和屏幕&#xff1f;3、從文件讀數據1.檢測文件是否成功打開2.檢測是否已到文件末尾3.讀…