网页数据抓取(B/S)

C# 抓取网页内容(转)

1、抓取一般内容

需要三个类:WebRequest、WebResponse、StreamReader

所需命名空间:System.Net、System.IO

核心代码:

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

WebRequest 类的 Create 为静态方法,参数为要抓取的网页的网址;

Encoding 指定编码,Encoding 中有属性 ASCII、UTF32、UTF8 等全球通用的编码,但没有 gb2312 这个编码属性,所以我们使用 GetEncoding 获得 gb2312 编码。

示例:

 1     <%@ Page Language="C#" %>
 2     <%@ Import Namespace="System.Net" %>
 3     <%@ Import Namespace="System.IO" %>
 4     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 5     <mce:script runat="server"><!--
 6         void Page_Load(object sender, EventArgs e)
 7         {
 8             try
 9             {
10                 WebRequest request = WebRequest.Create("http://www.cftea.com/");
11                 WebResponse response = request.GetResponse();
12                 StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"));
13
14                 tb.Text = reader.ReadToEnd();
15
16                 reader.Close();
17                 reader.Dispose();
18                 response.Close();
19             }
20             catch (Exception ex)
21             {
22                 tb.Text = ex.Message;
23             }
24         }
25     // --></mce:script>
26     <html xmlns="http://www.w3.org/1999/xhtml" >
27     <head runat="server">
28         <title>抓取网页内容 - 千一网络</title>
29     </head>
30     <body>
31         <form id="form1" runat="server">
32         <div>
33         <asp:TextBox ID="tb" runat="server" Width="500" Height="300" TextMode="multiLine"></asp:TextBox>
34         </div>
35         </form>
36     </body>
37     </html>  

2 抓取网页内容-图片

需要四个类:WebRequest、WebResponse、Stream、FileStream。

示例:

 1     <%@ Page Language="C#" %>
 2     <%@ Import Namespace="System.Net" %>
 3     <%@ Import Namespace="System.IO" %>
 4     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 5     <mce:script runat="server"><!--
 6         void Page_Load(object sender, EventArgs e)
 7         {
 8             try
 9             {
10                 WebRequest request = WebRequest.Create("http://www.cftea.com/images/logo.gif");
11                 WebResponse response = request.GetResponse();
12                 Stream reader = response.GetResponseStream();
13
14                 FileStream writer = new FileStream("D://logo.gif", FileMode.OpenOrCreate, FileAccess.Write);
15                 byte[] buff = new byte[512];
16                 int c = 0; //实际读取的字节数
17                 while ((c=reader.Read(buff, 0, buff.Length)) > 0)
18                 {
19                     writer.Write(buff, 0, c);
20                 }
21                 writer.Close();
22                 writer.Dispose();
23
24                 reader.Close();
25                 reader.Dispose();
26                 response.Close();
27
28                 tb.Text = "保存成功!";
29             }
30             catch (Exception ex)
31             {
32                 tb.Text = ex.Message;
33             }
34         }
35     // --></mce:script>
36     <html xmlns="http://www.w3.org/1999/xhtml" >
37     <head runat="server">
38         <title>抓取网页图片并保存 - 千一网络</title>
39     </head>
40     <body>
41         <form id="form1" runat="server">
42         <div>
43         <asp:TextBox ID="tb" runat="server" Width="500" Height="300" TextMode="multiLine"></asp:TextBox>
44         </div>
45         </form>
46     </body>
47     </html>  

3 抓取网页内容-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();
    }  

4  抓取网页内容-防止重定向

在抓取网页时,成功登录服务器应用系统后,应用系统可能会通过 Response.Redirect 将网页进行重定向,如果不需要响应这个重定向,那么,我们就不要把 reader.ReadToEnd() 给 Response.Write 出来,就可以了。

5 抓取网页内容-保持登录状态

利用 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"]; //取  

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 中。

    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

    <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.cftea.com/"); // 错误
    //request.Headers[HttpRequestHeader.Referer] = "http://www.cftea.com/"; // 错误
    <SPAN class=caution>request.Referer</SPAN> = "http://www.cftea.com/"; // 正确  

注释掉的两句是不对的,会发生错误:

  1. 此标头必须使用适当的属性进行修改。
  2. 参数名: name
时间: 2024-08-09 14:46:00

网页数据抓取(B/S)的相关文章

