代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Asp.Net
】
抓取网页内容
作者:
汶妍
/ 发布于
2015/4/16
/
641
ASP.NET 中抓取网页内容是非常方便的,而其中更是解决了 ASP 中困扰我们的编码问题。 1、抓取一般内容 需要三个类:WebRequest、WebResponse、StreamReader 所需命名空间:System.Net、System.IO 核心代码: WebRequest 类的 Create 为静态方法,参数为要抓取的网页的网址; Encoding 指定编码,Encoding 中有属性 ASCII、UTF32、UTF8 等全球通用的编码,但没有 gb2312 这个编码属性,所以我们使用 GetEncoding 获得 gb2312 编码。 [csharp] view plaincopy在CODE上查看代码片派生到我的代码片 <span style="font-size:18px;">private string GetGeneralContent(string strUrl) { string strMsg = string.Empty; try { WebRequest request = WebRequest.Create(strUrl); WebResponse response = request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312")); strMsg = reader.ReadToEnd(); reader.Close(); reader.Dispose(); response.Close(); } catch { } return strMsg; }</span> 2、抓取图片或其它二进制文件(如文件) 需要四个类:WebRequest、WebResponse、Stream、FileStream 所需命名空间:System.Net、System.IO 核心代码:用Stream读取 [csharp] view plaincopy在CODE上查看代码片派生到我的代码片 <span style="font-size:18px;">private string GetFileContent(string strUrl) { string strMsg = string.Empty; try { WebRequest request = WebRequest.Create(strUrl); 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(); strMsg = "保存成功"; } catch { } return strMsg; }</span> 3、抓取网页内容 POST方式 在抓取网页时,有时候,需要将某些数据通过 Post 的方式发送到服务器,将以下代码添加在网页抓取的程序中,以实现将用户名和密码 Post 到服务器: [csharp] view plaincopy在CODE上查看代码片派生到我的代码片 <span style="font-size:18px;">private string GetPostContent(string strUrl) { string strMsg = string.Empty; try { string data = "userName=admin&passwd=admin888"; byte[] requestBuffer = System.Text.Encoding.GetEncoding("gb2312").GetBytes(data); WebRequest request = WebRequest.Create(strUrl); 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(); } WebResponse response = request.GetResponse(); using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"))) { strMsg = reader.ReadToEnd(); reader.Close(); } } catch { } return strMsg; }</span> 4、ASP.NET 抓取网页内容-防止重定向 在抓取网页时,成功登录服务器应用系统后,应用系统可能会通过 Response.Redirect 将网页进行重定向,如果不需要响应这个重定向,那么,我们就不要把 reader.ReadToEnd() 给 Response.Write 出来,就可以了。 5、ASP.NET 抓取网页内容-保持登录状态 利用 Post 数据成功登录服务器应用系统后,就可以抓取需要登录的页面了,那么我们就可能需要在多个 Request 间保持登录状态。 首先,我们要使用 HttpWebRequest,而不是 WebRequest。 与 WebRequest 相比,变化的代码是: [csharp] view plaincopy在CODE上查看代码片派生到我的代码片 <span style="font-size:18px;">HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strUrl);</span> 注意:HttpWebRequest.Create 返回的类型仍是 WebRequest,所以要转化一下。 其次,使用 CookieContainer。 [csharp] view plaincopy在CODE上查看代码片派生到我的代码片 <span style="font-size:18px;">System.Net.CookieContainer cc = new System.Net.CookieContainer(); request.CookieContainer = cc; request2.CookieContainer = cc;</span> 这样 request 和 request2 之间就使用了相同的 Session,如果 request 登录了,那么 request2 也是登录状态。 最后,如何在不同的页面间使用同一个 CookieContainer。 要在不同的页面间使用同一个 CookieContainer,只有把 CookieContainer 加入 Session。 [csharp] view plaincopy在CODE上查看代码片派生到我的代码片 <span style="font-size:18px;">Session.Add("ccc", cc); //存 CookieContainer cc = (CookieContainer)Session["ccc"]; //取Session</span> [csharp] view plaincopy在CODE上查看代码片派生到我的代码片 <span style="font-size:18px;">HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strUrl); //同一页面 //HttpWebRequest request2 = (HttpWebRequest)HttpWebRequest.Create(strUrl); //System.Net.CookieContainer cc = new CookieContainer(); //request.CookieContainer = cc; //request2.CookieContainer = cc; //不同页面,具体使用时需要将request,request2分开 object obj = Session["ccc"]; if (obj == null) { CookieContainer cc = new CookieContainer(); //requestr的保存 Session.Add("ccc", cc); } string strUrl2 = ""; HttpWebRequest request2 = (HttpWebRequest)HttpWebRequest.Create(strUrl2); //取出来 CookieContainer cc2 = (CookieContainer)Session["ccc"]; request2.CookieContainer = cc2; //再进行下一步处理</span> 6、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 中。 [csharp] view plaincopy在CODE上查看代码片派生到我的代码片 <span style="font-size:18px;">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();</span> 要说明的是: 本文并不是 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 端程序的设计。 其实本文算是本连载中“保持登录状态”的另一种方法。 7、ASP.NET 抓取网页内容-如何更改来源 Referer 和 UserAgent [csharp] view plaincopy在CODE上查看代码片派生到我的代码片 <span style="font-size:18px;">HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://127.0.0.1/index.htm"); request.Referer = "http://www.csdn.net/"; request.UserAgent = "要设置的标头"; //下一步的处理</span>
试试其它关键字
抓取网页内容
抓取网页
同语言下
.
gzip压缩
.
实现http多线程断点续传下载文件
.
实现多线程断点续传下载大文件
.
生成字符串的 CheckSum
.
根据 UserAgent 获取浏览器的类型和版本
.
根据 Agent 判断是否是智能手机
.
隐藏手机号中间四位为*方法
.
合并图片(二维码和其他图片合并)
.
ASP.NET CORE中判断是否移动端打开网页
.
ASP.NET(C#)实现页面计时(定时)自动跳转
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
汶妍
贡献的其它代码
(
18
)
.
Map遍历的几种方法
.
对大文件进行分割
.
按天数据统计
.
SD工具类
.
最简单的无提示复制内容
.
消除图片底部间隙的方法
.
链表的基本操作,追加,插入,查询,遍历
.
Web 定时自动发邮件
.
实体类自动生成
.
SqlServer修改表的所有者为“dbo”
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3