C#中处理网页等_第1页
C#中处理网页等_第2页
C#中处理网页等_第3页
C#中处理网页等_第4页
C#中处理网页等_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用C#写一个抓网页的应用程序作者:发表时间:2003-7-13 10:13:07本文利用C#和.NET提供的类来轻松创建一个抓取网页容源代码的程序。HTTP是WWW进行数据访问最基本的协议之一,在.NET的基本类型库类中提供了两个对象类:HTTPWebRequest和HTTPWebResponse,分别用来向某资源发送请求和获得响应。为了得到一个资源的容,我们先指定一个想要抓取的URL地址,用HTTPWebRequest对象进行t1求,用 HTTPWebResponse对象接收响应的结果,最后用 TextStream对象来 提取我们想要的信息,并在控制台打印出来。下面就是看看如何实现这样的功能

2、:第一步:打开VS.NET,点 文件”-新建-项目”,项目类型选择“Visual C#项目”,模板选“Windows应用程 序”,第二步:在 Form1 里力口入 Label1 , Button1,TextBox1,TextBox2 四个控件,TextBox2 的 Multiline 属性改为 True, 第三步:在Form1窗体上点击右键,选查看代码”,然后在最顶端输入:using System.IO;using System.Net;using System.Text;在private void button1_Click(object sender, System.EventArgs e

3、) 的括号之间输入下面的代码:byte口 buf = new byte38192;HttpWebRequest request = (HttpWebRequest)WebRequest.Create(textBox1.Text);HttpWebResponse response = (HttpWebResponse) request.GetResponse();Stream resStream = response.GetResponseStream(); int count = resStream.Read(buf, 0, buf.Length);textBox2.Text = Encodi

4、ng.Default.GetString(buf, 0, count); resStream.Close();第四步:点“Saveall 按钮,按F5运行应用程序,在请输入 URL地址:”后面的单行文本框里输入lucky.myrice./down.htm ,点击 “得到 HTML 代码 ”按钮,就可以看到该地址的代码了!下面,我们就对上面的程序做一个分析:上面的这个程序的功能是抓取网页lucky.myrice./down.htm 的容,并在多行文本框里显示出 HTML 代码,由于返回的数据是字节类型的, 因此, 我们创建一个名为buf 的字节类型的数组变量来存储请求返回来的结果,其中数组的大小

5、与我们要请求返回的数据大小有关系。首先,我们实例化 HttpWebRequest 对象,使用WebRequest类的静态方法Create(),该方法的字符串参数就是我们要请求页面的URL地址,由于Create()方法返回的是 WebRequest类型的,我们必须对它进行造型(即类型转换)成HttpWebRequest类型,再赋给request 变量。一旦我们建立了HttpWebRequest对象,就可以使用它的GetResponse()方法来返回一个 WebResponse对象,然后再造型成 HttpWebResponse对象赋给response变量。现在,就可以使用response对象的Ge

6、tResponseStream(昉法来得到响应的文本流了,最后用Stream对象的Read()方法把返回的响应信息放到我们最初创建的字节数组buf中,Read()有3个参数,分别是:要放入的字节数组,字节数组的开始位置,字节数组的长度。最后把字节转换成字符串,注意:这里采用的采用的是Default 编码,它使用默认的编码方式,我们就不用再进行字符编码之间的转换了。也可以利用 WebRequest和WebResponse实现以上的功能, 代码如下:WebRequest request = WebRequest.Create(textBox1.Text); WebResponse response

7、 =request.GetResponse();输入其它的 URL 看看是不是很方便!C#编码标准编码习惯cuike519 (翻译)1. 避免将多个类放在一个文件里面。2.个文件应该只有一个命名空间,避免将多个命名空间放在同一个文件里面。10. 避免使用方法级的文档。10. 避免使用方法级的文档。一个文件最好不要超过 500 行的代码(不包括机器产生的代码)一个方法的代码长度最好不要超过 25 行。避免方法中有超过 5 个参数的情况。使用结构来传递多个参数。每行代码不要超过80 个字符。不要手工的修改机器产生的代码。a) 如果需要编辑机器产生的代码,编辑格式和风格要符合该编码标准。b) Use

8、 partial classes whenever possible to factor out the maintained portions.避免利用注释解释显而易见的代码。a) 代码应该可以自解释。好的代码由可读的变量和方法命名因此不需要注释。Document only operational assumptions, algorithm insights and so on.a) 使用扩展的API 文档说明之。b) 只有在该方法需要被其他的开发者使用的时候才使用方法级的注释。C# 中就是/)不要硬编码数字的值,总是使用构造函数设定其值。只有是自然结构才能直接使用 const ,比如一个

