时 间 记 忆
<<  < 2008 - >  >>
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
最 新 评 论
专 题 分 类
最 新 日 志
最 新 留 言
搜 索
用 户 登 录
友 情 连 接
博 客 信 息
  • 日志:3
  • 评论:0
  • 留言:0
  • 访问:


 
10年软件开发经历
[ 2008-1-9 10:19:00 | By: qnzu211 ]
 
最近一段时间,采集很热门,从新闻小偷,到音乐小偷,到新闻采集,Flash采集,都有他的踪影,现在还有很多的人对采集都很感兴趣,为了服务大家,我也正在写一套采集程序,名字为心意采集程序,现在我讲一下,采集用到的相关技术。

下面讲到的也不是很高深的XMLHTTP技术,我也是稍稍讲一下,一个采集需要用到的几块内容
如果你需要了解更多的问题,请去www.google.com搜索XMLHTTP技术你将会得到更多的帮助,如果大家有什么疑问的话,可以在论坛上回贴
下面只讲到如何在网上得到数据,并不涉及到数据处理
第一XMLHTTP技术
http://www.0579.info/study/exploitation/net/58685.htm
上面那个地址,那篇文章讲的根本原理已经很详细了,但是我们一般采集的话,刚开始不太需要了解太多。只要实用就可以了,等以后不够用的时候,再去找相关文档也来得急
首先,我们需要建立一个XMLHTTP对象
微软发布的xmlhttp组件已经有很多的版本了,我知道的就有以下几种:
"MSXML2.ServerXMLHTTP.4.0"
"MSXML2.ServerXMLHTTP.3.0"
"MSXML2.ServerXMLHTTP"
"MSXML2.XMLHTTP.5.0"
"MSXML2.XMLHTTP.4.0"
"MSXML2.XMLHTTP.3.0"
"MSXML2.XMLHTTP"
"Microsoft.XMLHTTP

以上有这么多种组件,我们当然是需要申请最高版本的对象喽,那有什么办法可以实现呢
下面我拿出一段代码,大家可以看看,他是按最高版本申请XMLHTTP对象的
DimArrProgId,Prog,Flag,XmlHttpCom
ArrProgId=array("MSXML2.ServerXMLHTTP.4.0","MSXML2.ServerXMLHTTP.3.0","MSXML2.ServerXMLHTTP","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP")
ForEachProgInarrProgId
If(IsObjInstalled(Prog)=true)Then
XmlHttpCom=Prog
ExitFor
EndIf
Next

'//
'// Rem检查组件是否支持 是返回 True否返回False
'//

PublicIsObjInstalled(strClassString)
ResumeNext
'//设置初始化值
IsObjInstalled=False
Err=0
'//测试代码
DimxTestObj
SetxTestObj=Server.createObject(strClassString)
If0=ErrThenIsObjInstalled=True
'//清除所申请的对象
SetxTestObj=Nothing
Err=0
End

上面那段代码就是申请到当前服务器支持的最高版本的XMLHTTP对象了
下面我们讲一下采集功能函数

'GetFileText为采集功能函数
PublicGetFileText(url)
resumenext'有错误时继续执行代码
Dimhttp'定义变量
'Sethttp=Server.createobject(XmlHttpCom)'申请对象
Sethttp=Server.createobject("Microsoft.XMLHTTP")'保险起见,写出一个服务器一般都支持的版本
Http.open"GET",url,False'打开对象用GET方式等待服务器响应
Http.Send()'发送
IfHttp.readystate<>4Then'如果服务器没反应,则退出函数
Exit
EndIf
GetFileText=bytes2BSTR(Http.responseBody,"GB2312")'把得到的数据流二进制文件转化成文本字符格式(GB2312)
Sethttp=Nothing'删除对象
Iferr.number<>0Thenerr.Clear'如果有错误,清除错误
End

'//
'//采用ADODB.Stream 处理采集到的数据,把二进制的文件转成文本字符
'//

Bytes2bStr(vin,cSet)
DimBytesStream,StringReturn
SetBytesStream=Server.createObject("ADODB.Stream")
BytesStream.Type=2
BytesStream.Open
BytesStream.WriteTextvin
BytesStream.Position=0
BytesStream.CharSet=cSet
BytesStream.Position=2
StringReturn=BytesStream.ReadText
BytesStream.close
SetBytesStream=Nothing
Bytes2bStr=StringReturn
End

