小偷&小偷入库&采集入库

  XMLHTTP应用参考

  一、使用步骤:

  1、创建XMLHTTP对象 //需MSXML4.0支持

  2、打开与服务端的连接,同时定义指令发送方式,服务网页(URL)和请求权限等。客户端通过Open命令打开与服务端的服务网页的连接。与普通HTTP指令传送一样,可以用"GET"方法或"POST"方法指向服务端的服务网页。

  3、发送指令。

  4、等待并接收服务端返回的处理结果。

  5、释放XMLHTTP对象

  二、XMLHTTP方法:

  1、XMLHTTP对象

  备注:客户机可以使用XMLHTTP对象发送任意的HTTP请求,接受HTTP应答,还可以对应答的XML文档进行解析。

  Open方法:初始化一个Msxml2.XMLHTTP请求,指定HTTP请求方式、URL以及鉴定信息。

  Open( bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword )

  bstrMethod: 数据传送方式,即GET或POST。

  bstrUrl:   服务网页的URL。

  varAsync:   是否同步执行。缺省为True,即同步执行,但只能在DOM中实施同步执行。用中一般将其置为False,即异步执行。

  bstrUser:   用户名,可省略。

  bstrPassword:用户口令,可省略。

  Send方法:发送HTTP请求到服务器,返回应答。

  语法:

  oXMLHttpRequest.send(varBody)

  说明:此方法是否同步取决于Open方法的varAsync参数。如果设为True则为同步,调用立刻返回,如果设为False调用直到整个应答被接收了才返回。

  setRequestHeader( bstrHeader, bstrvalue )

  bstrHeader:HTTP 头(header)

  bstrvalue: HTTP 头(header)的值

  如果Open方法定义为POST,可以定义表单方式上传:

  xmlhttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded")

  三、XMLHTTP属性:

  onreadystatechange:在同步执行方式下获得返回结果的事件句柄。只能在DOM中调用。

  responseBody:   结果返回为无符号整数数组。

  responseStream:   结果返回为IStream流。

  responseText :   结果返回为字符串。

  responseXML:   结果返回为XML格式数据。

  四、示例:

  < script language="javascript" >

  function getDatal(url){

  var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.4.0";//创建XMLHTTPRequest对象,需MSXML4.0支持 ["MSXML2.XMLHTTP.4.0","MSXML2.DOMDocument.4.0"]

  xmlhttp.open("GET",url,false,"","";   //使用HTTP GET初始化HTTP请求

  xmlhttp.send("";             //发送HTTP请求并获取HTTP响应

  return xmlhttp.responseXML;       //获取XML文档

  }

  < /script >

  现在网上流行的小偷程序比较多,有新闻类小偷,音乐小偷,下载小偷,那么它们是如何做的呢,下面我来做个简单介绍,希望对各位站长有所帮助。

  (一)原理

  小偷程序实际上是通过了XML中的XMLHTTP组件调用其它网站上的网页。比如新闻小偷程序,很多都是调用了sina的新闻网页,并且对其中的html进行了一些替换,同时对广告也进行了过滤。用小偷程序的优点有:无须维护网站,因为小偷程序中的数据来自其他网站,它将随着该网站的更新而更新;可以节省服务器资源,一般小偷程序就几个文件,所有网页内容都是来自其他网站。缺点有:不稳定,如果目标网站出错,程序也会出错,而且,如果目标网站进行升级维护,那么小偷程序也要进行相应修改;速度,因为是远程调用,速度和在本地服务器上读取数据比起来,肯定要慢一些。

  (二)事例

  下面就XMLHTTP在ASP中的应用做个简单说明

  代码: <%

  '常用函数

  '1、输入url目标网页地址,返回值getHTTPPage是目标网页的html代码

  function getHTTPPage(url)

  dim Http

  set Http=server.createobject("MSXML2.XMLHTTP"

  Http.open "GET",url,false

  Http.send()

  if Http.readystate<>4 then

  exit function

  end if

  getHTTPPage=bytesToBSTR(Http.responseBody,"GB2312"

  set http=nothing

  if err.number<>0 then err.Clear

  end function

  '2、转换乱玛,直接用xmlhttp调用有中文字符的网页得到的将是乱玛,可以通过adodb.stream组件进行转换

  Function BytesToBstr(body,Cset)

  dim objstream

  set objstream = Server.CreateObject("adodb.stream"

  objstream.Type = 1

  objstream.Mode =3

  objstream.Open

  objstream.Write body

  objstream.Position = 0

  objstream.Type = 2

  objstream.Charset = Cset

  BytesToBstr = objstream.ReadText

  objstream.Close

  set objstream = nothing

  End Function

  '下面试着调用http://wmjie.51.net/swords的html内容

  Dim Url,Html

  Url="http://wmjie.51.net/swords/"

  Html = getHTTPPage(Url)

  Response.write Html

  %>

  ------------------------------------------------------

  代码:

  '代码]用XMLHTTP读取远程文件

  <%

  Response.Buffer = True

  Dim objXMLHTTP, xml

  Set xml = Server.CreateObject("Microsoft.XMLHTTP"

  xml.Open "GET", "http://wmjie.51.net/swords/diary.rar", False

  xml.Send

  ' Add a header to give it a file name:

  Response.AddHeader "Content-Disposition", _

  "attachment;filename=mitchell-pres.zip"

  ' Specify the content type to tell the browser what to do:

  Response.ContentType = "application/zip"

  ' Binarywrite the bytes to the browser

  Response.BinaryWrite xml.responseBody

  Set xml = Nothing

  %>

  -------------------------------------

  如何写ASP入库小偷程序

  入库小偷的原理也很简单:就是用XMLHTTP远程读取网页的内容,然后根据需要,对读到的内容进行加工(过滤,替换,分类),最后得到自己需要的数据,加入到数据库中。

  首先:我们先用XMLHTTP读取远程网页(我的另一片文章中有介绍)。

  其次:对内容进行过滤,这个是比较关键的步骤,比如说,我要从远程网页上提取出所有url连接,我应该怎么做呢?

  代码:

  ‘这里用的是正则式

  Set objRegExp = New Regexp   '建立对象

  objRegExp.IgnoreCase = True   '大小写忽略

  objRegExp.Global = True       '全局为真

  objRegExp.Pattern = "http://.+?"   '匹配字段

  set mm=objRegExp.Execute(str)   '执行查找,str为输入参数

  For Each Match in mm     '进入循环

  Response.write(Match.Value)   '输出url地址

  next

  然后,我们需要根据需要做一些替换功能,把不必要的数据替换掉,这个比较简单,用Replace函数即可。

  最后,进行数据库操作

  -------------------------------

  一个例子

  代码:

  <%

  On Error Resume Next

  Server.ScriptTimeOut=9999999

  Function getHTTPPage(Path)

  t = GetBody(Path)

  getHTTPPage=BytesToBstr(t,"GB2312"

  End function

  '首先,进行小偷程序的一些初始化设置,以上代码的作用分别是忽略掉所有非致命性错误,把小偷程序的运行超时时间设置得很长(这样不会出现运行超时的错误),转换原来默认的UTF-8编码转换成GB2312编码,否则直接用XMLHTTP组件调用有中文字符的网页得到的将是乱码。

  Function GetBody(url)

  on error resume next

  Set Retrieval = CreateObject("Microsoft.XMLHTTP"

  With Retrieval

  .Open "Get", url, False, "", ""

  .Send

  GetBody = .ResponseBody

  End With

  Set Retrieval = Nothing

  End Function

  '然后调用XMLHTTP组件创建一个对象并进行初始化设置。

  Function BytesToBstr(body,Cset)

  dim objstream

  set objstream = Server.CreateObject("adodb.stream"

  objstream.Type = 1

  objstream.Mode =3

  objstream.Open

  objstream.Write body

  objstream.Position = 0

  objstream.Type = 2

  objstream.Charset = Cset

  BytesToBstr = objstream.ReadText

  objstream.Close

  set objstream = nothing

  End Function

  Function Newstring(wstr,strng)

  Newstring=Instr(lcase(wstr),lcase(strng))

  if Newstring<=0 then Newstring=Len(wstr)

  End Function

  '处理抓取回来的数据需要调用adodb.stream组件并进行初始化设置。%>

  '以下即为页面显示部分

  <%

  Dim wstr,str,url,start,over,city

  '定义一些需要使用到的变量

  city = Request.QueryString("id")

  '程序传回的ID变量(即用户选择的城市)赋给id

  url="http://appnews.qq.com/cgi-bin/news_qq_search?city="&city&""

  '这里设置需要抓取的页面地址,当然你也可以直接指定某个地址而不使用变量

  wstr=getHTTPPage(url)

  '获取指定页面的全部数据

  start=Newstring(wstr," <html>")

  '这里设置需要处理的数据的头部,这个变量应视不同情况而设置,具体内容可以通过查看需要抓取的页面的源代码来确定。因为在这个程序里我们需要抓取整个页面,所以设置为页面全部抓取。注意,设置的内容必须是页面内容唯一的,不可以重复。

  over=Newstring(wstr," </HTML>")

  '和start相对应的就是需要处理的数据的尾部,同样的,设置的内容必须是页面中唯一的。

  body=mid(wstr,start,over-start)

  '设置显示页面的范围

  '下面就是动用乾坤挪移***的时候了,通过replace可以用一些字符替换掉数据中指定的字符。

  body = replace(body,"skin1","天气预报 - 斯克网络")

  body = replace(body,"http://appnews.qq.com/cgi-bin/news_qq_search?city","tianqi.asp?id")

  '本程序中已经完成了替换的工作,如果有其他需要的话可以继续进行类似的替换操作。

  response.write body

  引用: 远程获取内容,并将内容存在本地电脑上,包括任何文件

  <%

  '----------远程获取内容,并将内容存在本地电脑上,包括任何文件!----------

  'On Error Resume Next

  'Set the content type to the specific type that you are sending.

  'Response.ContentType = "IMAGE/JPEG"

  '-------------------------------定义输出格式-----------------------------

  Path=request.querystring("p")

  sPath = Path

  if left(lcase(path),7) <> "http://"; then

  '-------------如果前面没有http就是本地文件,交给LocalFile处理------------

  LocalFile(path)

  else

  '--------------------否则为远程文件,交给RemoteFile处理------------------

  RemoteFile(Path)

  end if

  'Response.Write err.Description

  sub LocalFile(Path)

  '-------------------如果为本地文件则简单的跳转到该页面-------------------

  Response.Redirect Path

  End Sub

  Sub RemoteFile(sPath)

  '-------------------------处理远程文件函数------------------------------

  FileName = GetFileName(sPath)

  '-------------GetFileName为把地址转换为合格的文件名过程-------------

  FileName = Server.MapPath("/UploadFile/Cache/" & FileName)

  Set objFso = Server.CreateObject("Scripting.FileSystemObject")

  'Response.Write fileName

  if objFso.FileExists(FileName) Then

  '--------------检查文件是否是已经访问过,如是,则简单跳转------------

  Response.Redirect "/uploadfile/cache/" & GetFileName(path)

  Else

  '----------------否则的话就先用GetBody函数读取----------------------

  'Response.Write Path

  t = GetBody(Path)

  '-----------------用二进制方法写到浏览器上--------------------------

  Response.BinaryWrite t

  Response.Flush

  '-----------------输出缓冲------------------------------------------

  SaveFile t,GetFileName(path)

  '------------------将文件内容缓存到本地路径,以待下次访问-----------

  End if

  Set objFso = Nothing

  End Sub

  Function GetBody(url)

  '-----------------------本函数为远程获取内容的函数---------------------

  'on error resume next

  'Response.Write url

  Set Retrieval = CreateObject("Microsoft.XMLHTTP")

  '----------------------建立XMLHTTP对象-----------------------------

  With Retrieval

  .Open "Get", url, False, "", ""

  '------------------用Get,异步的方法发送-----------------------

  .Send

  'GetBody = .ResponseText

  GetBody = .ResponseBody

  '------------------函数返回获取的内容--------------------------

  End With

  Set Retrieval = Nothing

  'response.Write err.Description

  End Function

  Function GetFileName(str)

  '-------------------------本函数为合格化的文件名函数-------------------

  str = Replace(lcase(str),"http://";,"")

  str = Replace(lcase(str),"//","/")

  str = Replace(str,"/","")

  str = replace(str,vbcrlf,"")

  GetFileName = str

  End Function

  sub SaveFile(str,fName)

  '-------------------------本函数为将流内容存盘的函数-------------------

  'on error resume next

  Set objStream = Server.CreateObject("ADODB.Stream")

  '--------------建立ADODB.Stream对象,必须要ADO 2.5以上版本---------

  objStream.Type = adTypeBinary

  '-------------以二进制模式打开-------------------------------------

  objStream.Open

  objstream.write str

  '--------------------将字符串内容写入缓冲--------------------------

  'response.Write fname

  objstream.SaveToFile "c:\inetpub\myweb\uploadfile\cache\" & fName,adSaveCreateOverWrite

  '--------------------将缓冲的内容写入文件--------------------------

  'response.BinaryWrite objstream.Read

  objstream.Close()

  set objstream = nothing

  '-----------------------关闭对象,释放资源-------------------------

  'response.Write err.Description

  End sub

  %>