9、星期的天数。readonly避免在只读的变量上使用 const 。如果想实现只读,可以直接使用public class MyClasspublic readonly int Number;public MyClass(int someValue)Number = someValue;19. 尽量避免定义自定义异常类。public const int DaysInWeek = 7;14. 每个假设必须使用 Assert 检查a) 平均每 15 行要有一次检查(Assert)using System.Diagnostics;object GetObject()object obj = GetObj

10、ect();Debug.Assert(obj != null);代码的每一行都应该通过白盒方式的测试。只抛出已经显示处理的异常。在捕获 (catch) 语句的抛出异常子句中 (throw) ,总是抛出原始异常维护原始错误的堆栈分配。catch(Exception exception)MessageBox.Show(exception.Message);throw ;/和 throw exception 一样。避免方法的返回值是错误代码。当需要定义自定义的异常时:a) 自定义异常要继承于 ApplicationException b) 提供自定义的序列化功能。避免在单个程序集里使用多个Main

11、方法。只对外公布必要的操作,其他的则为 internalAvoid friend assemblies, as it increases inter-assembly coupling.Avoid code that relies on an assembly running from a particular location.使应用程序集尽量为最小化代码(EXE 客户程序)。使用类库来替换包含的商务逻辑。避免给枚举变量提供显式的值。/正确方法 public enum Colorpublic enum Color : longpublic enum Color : longRed,Green

12、,Blue/避免public enum ColorRed = 1,Green = 2,Blue = 327. 避免指定特殊类型的枚举变量。/避免Red,Green,Blue即使 if 语句只有一句,也要将if 语句的容用大括号扩起来。避免使用 trinary 条件操作符。避免在条件语句中调用返回 bool 值的函数。可以使用局部变量并检查这些局部变量。bool IsEverythingOK()/避免 if (IsEverythingOK ()/替换方案bool ok = IsEverythingOK();if (ok)31. 总是使用基于 0 开始的数组。32. 在循环中总是显式的初始化引用类

13、型的数组。public class MyClassMyClass array = new MyClass100;for(int index = 0; index array.Length;index+)arrayindex = new MyClass();不要提供 public 和 protected 的成员变量,使用属性代替他们。避免在继承中使用 new 而使用 override 替换。的。在不是 sealed 的类中总是将public 和 protected 的方法标记成virtual(unsafe code)除非使用interop(COM+ 或其他的dll)代码否则不要使用不安全的代码避

14、免显示的转换,使用 as 操作符进行兼容类型的转换。Dog dog = new GermanShepherd();GermanShepherd shepherd = dog as GermanShepherd;if (shepherd != null )当类成员包括委托的时候Copy a delegate to a local variable before publishing to avoid concurrency race condition.在调用委托之前一定要检查它是否为 null public class MySourcepublic event EventHandler MyE

15、vent;public void FireEvent()EventHandler temp = MyEvent;if(temp != null )temp(this,EventArgs.Empty);39. 不要提供公共的事件成员变量,使用事件访问器替换这些变量。public class MySourceMyDelegate m_SomeEvent ;public event MyDelegate SomeEventaddm_SomeEvent += value;removem_SomeEvent -= value;40. 使用一个事件帮助类来公布事件的定义。总是使用接口。类和接口中的方法和属

16、性至少为2:1 的比例。避免一个接口中只有一个成员。尽量使每个接口中包含 3 5 个成员。接口中的成员不应该超过 20 个。a) 实际情况可能限制为 12 个避免接口成员中包含事件。避免使用抽象方法而使用接口替换。在类层次中显示接口。推荐使用显式的接口实现。从不假设一个类型兼容一个接口。 Defensively query for that interface.SomeType obj1;IMyInterface obj2;/* 假设已有代码初始化过 obj1 ,接下来 */ obj2 = obj1 as IMyInterface;if (obj2 != null)obj2.Method1()