下面我定义一个路径变量URL
URL="http://ent.sina.com.cn/star/mainland/more.html";
上面是一个网址,如果我们想把上面这个地址采集下来,并显示出来的话,我们可以这样操作

URL="http://ent.sina.com.cn/star/mainland/more.html";
Response.WriteGetFileText(URL)

这样就可以采集到上面网址的内容了
是不是很简单呢
那采集到数据之后应该怎么操作呢
怎么区分数据,如果得到你想要的数据,如果把得到的数据入库呢
这是以后需要分析讲解的问题了入库要注意的地方,用正表达式处理数据

附上上面代码的源文件,大家可以下载下去,运行起来试试,是不是真的能采集到数据库
用HttpWebRequest和正则表达式提取网页中的链接


   开发工具:Microsoft Visual Studio .NET 2003
   操作系统:Windows XP

  题记 : 提取网页链接有什么用?比如,你可以做网页地址搜集器,办公用品邮件地址搜集器,图片或Flash搜集器等等。如何用最高效快捷的方式提取网页中的链接地址,这正是本文所要探讨的。

提 取网页链接地址有多种方式。在VS.NET开发环境下,总的是通过两种方式:
   一.用AxWebBrowser控件。电炉等网页加载完,然后提取其中的链接。
   二.不用AxWebBrowser控件的方式,先取得网页源代码,上海保洁然后提取其中的链接。
   本人早先是用第一种方式,第一种方式要先等网页加载完毕,浏览器会下载许多无关的内容,国际快递速度较慢。因此,推荐用本文介绍的方式,用HttpWebRequest结合正则表达式取得网页中的链接。
   本文分以下几个步骤:
   用HttpWebRequest学车取得网页源代码
   用正则表达式取得链接地址
   去除重复地址
   保存为XML

用HttpWebRequest取得网页源代码
Dim url As String=" http://www.Tuenhai.com " ' 这是tuenhai的小站,有空来坐坐
Dim httpReq As System.Net.HttpWebRequest  
Dim httpResp As System.Net.HttpWebResponse
Dim httpURL As New System.Uri(url)
httpReq = CType(WebRequest.Create(httpURL), HttpWebRequest)
httpReq.Method = "GET"
httpResp = CType(httpReq.GetResponse(), HttpWebResponse)
httpReq.KeepAlive = False ' 获取或设置一个值,上海公兴搬场该值指示是否与 Internet 资源建立持久连接。

Dim reader As StreamReader = _
New StreamReader(httpResp.GetResponseStream, System.Text.Encoding.GetEncoding("GB2312"))
Dim respHTML As String = reader.ReadToEnd() 'respHTML就是网大众搬场公司页源代码

  是不是很简单?
   对于概念的理解,在MSDN中有极详细的介绍,请在VS.NET 2003中点击“帮助”,上海地毯清洗再点击“搜索”,然后输入类名,如HttpWebRequest,一回车,就什么资料都有了。办公室装潢对于下面碰到的编程概念,如有不理解的,也请先搜索MSDN,不再重复说明。


用正则表达式取得链接地址

Dim strRegex As String = "http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?" '减震器这就是表达式
Dim r As System.Text.RegularExpressions.Regex
Dim m As System.Text.RegularExpressions.MatchCollection
r = New System.Text.RegularExpressions.Regex(strRegex, System.Text.RegularExpressions.RegexOptions.IgnoreCase)   
m = r.Matches(respHTML)
Dim i As Integer
For i = 0 To m.Count - 1
     form1.DefInstance.ListBox1.Items.Add(m(i).) 'form1.DefInstance是form1的共享属性和实例
Next i  
form1.DefInstance.ListBox.Visible = True ' 设置ListBox为可见
form1.DefInstance.ListBox.Sorted = True ' 对ListBox各元素进行排序

