最近一直在编写一款电影管家程序,其中有个功能就是:
用户输入一个关键字(一般是电影名),然后程序就自动到某网站(保密,免得被河蟹 )采集所需的数据,其实就是用代码去下载网页源码,然后要么正则,要么直接字符串数组解析。
现在最最难的地方就是:这个电影网站是Ajax构架的,网页源码用常规方法直接获取的话,根本得不到完整的源码或者能得到处理起来也繁琐(Webbrowser控件),动态加载的部分还在娘胎里呢
注:
一般的得网页源码常规方法:
1.Inet控件(得不到完整源码)
2.Webbrowser控件(可以得到,但是处理繁琐,老是判断不好是否完全加载)
3.Winsock控件(得不到完整源码)
4.XmlHtpp组件(得不到完整源码)
5.API直接下载远程网页(一样得不到完整源码)
6....
好了,废话不多说了,那怎么样既能得到完整我源码,又处理起来非常方便呢?
我在网上也找了好久好久了,百度、谷歌...都没能找到有效的解决方案,今天突然直接灵感一现,想到了一种目前算非常完美的解决方法。既然Webbrowser控件能加载完整的源码,那我自然就想到了咱们每天在用的IE浏览器了(我现在用的是谷歌浏览器Chrome )
我们的IE和Webbrowser有着相当紧密的联系,具体多紧密那就要问问微软了,有木有?
用com对象动态创建技术,即可在VB程序中创建一个IE,然后访问需要的网址,等待加载完毕,然后就可以十分方便地得到完整的源码,是不是很诱人啊?呵呵...
现在给出核心源码:
Function GetFullHtml(vURL As String) As String
Dim ie As Object
Dim element As Object
Set ie = CreateObject("InternetExplorer.Application")
With ie
.Visible = False
.navigate vURL
Do Until .Readystate = 4
DoEvents
Loop
GetFullHtml = .Document.body.innerhtml
End With
Set ie = Nothing
End Function
呵呵,怎么样?以上简短的代码几乎可以解决所有网页源码的下载难题!最重要的是:它可以突破Ajax!
好了,诚接板砖中...
30 个解决方案
#1
沙发岂可拱手让人?
#2
太消耗资源了。
#3
嗯,是块好砖!呵呵,不过,下载网上资源,又不耗的资源的,恐怕不多,呵呵
#4
再怎么耗,也跟你开个网页卡得差不多。呵呵
#5
忘记说了,上面的代码可以用到ASP采集上!(使用前确认你的服务器安装了ie,并且支持你的调用)
#6
楼主这贴应该发到非技术区去,真幽默。。。
#7
此话怎讲?
#8
收藏一下
赞扬楼主高风亮节
赞扬楼主高风亮节
#9
幽默贴,确实应转非技术区,呵呵
#10
楼主的代码真的可行么?有些是页面打开后十几秒后才开始执行的一段ajax的,延时是通过js来的。
#11
思路不错.
顶顶.
顶顶.
#12
mark 楼主高风亮节
#13
谢谢老马来捧场
#14
ie8下测试,很多时候状态不是4,导致死循环。
#15
直接用webbrowser跟这个有什么区别???不明白。。还没有webbrowser方便
#16
那段"核心"代码N多年前就曾被用烂了的,会产生问题。你说的这个情况就是最致命的缺陷之一。它用来做一些外部登录大网站的信箱之类的小软件还可以,因为大网站通常不会产生意外状况造成死循环。这也是我说LZ很幽默的原因,呵呵。
其实,抓取其他网页内容,最可靠的还是微软的xmlhttp组件,后来被WEB开发的客户端发扬光大称之为AJAX。
而且对于小偷程序难搞的也正是页面加载完成后采用AJAX读取某些文件填充到网页的指定板块。遇到这种情况,只有使用工具追踪客户端AJAX指向的网址,继续用XMLHTTP提取,基本可以避免跨域问题出现。
#17
锅来蹭点非技术分……
#18
我当是什么呢,白瞎了
#19
顶了再说
#20
确实经常会陷入死笔循环中,呵呵!
#21
获得了网页,还需要判断charset,然后进行编码转换。
#22
本人用过Inet和API方式,但都有问题。
#23
阿贵归来,先顶一下.
不同的网页会有不同的方法.
不同的网页会有不同的方法.
#24
的确如此,个人认为还是xmlhttp最靠谱,而且速度应该也快些。
#25
........
#26
结贴
#27
不过,无论怎么样,上头的代码确实是我目前在用的自己认为最好的代码了。其它的都不行。
#28
过来学习一下,还看得不太懂...
#29
如何用VB同时采集5000个地址(翻页采集很慢)联系:qq 403450321
#30
代码收藏了,不过楼主说xmlhttp得不到完整源码,这个是不可能的。还有所谓ajax其实是可以通过截取head信息得到实际内容地址的。xmlhttp我一直在用,很少有不能采集的网页。
#1
沙发岂可拱手让人?
#2
太消耗资源了。
#3
嗯,是块好砖!呵呵,不过,下载网上资源,又不耗的资源的,恐怕不多,呵呵
#4
再怎么耗,也跟你开个网页卡得差不多。呵呵
#5
忘记说了,上面的代码可以用到ASP采集上!(使用前确认你的服务器安装了ie,并且支持你的调用)
#6
楼主这贴应该发到非技术区去,真幽默。。。
#7
此话怎讲?
#8
收藏一下
赞扬楼主高风亮节
赞扬楼主高风亮节
#9
幽默贴,确实应转非技术区,呵呵
#10
楼主的代码真的可行么?有些是页面打开后十几秒后才开始执行的一段ajax的,延时是通过js来的。
#11
思路不错.
顶顶.
顶顶.
#12
mark 楼主高风亮节
#13
谢谢老马来捧场
#14
ie8下测试,很多时候状态不是4,导致死循环。
#15
直接用webbrowser跟这个有什么区别???不明白。。还没有webbrowser方便
#16
那段"核心"代码N多年前就曾被用烂了的,会产生问题。你说的这个情况就是最致命的缺陷之一。它用来做一些外部登录大网站的信箱之类的小软件还可以,因为大网站通常不会产生意外状况造成死循环。这也是我说LZ很幽默的原因,呵呵。
其实,抓取其他网页内容,最可靠的还是微软的xmlhttp组件,后来被WEB开发的客户端发扬光大称之为AJAX。
而且对于小偷程序难搞的也正是页面加载完成后采用AJAX读取某些文件填充到网页的指定板块。遇到这种情况,只有使用工具追踪客户端AJAX指向的网址,继续用XMLHTTP提取,基本可以避免跨域问题出现。
#17
锅来蹭点非技术分……
#18
我当是什么呢,白瞎了
#19
顶了再说
#20
确实经常会陷入死笔循环中,呵呵!
#21
获得了网页,还需要判断charset,然后进行编码转换。
#22
本人用过Inet和API方式,但都有问题。
#23
阿贵归来,先顶一下.
不同的网页会有不同的方法.
不同的网页会有不同的方法.
#24
的确如此,个人认为还是xmlhttp最靠谱,而且速度应该也快些。
#25
........
#26
结贴
#27
不过,无论怎么样,上头的代码确实是我目前在用的自己认为最好的代码了。其它的都不行。
#28
过来学习一下,还看得不太懂...
#29
如何用VB同时采集5000个地址(翻页采集很慢)联系:qq 403450321
#30
代码收藏了,不过楼主说xmlhttp得不到完整源码,这个是不可能的。还有所谓ajax其实是可以通过截取head信息得到实际内容地址的。xmlhttp我一直在用,很少有不能采集的网页。