17、;else/处理错误51. 表现给最终用户的字符串不要使用硬编码而要使用资源文件替换之。52. 不要硬编码可能更改的基于配置的字符串,比如连接字符串。53. 当需要构建长的字符串的时候,使用 StringBuilder 不要使用 string54. 避免在结构里面提供方法。a) 建议使用参数化构造函数b) 可以重裁操作符55. 总是要给静态变量提供静态构造函数。56. 能使用早期绑定就不要使用后期绑定。57. 使用应用程序的日志和跟踪。58. 除非在不完全的 switch 语句中否则不要使用 goto 语句。59. 在 switch 语句中总是要有default 子句来显示信息(Assert)

18、int number = SomeMethod();switch(number)case 1:Trace.WriteLine(Case 1:);break;case 2:Trace.WriteLine(Case 2:);break;default :Debug.Assert(false);break;60. 除非在构造函数中调用其他构造函数否则不要使用 this 指针。/ 正确使用 this 的例子public class MyClasspublic MyClass(string message )public MyClass() : this(hello)61. 除非你想重写子类中存在名称冲

19、突的成员或者调用基类的构造函数否则不要使用 base 来访问基类的成员。/ 正确使用 base 的例子public class Dogpublic Dog(string name)virtual public void Bark( int howLong)public class GermanShepherd : Dogpublic GermanShe pherd(string name): base (name)override public void Bark(int howLong)base .Bark(howLong);62. 基于模板的时候要实现Dispose() 和 Finaliz

20、e() 两个方法。63. 通常情况下避免有从 System.Object 转换来和由 System.Object 转换去的代码,而使用强制转换或者as 操作符替换。class SomeClass/避免:class MyClassvoid SomeMethod(T t)object temp = t;SomeClass obj = (SomeClass)temp;/ 正确:class MyClass where T : SomeClassvoid SomeMethod(T t)SomeClass obj = t;64. 在一般情况下不要定影有限制符的接口。接口的限制级别通常可以用强类型来替换之。

21、public class Customer/避免:public interface IList where T : Customer/正确:public interface ICustomerList : IList65. 不确定在接口的具体方法的限制条件。66. 总是选择使用 C# 置(一般的 generics )的数据结构。由于本人水平有限,如果在翻译中有什么错误我将本着疯狂英语的态度,随便说好了,但是一定要给出我合 适的理由, 让我丢脸。 另外文章中有几处没有翻译, 那是我实在翻不出来, 我将原文放在那里希望高手指点! !C#书写规一、命名对于理解应用程序的逻辑流,命名方案是最有影响力的

22、一种帮助。名称应该说明“什么”而不是“如何”。通过避免使用公开基础实现(它们会发生改变)的名称,可以保留简化复杂性的抽象层。例如,可以使用 GetNextStudent() ,而不是 GetNextArrayElement() 。命名原则是:选择正确名称时的困难可能表明需要进一步分析或定义项的目的。使名称足够长以便有一定的意义,并且足够短以避免冗长。唯一名称在编程上仅用于将各项区分开。表现力强的名称是为了帮助人们阅读;因此,提供人们可以理解的名称是有意义的。不过,请确保选择的名称符合适用语言的规则和标准。以下几点是推荐的命名方法。避免容易被主观解释的难懂的名称,如方面名 导致多义性。1、方法、

23、属性、变量规AnalyzeThis(),或者属性名xxK8。这样的名称会Book.BookTitle 。而是应该使用在面向对象的语言中,在类属性的名称中包含类名是多余的,如Book.Title 。使用动词 -名词的方法来命名对给定对象执行特定操作的例程,如 CalculateInvoiceTotal() 。在允许函数重载的语言中,所有重载都应该执行相似的函数。只要合适,在变量名的末尾或开头加计算限定符( Avg、 Sum、 Min、 Max、 Index )。在变量名中使用互补对,如 min/max 、 begin/end 和open/close。鉴于大多数名称都是通过连接若干单词构造的, 请