form1.DefInstance.ListBox1.Items.Add(m(i).) 'form1.DefInstance是form1的共享属性和实例, 高压软管共享成员如果是方法或属性,我们不用创建实例就可以直接用空运公司‘类名 .共享成员'的方法进行调用。设置方法如下:

Private Shared m_vb6FormDefInstance As form1
Public Shared Property DefInstance() As form1
   Get
     If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then '判断窗体实例是否存在
       m_vb6FormDefInstance = New form1
     End If
     DefInstance = m_vb6FormDefInstance
   End Get
   Set(ByVal As form1)
     m_vb6FormDefInstance =
   End Set
End Property




去除重复地址

Dim countForms As Integer '以下代码去除重复地址
Dim lstForms() As String
Dim CurId As Integer
With formBrow.DefInstance.ListBox1
   ReDim Preserve lstForms(0)
   lstForms(0) = .Items(0) '新数组的第一项和list的第一项相同
   For countForms = 1 To .Items.Count - 1 'items.count得到list1中的项目数
     CurId = UBound(lstForms) 'curid为newlist中有项目数
     If .Items(countForms) <> lstForms(CurId) Then '如果旧表第二项不等于新表最大项
       ReDim Preserve lstForms(CurId + 1) '定位到新表第二项
       lstForms(CurId + 1) = .Items(countForms) '新表第二项等于旧表第二项
     End If
   Next countForms
   .Ite ms.Clear() '删除旧表所有项
   For countForms = 0 To UBound(lstForms) '把新表写入旧表
     .Items.Add(lstForms(countForms))
   Next countForms
End With


            把地址导出为XML

可扩展标记语言 (XML) 是一种提供数据描述格式的标记语言。家庭装潢该语言使跨越多个平台进行更准确的内容声明和获得更有意义的搜索结果变得更加容易。此外,XML 实现了表示与数据的分离。例如,在 HTML 中,使用标记来告诉浏览器将数据显示为粗体或斜体;而在 XML 中,标记只用于描述数据,例如城市名、温度和大气压。在 XML 中,使用样式表(例如,可扩展样式表语言 (XSL) 和层叠样式表 (CSS))在浏览器中显示数据。XML 使数据与表示及处理分离开来,通过应用不同的样式表和应用程序,使您能够根据需要显示和处理数据。

  XML 是为在 Web 上传送而进行优化了的 SGML 的子集。开平机它是由万维网联合会 (W3C) 定义的。该标准化确保了结构化数据的统一性和相对于应用或供应商的独立性。

  XML 是 Visual Studio .NET 和 .NET work 的很多功能的核心。硬度计XML 是可用于许多不同应用程序的格式,我们可将搜集到的链接保存为XML。
XmlTextWriter 是 XmlWriter 类的实现,该类提供将 XML 写入文件、流或 TextWriter 的 API。该类有许多验证和检查规则,以确保所编写的 XML 的格式正确。当与某些规则发生冲突时,将会引发异常,并且这些异常应该被捕获。XmlTextWriter 有不同的构造函数,每个函数指定写入 XML 数据的不同类型的位置。下面代码使用的是将 XML 写入文件的构造函数。
   首先使用 Formatting 属性指定正被编写的 XML 数据的格式。金相显微镜通过将此属性设置为 Indented,编写器使用 Indentation 和 IndentChar 属性缩进子元素。
   代码显示了与每个 XML 节点类型相对应的 XML 编写方法。例如,上海租车编写一个元素将调用 WriteElementString 方法,编写一个属性将调用 WriteAttributeString 方法。对于嵌套级别,可以使用 WriteStartElement/WriteEndElement 对;如果要创建较复杂的属性,则可以使用 WriteStartAttribute/WriteEndAttribute 对。
请注意代码如何使用 WriteStartDocument 方法编写带版本号“1.0”的 XML 声明。实验台如果要让编写器检查该文档的格式是否正确(先是 XML 声明,序言中的 DOCTYPE,只有一个根级别元素,等等),超薄灯箱您必须在调用任何其他编写方法之前,调用此可选的 WriteStartDocument 方法。接着,此代码调用 WriteDocType 方法编写名为“urls”的文档类型。WriteDocType 调用中的第三个参数指定编写器将编写 SYSTEM“urls.dtd”。编写完成后,XML 文件指示有一个要根据其进行验证的外部 DTD。

  最后,代码调用 Flush 方法将 XML 数据保存到文件,EPE珍珠棉然后才调用 Close 方法。(虽然此示例确实只需要 Close 方法,但是也存在这样的情况,即需要保存所生成的 XML,并且需要重复使用编写器。)

  要检查 XmlTextWriter 的输出,可通过用 XmlTextReader 读取生成的文件来执行往返测试,以验证 XML 的格式是正确的。
