C# 抓取网页内容的方法
1、抓取一般内容
需要三个类:WebRequest、WebResponse、StreamReader
所需命名空间:System.Net、System.IO
核心代码:
view plaincopy to clipboardprint?
WebRequest request = WebRequest.Create("http://www.jb51.net/");
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"));
Encoding 指定编码,Encoding 中有属性 ASCII、UTF32、UTF8 等全球通用的编码,但没有 gb2312 这个编码属性,所以我们使用 GetEncoding 获得 gb2312 编码。
示例:
view plaincopy to clipboardprint?
<%@ 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">
<mce:script runat="server"><!--
void Page_Load(object sender, EventArgs e)
{
try
{
WebRequest request = WebRequest.Create("http://www.jb51.net/");
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;
}
}
// --></mce: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>
2 抓取网页内容-图片
需要四个类:WebRequest、WebResponse、Stream、FileStream。
示例:
view plaincopy to clipboardprint?
<%@ 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">
<mce:script runat="server"><!--
void Page_Load(object sender, EventArgs e)
{
try
{
WebRequest request = WebRequest.Create("http://www.jb51.net/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;
}
}
// --></mce: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>
3 抓取网页内容-Post 数据
在抓取网页时,有时候,需要将某些数据通过 Post 的方式发送到服务器,将以下代码添加在网页抓取的程序中,以实现将用户名和密码 Post 到服务器
view plaincopy to clipboardprint?
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();
}
4 抓取网页内容-防止重定向
在抓取网页时,成功登录服务器应用系统后,应用系统可能会通过 Response.Redirect 将网页进行重定向,如果不需要响应这个重定向,那么,我们就不要把 reader.ReadToEnd() 给 Response.Write 出来,就可以了。
5 抓取网页内容-保持登录状态
利用 Post 数据成功登录服务器应用系统后,就可以抓取需要登录的页面了,那么我们就可能需要在多个 Request 间保持登录状态。
首先,我们要使用 HttpWebRequest,而不是 WebRequest。
与 WebRequest 相比,变化的代码是:
view plaincopy to clipboardprint?
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
注意:HttpWebRequest.Create 返回的类型仍是 WebRequest,所以要转化一下。
其次,使用 CookieContainer。
view plaincopy to clipboardprint?
System.Net.CookieContainer cc = new System.Net.CookieContainer();
request.CookieContainer = cc;
request2.CookieContainer = cc;
最后,如何在不同的页面间使用同一个 CookieContainer。
要在不同的页面间使用同一个 CookieContainer,只有把 CookieContainer 加入 Session。
view plaincopy to clipboardprint?
Session.Add("ccc", cc); //存 CookieContainer cc = (CookieContainer)Session["ccc"]; //取
5 抓取网页内容-把当前会话带到 WebRequest 中
比如说浏览器 B1 去访问服务器端 S1,这会产生一个会话,而服务器端 S2 再用 WebRequest 去访问服务器端 S1,这又会产生一个会话。现在的需求是让 WebRequest 使用浏览器 B1 与 S1 之间的会话,也就是说要让 S1 认为是 B1 在访问 S1,而不是 S2 在访问 S1。
这就要利用 Cookie 了,先在 S1 中取得与 B1 的 SessionID 的 Cookie,再将这个 Cookie 告诉 S2,S2 再将 Cookie 写在 WebRequest 中。
view plaincopy to clipboardprint?
WebRequest request = WebRequest.Create("url");
<SPAN class="key">request.Headers.Add(HttpRequestHeader.Cookie, "ASPSESSIONIDSCATBTAD=KNNDKCNBONBOOBIHHHHAOKDM;");</SPAN>
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 端程序的设计。
其实本文算是本连载中“保持登录状态”的另一种方法。
6 抓取网页内容-如何更改来源 Referer 和 UserAgent
view plaincopy to clipboardprint?
SPAN class="caution">HttpWebRequest</SPAN> request = <SPAN class=caution>(HttpWebRequest)HttpWebRequest</SPAN>.Create("http://127.0.0.1/index.htm");
//request.Headers.Add(HttpRequestHeader.Referer, "http://www.jb51.net/"); // 错误
//request.Headers[HttpRequestHeader.Referer] = "http://www.jb51.net/"; // 错误
<SPAN class="caution">request.Referer</SPAN> = "http://www.jb51.net/"; // 正确
view plaincopy to clipboardprint?
此标头必须使用适当的属性进行修改。
参数名: name
此标头必须使用适当的属性进行修改。参数名: name
UserAgent 类似。
C# 抓取网页内容的方法的更多相关文章
- ASP.NET抓取网页内容的实现方法
这篇文章主要介绍了ASP.NET抓取网页内容的实现方法,涉及使用HttpWebRequest及WebResponse抓取网页内容的技巧,需要的朋友可以参考下 一.ASP.NET 使用HttpWebRe ...
- paip.抓取网页内容--java php python
paip.抓取网页内容--java php python.txt 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog ...
- Asp.Net 之 抓取网页内容
一.获取网页内容——html ASP.NET 中抓取网页内容是非常方便的,而其中更是解决了 ASP 中困扰我们的编码问题. 需要三个类:WebRequest.WebResponse.StreamRea ...
- ASP.NET抓取网页内容
原文:ASP.NET抓取网页内容 一.ASP.NET 使用HttpWebRequest抓取网页内容 这种方式抓取某些页面会失败 不过,有时候我们会发现,这个程序在抓取某些页面时,是获不到所需的内容的, ...
- c#抓取网页内容乱码的解决方案
写过爬虫的同学都知道,这是个很常见的问题了,一般处理思路是: 使用HttpWebRequest发送请求,HttpWebResponse来接收,判断HttpWebResponse中”Content-Ty ...
- ASP.NET 抓取网页内容
(转)ASP.NET 抓取网页内容 ASP.NET 抓取网页内容-文字 ASP.NET 中抓取网页内容是非常方便的,而其中更是解决了 ASP 中困扰我们的编码问题. 需要三个类:WebRequest. ...
- 爬虫学习一系列:urllib2抓取网页内容
爬虫学习一系列:urllib2抓取网页内容 所谓网页抓取,就是把URL地址中指定的网络资源从网络中读取出来,保存到本地.我们平时在浏览器中通过网址浏览网页,只不过我们看到的是解析过的页面效果,而通过程 ...
- 使用Jsoup函数包抓取网页内容
之前写过一篇用Java抓取网页内容的文章,当时是用url.openStream()函数创建一个流,然后用BufferedReader把这个inputstream读取进来.抓取的结果是一整个字符串.如果 ...
- Asp 使用 Microsoft.XMLHTTP 抓取网页内容无乱码处理,并过滤须要的内容
Asp 使用 Microsoft.XMLHTTP 抓取网页内容.并过滤须要的内容 Asp 使用 Microsoft.XMLHTTP 抓取网页内容无乱码处理,并过滤须要的内容 演示样例源代码: < ...
随机推荐
- BitAdminCore框架更新日志20180518
20180518更新内容 1.重构调整QQ登录代码,使用JObject,减少代码,增加access_token自动续期(未测试). 2.重构调整微信登录代码,使用JObject,减少代码,增加acce ...
- 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架
一.系列简述 本篇起,将通过一系列文章,去描述如何构建一个应用开发框架,并以作者开发的框架为例,逐个点展开分析,如何从零开始,构建自己的开发框架. 本系列文章的目的,是带领有一编程经验的人,通过动手, ...
- Delphi - 如何执行Windows、OSX、Linux的外部程序?
毫无疑问,几乎对所有Delphi程序员来说,不用说如何在Windows下如何执行外部程序了!目前Delphi,真的已经很棒了,Delphi有一套和VCL并驾齐驱的图形界面库,叫做"FireM ...
- Python 使用 lambda() 结合sort() 或 sorted() 对列表嵌套字典格式的数据进行排序
1.使用sort()方法进行排序 my_list = [{"age":65, "money":5}, {"age":35, "mo ...
- node.js async 几个函数
async.waterfallasync.seriesasync.parallelasync.auto http://my.oschina.net/huangsz/blog/176203http:// ...
- 五,mysql优化——sql语句优化小技巧
1,大批量插入数据 (1)对于MyISAM: alter table table_name disable keys; loading data; alter table table_name ena ...
- Kafka迁移与扩容工具用法
1.迁移topic到新增的node上 假如现在一个kafka集群运行三个broker,broker.id依次为101,102,103,后来由于业务数据突然暴增,需要新增三个broker,broker. ...
- 【4】JMicro微服务-服务限流
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 通过配置SMethod的maxSpeed属性实现服务限流,单位是个/每秒(qps),也就是服务方法每秒允许接收的最大请求个数 ...
- editplus配置csharp
只要是写代码的,我们肯定常有用到EditPlus..Net开发也是如此.有时我们需要调试一小段C#(或VB.Net)代码,这时去大动干戈在臃肿的VS.Net中新建“控制台应用程序”项目,写满“Cons ...
- Centos 7 安装 Visual stdio Code
最近微软正式发布了.net code 和asp.net code.尝试了下在linux下.net code和asp.net code使用. 具体怎么使用.net code 和asp.net code ...