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.mzph.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.读…