24、使用大小写混合的格式以简化它们的阅读。 另外,为了帮助区分变量和例程,请对例程名称使用 Pascal 大小写处理(CalculateInvoiceTotal ) ,其中 每 个 单 词 的 第 一 个 字 母 都 是 大 写 的 。 对 于 变 量 名 , 请 使 用 camel 大 小 写 处 理(documentFormatType),其中除了第一个单词外每个单词的第一个字母都是大写的。布尔变量名应该包含 Is ,这意味着Yes/No 或 True/False 值,如 fileIsFound 。在命名状态变量时, 避免使用诸如 Flag 的术语。 状态变量不同于布尔变量的地方是它可以具有两

25、个以上的可能值。 不是使用 documentFlag , 而是使用更具描述性的名称, 如 documentFormatType 。(此项只供参考)即使对于可能仅出现在几个代码行中的生存期很短的变量, 仍然使用有意义的名称。 仅对于短循环索引使用单字母变量名,如 i 或 j 。可能的情况下,尽量不要使用原义数字或原义字符串,如 For i = 1 To 7 。而是使用命名常数,如 For i = 1 To NUM_DAYS_IN_WEEK 以便于维护和理解。、代码书写规格式化使代码的逻辑结构很明显。花时间确保源代码以一致的逻辑方式进行格式化,这对于您和你的 开发小组,以及以后维护源代码的其他开发

26、人员都有很大的帮助。以下几点是推荐的格式化方法。? 建立标准的缩进大小(如四个空格),并一致地使用此标准。用规定的缩进对齐代码节。? 在发布源代码的硬拷贝版本时使用特定的字体以及字号(新宋体、小五号)。? 在括号对对齐的位置垂直对齐左括号和右括号,如:for (i = 0; i 100; i+)也可以使用倾斜样式,即左括号出现在行尾,右括号出现在行首,如:for (i = 0; i 100; i+)无论选择哪种样式,请在整个源代码中使用那个样式。沿逻辑结构行缩进代码。没有缩进,代码将变得难以理解,如:if (expression )/ /此处填写你的代码块 /if (expression )/

27、 /此处填写你的代码块/else /此处填写你的代码块;/缩进代码会产生出更容易阅读的代码,如:if (expression )if (expression )/此处填写你的代码块;/ else/此处填写你的代码块;/?为注释和代码建立最大的行长度,以避免不得不滚动源代码编辑器,并且可以提供整齐的硬拷贝表示形式。?在大多数运算符之前和之后使用空格,这样做时不会改变代码的意图。但是,C+中使用的指针表示法是一个例外。?使用空白为源代码提供结构线索。这样做会创建代码 段”,有助于读者理解软件的逻辑分段。?当一行容太长而必须换行时,在后面换行代码中要使用缩进格式,如下:string inserStr

28、ing = Insert Into TableName(username,password,email,sex,address)+ Values(Soholife,chenyp,soholifesina.,male,福田);只要合适,每一行上放置的语句避免超过一条。例外是C、C+、C#或JScript中的循环,如for(i = 0; i 用户名 / returns用户年龄/returns public int GetUserAge( string userName) /此处写你的程序代码/修改代码时,总是使代码周围的注释保持最新。在每个例程的开始,提供标准的注释样本以指示例程的用途、假设和限制

29、很有帮助。注释样本应该 是解释它为什么存在和可以做什么的简短介绍。不过在批注变量声明时,行尾注释是合避免在代码行的末尾添加注释;行尾注释使代码更难阅读。 适的;在这种情况下,将所有行尾注释在公共制表位处对齐。? 避免杂乱的注释,如一整行星号。而是应该使用空白将注释同代码分开。? 避免在块注释的周围加上印刷框。这样看起来可能很漂亮,但是难于维护。? 在部署之前,移除所有临时或无关的注释,以避免在日后的维护工作中产生混乱。? 如果需要用注释来解释复杂的代码节, 请检查此代码以确定是否应该重写它。 尽一切可能不注释难 以理解的代码,而应该重写它。尽管一般不应该为了使代码更简单以便于人们使用而牺牲性能

