火车采集器软件交流官方论坛

 找回密码
 加入会员
搜索
火车采集器V9版免费下载火车浏览器 - 可视采集,万能群发,全自动脚本工具
查看: 28342|回复: 41

采集原理(不要跟贴,谢谢。)

[复制链接]
发表于 2008-10-20 21:46:15 | 显示全部楼层 |阅读模式
占位,请勿跟贴,
如需技术讨论请加,
MSN:pc@mye.cn


从ISAPI开始(占位)
http://www.chinaitpower.com/A/2002-07-23/29847.html

[ 本帖最后由 faunus 于 2008-11-1 21:54 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2008-10-20 21:47:18 | 显示全部楼层

正则表达式(占位)

正则表达式正则表达式
 楼主| 发表于 2008-10-20 21:48:20 | 显示全部楼层

关于.NET异步调用的初步总结

异步调用的实质:

[url=]异步调用[/url]通过委托将所需调用的方法置于一个新线程上运行,从而能够使一个可能需要较长时间的任务在后台执行而不影响调用方的其他行为。

异步调用的实现:

前面已经讲道,[url=]异步调用[/url]通过委托实现。委托支持同步和[url=]异步调用[/url]。在同步调用中,一个委托的实例可记录多个目标方法;在[url=]异步调用[/url]中,一个委托实例中有且只能包含一个目标方法。[url=]异步调用[/url]使用委托实例的[url=]BeginInvoke[/url]方法和EndInvoke方法分别开始调用和检索返回值,这两个方法在编译期生成。调用[url=]BeginInvoke[/url]后委托立即返回;调用EndInvoke时倘若委托方法未执行完毕,则阻塞当前线程至调用完毕。
假设有一个委托

public delegate int ASyncHandler(int a, string b, ref string c);


那么,其[url=]BeginInvoke[/url]与EndInvoke的形式如下:

public IAsyncResult BeginInvoke(int a, string b, ref string c, AsyncCallback callback, object asyncState);
public int EndInvoke(ref string c, IAsyncResult asyncResult);


也就是说,[url=]BeginInvoke[/url]与EndInvoke的参数列表与当前委托签名有关,可以总结为:

public IAsyncResult BeginInvoke(委托所具有的全部参数,AsyncCallback callback,object asyncState);
public 委托返回值 EndInvoke(委托参数中ref/out部分,IAsyncResult asyncResult);


[url=]BeginInvoke[/url]返回一个[url=]IAsyncResult[/url],其实质是实现[url=]IAsyncResult[/url]的System.Runtime.Remoting.Messaging.AsyncResult类。该对象相当于一个“凭证”,在调用EndInvoke时用于确认应等待返回的方法(猜测如此)。就像去银行,存钱时拿到一份存折(凭证),取款时依据存折(凭证)取款。
EndInvoke检索委托返回值,并返回标有ref/out的参数值。
[url=]IAsyncResult[/url]接口声明:

public interface IAsyncResult
{
object AsyncState { get;}
WaitHandle AsyncWaitHandle { get;}
bool CompletedSynchronously { get;}
bool IsCompleted { get;}
}



等待调用结束的三种方法:

1、使用EndInvoke主动等待[url=]异步调用[/url]结束。这是最简单的一种方法,适用于非用户界面程序及一些IO操作,因为在调用EndInvoke之后当前线程被阻塞,除了等待什么都不能做。

2、使用WaitHandle等待[url=]异步调用[/url]结束。[url=]IAsyncResult[/url]中有WaitHandle成员,获取用于等待[url=]异步[/url]操作完成的WaitHandle,即调用结束信号。使用WaitHandle.WaitOne()可以阻塞当前线程至[url=]异步调用[/url]完成。这样做的好处是:在调用WaitOne之后、EndInvoke之前,可以执行其他处理。

3、主动轮询。使用[url=]IAsyncResult[/url]中有IsCompleted成员检索当前[url=]异步调用[/url]情况。该方法适用于用户界面程序,想象可在一个循环内做到既等待委托完成,又可以更新用户界面。

4、使用回调,在[url=]异步调用[/url]结束时执行一个操作。前面的[url=]BeginInvoke[/url]方法签名的最后两个参数用于回调。需要用到AsyncCallback委托:
复制  保存

public delegate void AsyncCallback(IAsyncResult asyncResult);


回调方法在系统线程池中执行。[url=]BeginInvoke[/url]的最后一个参数(object asyncState)可以传递包含回调方法将要使用的信息的对象。在回调方法中调用EndInvoke可以通过取得System.Runtime.Remoting.Messaging.AsyncResult.AsyncDelegate实现。

方法1、2相差不算太大。

异步操作总结                                               
class Program
  {
    // 委托原型
    public delegate int DelegateHandler(int i);

    // 目标方法
    static int Test(int i)
    {
      Console.WriteLine("Async Thread:{0}", Thread.CurrentThread.ManagedThreadId);
      Thread.Sleep(5000);
      return ++i;
    }

    // 异步等待模式 :EndInvoke
    static void Async_EndInvoke()
    {
      DelegateHandler dlg = new DelegateHandler(Test);
      IAsyncResult ar = dlg.BeginInvoke(1, null, null);
      int result = dlg.EndInvoke(ar);
      Console.WriteLine(result);
    }

    // 异步等待模式 :WaitHandle.WaitOne
    static void Async_WaitOne()
    {
      DelegateHandler dlg = new DelegateHandler(Test);
      IAsyncResult ar = dlg.BeginInvoke(1, null, null);
      ar.AsyncWaitHandle.WaitOne();
      int result = dlg.EndInvoke(ar);
      Console.WriteLine(result);
    }

    // 异步等待模式 :IsCompleted
    static void Async_IsCompleted()
    {
      DelegateHandler dlg = new DelegateHandler(Test);
      IAsyncResult ar = dlg.BeginInvoke(1, null, null);
      
      while (!ar.IsCompleted) Thread.Sleep(10);

      int result = dlg.EndInvoke(ar);
      Console.WriteLine(result);
    }

    // 异步等待模式 :CallBack
    static void Aysnc_CallBack()
    {
      DelegateHandler dlg = new DelegateHandler(Test);
      dlg.BeginInvoke(1,
        delegate(IAsyncResult ar)
        {
          int result = (ar.AsyncState as DelegateHandler).EndInvoke(ar);
          Console.WriteLine(result);
        }, dlg);
    }

    // 异步等待模式 :CallBack & Timeout
    static void Async_TimeOut()
    {
      DelegateHandler dlg = new DelegateHandler(Test);
      IAsyncResult iar = dlg.BeginInvoke(1,
        delegate(IAsyncResult ar)
        {
          int result = (ar.AsyncState as DelegateHandler).EndInvoke(ar);
          Console.WriteLine(result);
        }, dlg);

      ThreadPool.RegisterWaitForSingleObject(iar.AsyncWaitHandle,
        delegate(object state, bool timeout)
        {
          // 如果没有超时,该回调方法会在目标方法后立即执行。
          // 不管超时与否,该回调方法都会执行,因此要判断timeout参数。
          Console.WriteLine("Timeout:{0}, Thread:{1}", timeout, Thread.CurrentThread.ManagedThreadId);
        }, null, 10000, true);
    }

    static void Main()
    {
      Console.WriteLine("Main Thread:{0}", Thread.CurrentThread.ManagedThreadId);
      Async_TimeOut();

      Console.WriteLine("Press any key to exit...");
      Console.ReadKey(true);
    }

[ 本帖最后由 faunus 于 2008-11-8 20:43 编辑 ]
 楼主| 发表于 2008-10-20 21:50:49 | 显示全部楼层

页面状态管理之asp.net

---(客户端)---------
1、视图状态

     视图状态是 ASP.NET 页框架默认情况下用于保存往返过程之间的页和控件值的方法。当呈现页的 HTML 形式时,需要在回发过程中保留的页的当前状态和值将被序列化为 Base64 编码的字符串,并输出到视图状态的隐藏字段中。
     您可以通过使用页的 ViewState 属性将往返过程中的数据保存到 Web 服务器来利用自己的代码访问视图状态。ViewState 属性是一个包含密钥/值对(其中包含视图状态数据)的字典。
     视图状态信息将序列化为 XML,然后使用 Base64 编码进行编码,这将生成大量的数据。将页回发到服务器时,视图状态的内容将作为页回发信息的一部分发送。        页面本身将 20 字节左右的信息保存在 ViewState 中,用于在回传时将 PostBack 数据和 ViewState 值分发给正确的控件。因此,即使该页面或应用程序禁用了 ViewState,仍可以在 ViewState 中看到少量的剩余字节。下列服务器控件不能禁止ViewState
Textbox 
Checkbox
Checkbox List
RadioButtonList

控件 TextBox 的 TextMode 属性设置为 Password时,它的状态将不会被保存在 ViewState 中,这应该是出于安全性的考虑。
2、控件状态
3、隐藏域
4、Cookie
5、查询字符串
---(服务器端)---------
6、应用程序状态
7、会话状态
8、配置文件属性

[ 本帖最后由 faunus 于 2008-10-21 12:46 编辑 ]
 楼主| 发表于 2008-10-21 13:18:11 | 显示全部楼层
 楼主| 发表于 2008-10-21 20:57:18 | 显示全部楼层

HTTP标头专题

成员名称        说明
Accept        Accept 标头,指定响应可接受的 MIME 类型。 
AcceptCharset        Accept-Charset 标头,指定响应可接受的字符集。 
AcceptEncoding        Accept-Encoding 标头,指定响应可接受的内容编码。 
AcceptLanguage        Accept-Langauge 标头,指定响应首选的自然语言。 
Allow        Allow 标头,指定支持的 HTTP 方法集。 
Authorization        Authorization 标头,指定客户端为向服务器验证自身身份而出示的凭据。 
CacheControl        Cache-Control 标头,指定请求/响应链上所有缓存控制机制必须服从的指令。 
Connection        Connection 标头,指定特定连接需要的选项。 
ContentEncoding        Content-Encoding 标头,指定已应用于伴随正文数据的编码。 
ContentLanguage        Content-Langauge 标头,指定伴随正文数据的自然语言。 
ContentLength        Content-Length 标头,指定伴随正文数据的长度(以字节为单位)。 
ContentLocation        Content-Location 标头,指定可从其中获得伴随正文的 URI。 
ContentMd5        Content-MD5 标头,指定伴随正文数据的 MD5 摘要,用于提供端到端消息完整性检查。 
ContentRange        Content-Range 标头,指定在完整正文中应用伴随部分正文数据的位置。 
ContentType        Content-Type 标头,指定伴随正文数据的 MIME 类型。 
Cookie        Cookie 标头,指定向服务器提供的 Cookie 数据。 
Date        Date 标头,指定开始创建请求的日期和时间。 
Expect        Expect 标头,指定客户端要求的特定服务器行为。 
Expires        Expires 标头,指定日期和时间,在此之后伴随的正文数据应视为陈旧的。 
From        From 标头,指定控制请求用户代理的用户的 Internet 电子邮件地址。 
Host        Host 标头,指定所请求资源的主机名和端口号。 
IfMatch        If-Match 标头,指定仅当客户端的指示资源的缓存副本是最新的时,才执行请求的操作。 
IfModifiedSince        If-Modified-Since 标头,指定仅当自指示的数据和时间之后修改了请求的资源时,才执行请求的操作。 
IfNoneMatch        If-None-Match 标头,指定仅当客户端的指示资源的缓存副本都不是最新的时,才执行请求的操作。 
IfRange        If-Range 标头,指定如果客户端的缓存副本是最新的,仅发送指定范围的请求资源。 
IfUnmodifiedSince        If-Unmodified-Since 标头,指定仅当自指示的日期和时间之后修改了请求的资源时,才执行请求的操作。 
KeepAlive        Keep-Alive 标头,指定用以维护持久性连接的参数。 
LastModified        Last-Modified 标头,指定上次修改伴随的正文数据的日期和时间。 
MaxForwards        Max-Forwards 标头,指定一个整数,表示此请求还可转发的次数。 
Pragma        Pragma 标头,指定可应用于请求/响应链上的任何代理的特定于实现的指令。 
ProxyAuthorization        Proxy-Authorization 标头,指定客户端为向代理验证自身身份而出示的凭据。 
Range        Range 标头,指定代替整个响应返回的客户端请求的响应的子范围。 
Referer        Referer 标头,指定从中获得请求 URI 的资源的 URI。 
Te        TE 标头,指定响应可接受的传输编码方式。 
Trailer        Trailer 标头,指定标头字段显示在以 chunked 传输编码方式编码的消息的尾部。 
TransferEncoding        Transfer-Encoding 标头,指定对消息正文应用的转换的类型(如果有)。 
Translate        Translate 标头,与 WebDAV 功能一起使用的 HTTP 规范的 Microsoft 扩展。 
Upgrade        Upgrade 标头,指定客户端支持的附加通信协议。 
UserAgent        User-Agent 标头,指定有关客户端代理的信息。 
Via        Via 标头,指定网关和代理程序要使用的中间协议。 
Warning        Warning 标头,指定关于可能未在消息中反映的消息的状态或转换的附加信息。 
 楼主| 发表于 2008-10-22 12:31:25 | 显示全部楼层

HTTP协议

 楼主| 发表于 2008-10-23 14:49:20 | 显示全部楼层

cookie专题

cookieCollection是一个针对一个域所有的cookie的集合。cookeContainer是一个容
器,里面可以装多个域的cookie的集合,即一个cookieContainer可以包含多个
cookieCollection,这个容器可以定义大小,决定最多装多少个cookie,如果装满了还要再
装,它会自动剔除原来过期的cookie.
cookie的结构:Cookie由变量名和值组成,类似Javascript变量。其属性里既有标准的Cookie变量,也有用户自己创建的变量,属性中变量是用“变量=值”形式来保存。根据Netscape公司的规定,Cookie格式如下:
Set-Cookie:
NAME=VALUE;
Expires=DATE;
Path=PATH;
Domain=DOMAIN_NAME;
SECURENAME=VALUE:
这是每一个Cookie均必须有的部分。
NAME是该Cookie的名称,VALUE是该Cookie的值。在字符串“NAME=VALUE”中,不含分号、逗号和空格等字符。
Expires=DATE:Expires变量是一个只写变量,它确定了Cookie有效终止日期。该属性值DATE必须以特定的格式来书写:星期几,DD-MM-YY HH:MM:SS GMT,GMT表示这是格林尼治时间。反之,不以这样的格式来书写,系统将无法识别。该变量可省,如果缺省时,则Cookie的属性值不会保存在用户的硬盘中,而仅仅保存在内存当中,Cookie文件将随着浏览器的关闭而自动消失。
Domain=DOMAIN-NAME:Domain该变量是一个只写变量,它确定了哪些Internet域中的Web服务器可读取浏览器所存取的Cookie,即只有来自这个域的页面才可以使用Cookie中的信息。这项设置是可选的,如果缺省时,设置Cookie的属性值为该Web服务器的域名。
Path=PATH:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie。一般如果用户输入的URL中的路径部分从第一个字符开始包含Path属性所定义的字符串,浏览器就认为通过检查。如果Path属性的值为“/”,则Web服务器上所有的WWW资源均可读取该Cookie。同样该项设置是可选的,如果缺省时,则Path的属性值为Web服务器传给浏览器的资源的路径名。可以看出我们借助对Domain和Path两个变量的设置,即可有效地控制Cookie文件被访问的范围。
Secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS。
以上的cookie内容中,真正发送给服务器的内容,只有NAME和VALUE对,其他东西都是给客户端的浏览器用来管理cookie的,比如是否存放在硬盘上?存放多久?这浏览器在访问哪个网站的时候要发这个cookie.
这几个类型的转换方法:
cookieContainer.GetCookies()获得cookieCollection,而cookieCollection直接加索引号获得某一个具体的cookie,
cookieContainer.add()可以添加cookie或者cookieCollection,甚至直接用http的头中的cookie信息就可以直接往cookieContainer中添加cookie,用cookieContainer.SetCookies(Uri, string)来实现,其中的string就是cookie的字符串内容,这个字符串可以通过response.Headers.Get("Set-Cookie")获得,这里注意一点,SetCookies()函数中的Uri,不能和cookie字符串中的域名Domain完全相同,比如Uri=new Uri("http://.google.com"),而cookie中的Domain=.google.com,这个时候cookieContainer.SetCookies()函数将会报错,提示域名不正确,解决方法是,uri = new Uri("http://www.google.com")即可,反正改为其他的类似路径都可以,为什么不能相同,谁知道呢,问微软去.
CookieContainer.GetCookieHeader()函数可以读出cookieContainer中所有指定网站的cookie,以字符串方式显示.自己想要输入字符串单独构造cookie,也很简单,Cookie的构造函数就搞定.

System.Web.HttpCookieCollection 类 和 System.Net.CookieCollection 类 的差异
http://blog.csdn.net/shanliwa/archive/2008/06/18/2559901.aspx


顺便说一下环境
http://bbs.locoy.com/spider-31216-1-1.html
通过COM来获取CookieContainer,简单又好用

http://www.cnblogs.com/xdotnet/archive/2007/01/08/cookie_container_com.html

[ 本帖最后由 faunus 于 2008-10-27 20:16 编辑 ]
 楼主| 发表于 2008-10-23 16:18:33 | 显示全部楼层

其它

 楼主| 发表于 2008-10-24 08:17:02 | 显示全部楼层

关于Accept-Charset:gzip,deflate

而现在的浏览器几乎都支持 GZip 和 Deflate 压缩,
因此在传输一些大的JS或CSS文件(如EXTJS)时对它进行压缩则可以减少下载时间,
从而提高加载速度。
===========
对比一下使用情况
===========
使用:Accept-Encoding:gzip,deflate

HTTP/1.0 200 OK
Date: Fri, 24 Oct 2008 00:13:38 GMT
Server: Apache
Last-Modified: Fri, 24 Oct 2008 00:10:51 GMT
ETag: "5c406-459f49d3178c0"-gzip
Accept-Ranges: bytes
X-Powered-By: mod_xlayout_jh/0.0.1vhs.markIII.remix
Cache-Control: max-age=60
Expires: Fri, 24 Oct 2008 00:14:38 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Type: text/html
Age: 51
Content-Length: 90255
X-Cache: HIT from nanjing75-169.HP08040113.sina.com.cn
Via: 1.0 nanjing75-169.HP08040113.sina.com.cn:80 (squid/2.6.STABLE13)
Connection: close
--------------------未使用Accept-Encoding

HTTP/1.0 200 OK
Date: Fri, 24 Oct 2008 00:11:31 GMT
Server: Apache
Last-Modified: Fri, 24 Oct 2008 00:10:51 GMT
ETag: "5c406-459f49d3178c0"
Accept-Ranges: bytes
X-Powered-By: mod_xlayout_jh/0.0.1vhs.markIII.remix
Cache-Control: max-age=60
Expires: Fri, 24 Oct 2008 00:12:31 GMT
Vary: Accept-Encoding
Content-Length: 389863
Content-Type: text/html
Age: 51
X-Cache: HIT from nanjing75-167.HP08040111.sina.com.cn
Via: 1.0 nanjing75-167.HP08040111.sina.com.cn:80 (squid/2.6.STABLE13)
Connection: close
===========
在DotNet2.0中提供了GZip和Deflate压缩算法,
自定义一个 CompressionHttpHandler,

实现 System.Web.IHttpHandler 接口.

首先取得请求的路径,然后判断浏览器返回的服务端标头是否使用GZip压缩,


如果使用,则设置Content-encoding为gzip,


然后设置输出的stream用GZip解压缩的,


最后将文件写入到HTML文本中。
另:GZip.gz,Deflate.de,


经测试(几大网站),GZIP可用,Deflate始终未起作为,跟服务端设置有关.
利用httpwebrequest下载deflate压缩的网页的关键点 作者:wintle  日期:2007-04-03 10:16

如果网页采用的仅是由deflate压缩的,则普通的写法会失效。
关键在于:
s = New InflaterInputStream(New MemoryStream(b), New Inflater(true))

如果不这样指定,仅s = New InflaterInputStream(New MemoryStream(b)),则会默认地要转化成gzip来处理。而gzip是有头的,而inflate是没头的。所以会出错。
参见:
http://www.icsharpcode.net/opensource/sd/Forum/topic.asp?TOPIC_ID=893




参考这段也行:http://blog.csdn.net/wszhoho/archive/2008/04/24/2323698.aspx
http://www.wintle.cn/article.asp?id=342

结论:


[ 本帖最后由 faunus 于 2008-10-29 21:09 编辑 ]
您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

QQ|手机版|Archiver|火车采集器官方站 ( 皖ICP备06000549 )

GMT+8, 2026-3-28 18:32

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表