返回信息流最近需要抓几个视频网站视频的tag,我使用C#(HttpWebRequest和HttpWebResponse)来将网页html抓下来,然后再parse DOM来获取tag。但是我发现有些网站的tag是用ajax生成的,所以当抓到网页的时候内容往往没有生成好(比如腾讯视频的tag抓下来都是“读取中...”)。我的想法是发出request以后延迟一会再去获取html,但是现在不知道该怎么去做这个延迟。不知道哪位同学知道的话能不能指教下,先谢了~~
PS:我现在的做法是使用C#里面的控件webBrowser,使用这个控件来download网页,然后再使用webBrowser.Document.Body.OuterHtml,但是这个方法也有问题,就是比较慢。我这边有5个G的数据需要处理,所以这个方法显得比较笨拙了。我第一次用C#,不太熟悉,所以哪位同学能告诉的话真的非常感激~~
这是一条镜像帖。来源:北邮人论坛 / dot-net / #3474同步于 2011/11/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
dotNET机器人发帖
[求助]C#关于抓网页
xiaohaidao
2011/11/13镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
【 在 xiaohaidao 的大作中提到: 】
: 最近需要抓几个视频网站视频的tag,我使用C#(HttpWebRequest和HttpWebResponse)来将网页html抓下来,然后再parse DOM来获取tag。但是我发现有些网站的tag是用ajax生成的,所以当抓到网页的时候内容往往没有生成好(比如腾讯视频的tag抓下来都是“读取中...”)。我的想法是发出request以后延迟一会再去获取html,但是现在不知道该怎么去做这个延迟。不知道哪位同学知道的话能不能指教下,先谢了~~
: PS:我现在的做法是使用C#里面的控件webBrowser,使用这个控件来download网页,然后再使用webBrowser.Document.Body.OuterHtml,但是这个方法也有问题,就是比较慢。我这边有5个G的数据需要处理,所以这个方法显得比较笨拙了。我第一次用C#,不太熟悉,所以哪位同学能告诉的话真的非常感激~~
: --
: ...................
你可以得到AJAX目标页的URL,直接抓取这个URL页生成的内容,当然有些需要构造POST数据包,抓取后的数据再分析是HTML,XML还是JSON,解析想要的东西。
下载后的静态网页,你可以把它当做字符串来处理提取你想要的东西;这些文档的DOM你是知道的,也可以正则抓取,也可以构建静态页也用JS抓取,效率方面,我觉得您抓取的时候肯定是有阻塞,所以可以构建多线程任务(分布式就不扯淡了)。
你好,问题是JS生成的网页,比如我可以在JS的代码里写
$("<div id='div1'></div>").appendTo($("body"));
这样html里就应该多了一个id是div1的div。我现在去抓取这个html,我抓下来的HTML里可能没有id为div1的DOM(因为这个时候JS可能还没有运行完),但是我想抓到div1,现在有什么方法么?
【 在 wangjianzhou 的大作中提到: 】
: : 最近需要抓几个视频网站视频的tag,我使用C#(HttpWebRequest和HttpWebResponse)来将网页html抓下来,然后再parse DOM来获取tag。但是我发现有些网站的tag是用ajax生成的,所以当抓到网页的时候内容往往没有生成好(比如腾讯视频的tag抓下来都是“读取中...”)。我的想法是发出request以后延迟一会再去获取html,但是现在不知道该怎么去做这个延迟。不知道哪位同学知道的话能不能指教下,先谢了~~
: : PS:我现在的做法是使用C#里面的控件webBrowser,使用这个控件来download网页,然后再使用webBrowser.Document.Body.OuterHtml,但是这个方法也有问题,就是比较慢。我这边有5个G的数据需要处理,所以这个方法显得比较笨拙了。我第一次用C#,不太熟悉,所以哪位同学能告诉的话真的非常感激~~
: : --
: ...................
请问静态网页怎么构建,我现在是是用webBrowser这个控件 来下载这个网页
【 在 wangjianzhou 的大作中提到: 】
: : 最近需要抓几个视频网站视频的tag,我使用C#(HttpWebRequest和HttpWebResponse)来将网页html抓下来,然后再parse DOM来获取tag。但是我发现有些网站的tag是用ajax生成的,所以当抓到网页的时候内容往往没有生成好(比如腾讯视频的tag抓下来都是“读取中...”)。我的想法是发出request以后延迟一会再去获取html,但是现在不知道该怎么去做这个延迟。不知道哪位同学知道的话能不能指教下,先谢了~~
: : PS:我现在的做法是使用C#里面的控件webBrowser,使用这个控件来download网页,然后再使用webBrowser.Document.Body.OuterHtml,但是这个方法也有问题,就是比较慢。我这边有5个G的数据需要处理,所以这个方法显得比较笨拙了。我第一次用C#,不太熟悉,所以哪位同学能告诉的话真的非常感激~~
: : --
: ...................
我给你说一个笨办法,可以这样构建静态页抓取,假设你有一个静态页A.HTML,有一个用C#抓取数据页面B.aspx。
举例你要抓url的数据。
A页面构建ajax,post url到B页面,B页面得到url,B调用webBrowser控件抓取url的数据,抓取得到的数据作为这个页面的显示数据,实际上就是url的静态页面html,将这个html作为前边ajax的请求返回。
A得到ajax返回的结果后,采用JS对这个结果做DOM提取或者正则提取即可。
若要对提取的结果做下一步的操作,A页面的js提出想要的数据后,做一个闭包,再构建一个ajax请求,把上步提取的数据post到下一个页面C。
C得到post的数据后,后续操作,如存入数据库等。
Hi,有几个地方没有太明白。
1. 先确定下,B.aspx是运行抓取页面数据的C#程序吗?抓取的目标是A.html吗?
2. 我现在的代码里使用了webbroswer来加载页面。我在B.aspx中webBroswer的DocumentCompleted事件的响应函数加了一个延迟,当webBroswer载入成功以后再等一个时间段再去读取HTML。这个时候可以认为文档的DOM结构已经生成好了
3.我理解你的意思是不是这样:A.html是使用ajax来生成完整的页面文档的,然后B.aspx从A那里获取已经生成好的完整页面文档。我不太理解的是为什么B还要将页面返还给A呢?
不知道我有没有表述清楚~~非常感谢你的帮助
【 在 wangjianzhou 的大作中提到: 】
: 我给你说一个笨办法,可以这样构建静态页抓取,假设你有一个静态页A.HTML,有一个用C#抓取数据页面B.aspx。
: 举例你要抓url的数据。
: A页面构建ajax,post url到B页面,B页面得到url,B调用webBrowser控件抓取url的数据,抓取得到的数据作为这个页面的显示数据,实际上就是url的静态页面html,将这个html作为前边ajax的请求返回。
: ...................
【 在 xiaohaidao 的大作中提到: 】
: Hi,有几个地方没有太明白。
: 1. 先确定下,B.aspx是运行抓取页面数据的C#程序吗?抓取的目标是A.html吗?
: 2. 我现在的代码里使用了webbroswer来加载页面。我在B.aspx中webBroswer的DocumentCompleted事件的响应函数加了一个延迟,当webBroswer载入成功以后再等一个时间段再去读取HTML。这个时候可以认为文档的DOM结构已经生成好了
: ...................
ajax默认下不能跨域抓取,除非特殊更改。
我的意思是,你的A页面抓取你的B页面,因为A和B都是你的一个服务器domain下的,而您的B页面就是webBroswer抓取目标页生成的html。
或者你直接用ajax跨域抓取目标页的html。
延迟也行,但是延迟的时间不好把握,和网速阻塞都有关。
明白了,非常感谢~~
【 在 wangjianzhou 的大作中提到: 】
: : Hi,有几个地方没有太明白。
: : 1. 先确定下,B.aspx是运行抓取页面数据的C#程序吗?抓取的目标是A.html吗?
: : 2. 我现在的代码里使用了webbroswer来加载页面。我在B.aspx中webBroswer的DocumentCompleted事件的响应函数加了一个延迟,当webBroswer载入成功以后再等一个时间段再去读取HTML。这个时候可以认为文档的DOM结构已经生成好了
: ...................