C++如何抓取js动态生成的网页

饕餮之怒 发布于 2013/04/05 16:34
阅读 2K+
收藏 1

环境:windows下使用libcurl编程,vs2010

想抓取bbs.byr.cn论坛上的帖子题目,如图所示

url链接为:http://bbs.byr.cn/#!board/Feeling?p=1


发现图中的红框部分为js动态生成的,直接访问上述url的源代码中并没有此部分的html源码。


我应该如何抓取这个论坛中由js动态生成的网页呢?


ps:在网上看到一个答案,每一个动态加载都是有他相关的url或者参数的,如果你能找到的话,直接模拟请求他那个url就能得到内容了

但对这一段话不太理解,是指直接访问动态加载的URL吗?由于我对js很陌生,不知道如何寻找动态加载的URL,有什么方法可以快速的找到吗?

加载中
0
longrmlife
longrmlife
刚研究了下,这个站对类似/Feeling?p=2这样的请求做了过滤处理,如果不是通过ajax发送过来的,就直接返回首页信息了,只有是ajax发送过来的请求,才会正确返回内容。只需要在抓取的时候,请求头里增加 X-Requested-With: XMLHttpRequest 就可以了
饕餮之怒
我想我可能知道原因了,是否需要源操作为异步的??我原来的方式是同步的
饕餮之怒
chunk = curl_slist_append( chunk , "X-Requested-With:XMLHttpRequest"); 添加的字符串X-Requested-With:XMLHttpRequest是这样写的吗?
饕餮之怒
多出来的是TCP传过来的HTTP头
饕餮之怒
@longrmlife 难道是我写错了?我加了之后多出来的是这一部分的信息:HTTP/1.1 200 OK Date: Fri, 05 Apr 2013 13:30:05 GMT Server: Apache/2.2.21 (Unix) PHP/5.3.10 X-Powered-By: PHP/5.3.10 Set-Cookie: nforum[UTMPUSERID]=guest; path=/; domain=bbs.byr.cn Set-Cookie: nforum[UTMPKEY]=63699723; path=/; domain=bbs.byr.cn Set-Cookie: nforum[UTMPNUM]=25824; path=/; domain=bbs.byr.cn Vary: Accept-Encoding Transfer-Encoding: chunked Content-Type: text/html;charset=GBK
longrmlife
longrmlife
回复 @饕餮之怒 : 加了后返回的结果就是你这里标记的红色框里的内容啊
下一页
0
longrmlife
longrmlife
需要模拟浏览器的js引擎,去执行js脚本哦,比如webkit之类的
longrmlife
longrmlife
回复 @饕餮之怒 : 这个网站的js太多了。。。。。得费功夫去研究了
饕餮之怒
回复 @longrmlife : js小白。。有什么办法可以知道js动态加载的url链接吗?好像这个网页动态加载的内容是由另外一个url链接提供的
longrmlife
longrmlife
回复 @饕餮之怒 : 那你就好好琢磨琢磨这个js是怎么弄出来的,然后写java代码模拟它。。。
饕餮之怒
模拟浏览器引擎感觉太麻烦了,我目前这个小程序只抓取bbs.byr.cn这个论坛,有什么简便的方法吗
0
火眼金睛容嬷嬷
火眼金睛容嬷嬷
bbs啊?你 Socket去抓内容可能比爬web更快吧。
饕餮之怒
@袁国涛 telent端的程序做过了,但感觉功能更不上,于是改用web抓取
火眼金睛容嬷嬷
火眼金睛容嬷嬷
回复 @饕餮之怒 : 你大概没有用telnet上过bbs吧?telnet bbs.byr.cn 没有js,没有css,没有html
饕餮之怒
使用socket返回的数据会有js动态加载的内容?
0
布谷鸟
布谷鸟

站没有看,但是通常js的数据展示都是ajax的吧?如此找到地址就行了。

使用firefox+firebug插件,在firebug窗口的网络面板里会有js 异步请求的路径,即是内容的输出地址,照这个地址爬下来就行了

饕餮之怒
thanks,这款插件非常好用
0
toil
toil
分析ajax
qycms_cn
qycms_cn
这个是最好的。
0
qycms_cn
qycms_cn
python 的scrapy完全可以胜任。
0
longrmlife
longrmlife
那一堆的js其实可以不用管的
0
longrmlife
longrmlife
不知道C++里是怎么抓取的,java的话用HttpClient很方便,声明一个HttpGet,然后设置请求头(setHeaders),再用client.excute(hp)就可以了
饕餮之怒
讨论一个其他话题,url链接里面的#!有什么作用?不加和加了之后是相同的么。。
饕餮之怒
回复 @longrmlife : 解决了。。昨天设置的时候有个参数弄错了。。谢谢
longrmlife
longrmlife
回复 @饕餮之怒 : get请求发送之前需要先设置请求头的
饕餮之怒
自己抓包了才发现发出去的http请求里面没有添加http头,原因还在寻找到。。 明天弄,晚安~
返回顶部
顶部