爬虫---selenium动态网页数据抓取

动态网页数据抓取 什么是AJAX: AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML.过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面.因为传统的在传输数据格式方面,使用的是XML语法.因此叫做AJAX,其实现在数据交互基本上都是使用JSON.使用AJAX加载的数据,即使使用了JS,将数

第四章爬虫进阶之动态网页数据抓取

动态网页数据抓取 什么是AJAX: AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML.过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面.因为传统的在传输数据格式方面,使用的是XML语法.因此叫做AJAX,其实现在数据交互基本上都是使用JSON.使用AJAX加载的数据,即使使用了JS,将数

Android登录客户端,验证码的获取,网页数据抓取与解析,HttpWatch基本使用

大家好,我是M1ko.在互联网时代的今天,如果一个App不接入互联网,那么这个App一定不会有长时间的生命周期,因此Android网络编程是每一个Android开发者必备的技能,博主是在校大学生,自学Android一年半多,正好通过一个模拟登录校园网软件,来给大家演示如何在网页上抓取我们想要的数据,以及将数据Post给服务器.如果有什么错误或改进欢迎大家指正=-= ,如果想交流博主qq 136057505 好的废话不多说看一下我们的重点 Httpwatch等软件抓取Post请求 如何获取验证码

python网页数据抓取全纪录

在本文中,我将会为你展示一个基于新的异步库(aiohttp)的请求的代替品.我使用它写了一些速度的确很快的小数据抓取器,下面我将会为你演示是如何做到的.codego.net中介绍的方法如此多样的原因在于,数据"抓取"实际上包括很多问题:你不需要使用相同的工具从成千上万的页面中抓取数据,同时使一些Web工作流自动化(例如填一些表单然后取回数据). asyncio的基本概念 asyncio是在python3.4中被引进的异步IO库.你也可以通过python3.3的pypi来安装它.它相当的

【Android 我的博客APP】1.抓取博客首页文章列表内容——网页数据抓取

打算做个自己在博客园的博客APP,首先要能访问首页获取数据获取首页的文章列表,第一步抓取博客首页文章列表内容的功能已实现,在小米2S上的效果图如下: 思路是:通过编写的工具类访问网页,获取页面源代码,通过正则表达式得到匹配的数据进行处理显示到ListView上 简单说明下要点:1. 使用Apache HttpClient库实现GET请求.2. 异步请求处理.3. 正则表达式抓取自己需要的数据. 使用Apache HttpClient库实现GET请求. 使用Apache只需简单三步 HttpCli

Web网页数据抓取(C/S)

通过程序自动的读取其它网站网页显示的信息,类似于爬虫程序.比方说我们有一个系统,要提取BaiDu网站上歌曲搜索排名.分析系统在根据得到的数据进行数据分析.为业务提供参考数据. 为了完成以上的需求,我们就需要模拟浏览器浏览网页,得到页面的数据在进行分析,最后把分析的结构,即整理好的数据写入数据库.那么我们的思路就是: 1.发送HttpRequest请求. 2.接收HttpResponse返回的结果.得到特定页面的html源文件. 3.取出包含数据的那一部分源码. 4.根据html源码生成HtmlD

记一次简单的网页数据抓取

之前有一个工作是到服务器上去复制一串文字下来,很简单的操作,但是需要重复50次左右,每次花费大概三分钟,一遍下来两个多小时就进去了.因此就做了这个工具自动抓取数据. 工具主要做三件事情:登陆,下载,截取. 登陆部分由于服务器使用的是windows安全校验,如图: 需要模拟登陆才能获取到网页数据. 首先用fiddler抓取http传输的数据包,在报头部分发现一串字符串: 经过base64解密之后得到:Administrator:manage. 这个便是用户名:密码经过加密之后的字符串.而Autho

java网页数据抓取实例

网页上面数据如下: 如果想要过去上图所示网页的数据,代码如下: (1)调度类,主要调用工具类中的方法获取数据并入库 package com.jointsky.jointframe.weather.jobservice; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.springframewor

一个我经常用到的采集网页数据抓取网页获取数据的PHP函数类

class get_c_str { var $str; var $start_str; var $end_str; var $start_pos; var $end_pos; var $c_str_l; var $contents; function get_str($str,$start_str,$end_str){ $this->str = $str; $this->start_str = $start_str; $this->end_str = $end_str; $this-&g