欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-01-25 14:31:21
xmlhttp应用参考  一、使用步骤:  1、创建xmlhttp对象 //需msxml4.0支持  2、打开与服务端的连接,同时定...
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 
%>