30、,但必须保持性能和可维护性之间的平衡。? 在编写注释时使用完整的句子。注释应该阐明代码,而不应该增加多义性。? 在编写代码时就注释,因为以后很可能没有时间这样做。另外,如果有机会复查已编写的代码,在今天看来很明显的东西六周以后或许就不明显了。? 避免多余的或不适当的注释,如幽默的不主要的备注。? 使用注释来解释代码的意图。它们不应作为代码的联机翻译。? 注释代码中不十分明显的任何容。? 为了防止问题反复出现,对错误修复和解决方法代码总是使用注释,尤其是在团队环境中。? 对由循环和逻辑分支组成的代码使用注释。这些是帮助源代码读者的主要方面。? 在整个应用程序中,使用具有一致的标点和结构的统一样式

31、来构造注释。? 用空白将注释同注释分隔符分开。 在没有颜色提示的情况下查看注释时, 这样做会使注释很明显且 容易被找到。C# 如何取硬件标志所有 2003-2005发表时间: 2005-1-1 关键字 :未知 using System;using System.Runtime.InteropServices;using System.Management;namespace Hardware/ / Hardware_Mac 的摘要说明。/ public class HardwareInfo/取机器名public string GetHostName()return System.Net.Dns

32、.GetHostName();/ 取 CPU 编号public String GetCpuID()tryManagementClass mc = new ManagementClass(Win32_Processor);ManagementObjectCollection moc = mc.GetInstances();String strCpuID = null ;foreach( ManagementObject mo in moc )strCpuID = mo.PropertiesProcessorId.Value.ToString();break;return strCpuID; ca

33、tchreturn ;/end method/取第一块硬盘编号public String GetHardDiskID()tryManagementObjectSearcher searcher = new ManagementObjectSearcher(SELECT * FROM Win32_PhysicalMedia);String strHardDiskID = null ;foreach(ManagementObject mo in searcher.Get()strHardDiskID = moSerialNumber.ToString().Trim();break;return s

34、trHardDiskID ;catchreturn /endpublic enum NCBCONSTNCBNAMSZ =16,/* absolute length of a net nameMAX_LANA =254,/* lanas in range 0 to MAX_LANA inclusiveNCBENUM =0 x37,/* NCB ENUMERATE LANA NUMBERSNRC_GOODRET =0 x00,/* good returnNCBRESET=0 x32,NCBASTAT=0 x33,NUM_NAMEBUF =30,/* NCB RESET/* NCB ADAPTER

35、STATUS/* Number of NAMEs BUFFER*/*/*/*/*/*/*/StructLayout(LayoutKind.Sequential)public struct ADAPTER_STATUSMarshalAs(UnmanagedType.ByValArray, SizeConst=6) public byte adapter_address;public byte rev_major;public byte reserved0;public byteadapter_type;public byte rev_minor;public ushortduration;pub

36、lic ushortfrmr_recv;public ushortfrmr_xmit;public ushortiframe_recv_err;public ushort xmit_aborts;public uintxmit_success;public uintrecv_success;public ushortiframe_xmit_err;public ushortrecv_buff_unavail;public ushort t1_timeouts;public ushort ti_timeouts;public uint reserved1;public ushortfree_nc

37、bs;public ushortmax_cfg_ncbs;public ushortmax_ncbs;public ushortxmit_buf_unavail;public byte length;public byte length;public byte ncb_retcode;public ushortmax_dgram_size;public ushortpending_sess;public ushortmax_cfg_sess;public ushortmax_sess;public ushortmax_sess_pkt_size;public ushortname_count;

38、StructLayout(LayoutKind.Sequential)public struct NAME_BUFFERMarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ) public byte name;public byte name_num;public byte name_flags;StructLayout(LayoutKind.Sequential)public struct NCBpublic byte ncb_command;public byte ncb_lsn;public byte n

39、cb_num;public IntPtr ncb_buffer;public ushort ncb_length;MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ) public byte ncb_callname;MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ) public byte ncb_name;public bytencb_rto;public bytencb_sto;public IntPtr ncb_post;public bytencb_la

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论