Private Sub s***eXml()
   Dim s***eFileDialog1 As New S***eFileDialog
   s***eFileDialog1.Filter = "xml|*.xml"
   s***eFileDialog1.Title = "S***e a xml File"
   s***eFileDialog1.ShowDialog()
   If s***eFileDialog1.FileName <> "" Then  '如果文件名不等于空白
     Dim fileName As String = s***eFileDialog1.FileName  
     If Not System.IO.File.Exists(fileName) Then  '如果不存在同名文件

  Dim myXmlTextWriter As XmlTextWriter = New XmlTextWriter(fileName, Nothing)
       myXmlTextWriter.Formatting = System.Xml.Formatting.Indented  '设置缩进
       myXmlTextWriter.WriteStartDocument(False)
       myXmlTextWriter.WriteDocType("urls", Nothing, "urls.dtd", Nothing)
       myXmlTextWriter.WriteComment("This file s***e the Urls")  '注释
       myXmlTextWriter.WriteStartElement("urls")      '开始元素
       myXmlTextWriter.WriteStartElement("url1", Nothing)  '开始元素
       myXmlTextWriter.WriteAttributeString("now", Now)   '在属性里记录时间
       For countAll As Integer = 0 To ListBox1.Items.Count - 1
         Dim title As String = Strings.Right(ListBox1.Items.Item(countAll), 3)  '取URL后三字
         Dim body As String = lstMuLu.Items.Item(countAll)       
         myXmlTextWriter.WriteElementString(title, Nothing, body)
       Next
       myXmlTextWriter.WriteEndElement()   
       myXmlTextWriter.WriteEndElement()

  'Write the XML to file and close the myXmlTextWriter
       myXmlTextWriter.Flush()
       myXmlTextWriter.Close()

     End  If
   End If
End Sub


软件开发,创意是灵魂

在软件开发实践中,真正让我们感到贫乏的,永远不会是技术,而是创意。
   创意,是软件开发的灵魂。
   随着开发工具的升级,进化,复印机软件开发越来越象搭积木。我们更多的是学习开发工具的使用,而不是自己编写底层代码——许多底层代码,开发工具已经为我们代劳了。
这么说并不是tuenhai对软件开发有多精通。转向箱事实上,tuenhai从2003年10月开始自学编程(VB6),11月转到VS.NET。2004年1月,完成tuenhai的第一个软件 AdKing 。
只要学习方法得当,掌握技术并不是难事。减速器这在tuenhai的第一篇VS.NET文章 《VS.NET学习方法论》 中有所论述。
   每个搞软件开发的人不妨自问一下
减速机
(自然包括tuenhai了),自己在软件开发中的创意如何?你能保证通过你的创意已经把你所掌握的技术发挥得淋漓尽致了吗?你在每天大量编写CODE的同时,有多少时间用于思考创意?

以本文代码举例,发挥您的创意,可以编写多少个应用软件?
   这么说,并不是要您编写多少个应用软件。
   您能列出大量软件项目、方案,开水器自然能从中挑选出适合您的最佳方案。
   一即是多。
   磨刀不误砍柴工。
   以《 用正则表达式取得链接地址》为例,上海租车只要灵活改变strRegex表达式的值,我们可以从网页源代码中任意提取我们想要的东东。如果你要开发邮件地址搜集器,strRegex = " [\w-]+@([\w-]+\.)+[\w-]+ " 即可。如果要搜集Flash呢?
   如果您能列出50种方案,请来信告诉tuenhai。如果你列出的方案比tuenhai多,I fu le u,tuenhai拜您为师。

 
 

发表评论:

    大名:
    密码: (游客无须输入密码)
    主页:
    标题:
Powered by Oblog.