BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / search-engine / #6846同步于 2008/5/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SearchEngine机器人发帖

[求助]如何抓取网页

yingxinghuan
2008/5/6镜像同步15 回复
老师要求从网上(万方)抓一批数据,可是万方的页我实在看不懂,他有一部分是动态生成的,请问有没有人知道如何获得其内容。 http://www.wanfangdata.com.cn/Search/ResourceDataDetailPage.aspx?recordSchema=native.html&database=WFPaperqikan&AID=jsxb200707020&expression=jsxb%2fjsxb2007%2f0707pdf%2f070720.pdf 如果用ie源码中引文部分并没有任何东西 用ff2.0却可以看到。但是用ff也并没有检测到有任何的ajax请求。有没有达人知道他们是怎么做的?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
gl2k机器人#1 · 2008/5/6
大概看了一下,引用了好多动态的js。。。头很大。。。
yingxinghuan机器人#2 · 2008/5/6
关键他的js好像大多都不知道怎么执行的。用ff2.0的firebug单步都没法调,也看不出有什么异步的请求。哪位达人知道有什么爬虫的网站论坛的。
sunmoonstar机器人#3 · 2008/5/6
这个网页是js控制分阶段下载的,所以简单地wget只能得到部分数据。 可以看到这个网页的<body>下有一个超大的<form>,method="post"。 因此要构造表单数据用post方法来获取完整的网页数据。 附件是修改过的网页和分析网页的过程。 把文件保存到本地。 那个修改过的网页左下角有一个button,就是这个button负责激活form的post。 post之后得到的就是具有引用信息的网页。 可以在按这个button时抓下那个POST包,然后按包的格式构造。 就可以抓取所有的相似网页了。 这篇博客文章介绍了http的POST http://blog.csdn.net/jiqimiao/archive/2007/06/08/1644376.aspx http://topic.csdn.net/u/20080306/15/a4d79896-3625-411f-bfdc-b3a0d6cf2649.html POST请求一般是这个格式 ***************************************************** POST http://127.0.0.1/login.do HTTP/1.0 Accept: image/gif, image/jpeg, image/pjpeg, */* Accept-Language: en-us,zh-cn;q=0.5 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Content-Length: 28 \r\n username=admin&password=1234 ***************************************************** HttpConnection 【 在 yingxinghuan 的大作中提到: 】 : 老师要求从网上(万方)抓一批数据,可是万方的页我实在看不懂,他有一部分是动态生成的,请问有没有人知道如何获得其内容。 : http://www.wanfangdata.com.cn/Search/ResourceDataDetailPage.aspx?recordSchema=native.html&database=WFPaperqikan&AID=jsxb200707020&expression=jsxb%2fjsxb2007%2f0707pdf%2f070720.pdf : 如果用ie源码中引文部分并没有任何东西 : ................... 附件(2.5KB) crawl.txt 附件(63.8KB) ResourceDataDetailPage.html
yingxinghuan机器人#4 · 2008/5/7
太感谢了。。确实能这样得到。 再厚着脸皮问另一个问题。如果要程序实现自动抓取,毕竟要去好多的网页啊~你有什么建议(工具,或者是开源的框架)。我现在用的是htmlunit。 【 在 sunmoonstar 的大作中提到: 】 : 这个网页是js控制分阶段下载的,所以简单地wget只能得到部分数据。 : 可以看到这个网页的<body>下有一个超大的<form>,method="post"。 : 因此要构造表单数据用post方法来获取完整的网页数据。 : ...................
sunmoonstar机器人#5 · 2008/5/7
目前没遇到过POST方式抓取网页的。 unix下的wget命令有 --post... 参数,这个提供了传送表单的接口。 首先你能够通过网页内容和url确定这是需要用post下载的页面。 然后实现一个专门函数就可以了。上面的帖子写了下载网页的方法。 您的htmlunit里面应该有post方式的接口。 参考这两个填充http请求中的表单数据。 http://blog.csdn.net/jiqimiao/archive/2007/06/08/1644376.aspx http://topic.csdn.net/u/20080306/15/a4d79896-3625-411f-bfdc-b3a0d6cf2649.html
spidercoco机器人#6 · 2008/5/7
用这个JS可以很方便地抓 大概这样就成 new Ajax.Request(url, {method: 'get', onComplete:successFunc, onFailure:errFunc}); 附件(69.6KB) prototype.js
yingxinghuan机器人#7 · 2008/5/7
谢谢你的热心答复。我按你说的方法没弄通呢。 我的代码如下: package tseg.webmining.dataExtraction; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class TestPost { public static void main(String[] args) throws Exception { URL url = null; BufferedReader in = null; InputStreamReader isr = null; InputStream is = null; HttpURLConnection huc = null; StringBuffer s = new StringBuffer(1000); try { //原网页中的源码中form的请求里 &--》& //已经替换过来了。 url = new URL("http://www.wanfangdata.com.cn/Search/ResourceDataDetailPage.aspx?recordSchema=native.html&database=WFPaperqikan&AID=gdxxhxxb200704025&expression=gdxxhxxb%2fgdxx2007%2f0704pdf%2f070425.pdf"); huc = (HttpURLConnection)url.openConnection(); huc.setRequestMethod("POST"); huc.setDoOutput(true); //写入post的请求。。但是好像错了,在抓包器里并没有抓到 OutputStreamWriter out; out = new OutputStreamWriter(huc.getOutputStream(),"UTF-8"); // 原页面提交了四个参数__VIEWSTATE,__EVENTARGUMENT(为空),//__EVENTTARGET(为空).ctl00$MainContentPlaceHolder$ReferenceAnylyzeControl1$fullDataBtn out.write("ctl00%24MainContentPlaceHolder%24ReferenceAnylyzeControl1%24fullDataBtn=%E6%9F%A5%E7%9C%8B%E5%AE%8C%E6%95%B4%E5%88%86%E6%9E%90%E5%9B%BE");// 输出post数据 // out.write("fullDataBtn="+"查看完整分析图");// 输出post数据 // huc.getOutputStream().flush(); // huc.getOutputStream().close(); out.flush(); out.close(); is = huc.getInputStream(); isr = new InputStreamReader(is,"UTF-8"); in = new BufferedReader(isr); String line = null; while((line = in.readLine()) != null) s.append(line); System.out.println(s); } catch(Exception e) { e.printStackTrace(); } finally { try { huc.disconnect(); is.close(); isr.close(); in.close(); } catch(Exception e) { e.printStackTrace(); } } } } 得到的结果仍然 参考文献 (0篇) 用htmlunit的post请求也一样。 疑惑中…… 【 在 sunmoonstar 的大作中提到: 】 : 目前没遇到过POST方式抓取网页的。 : unix下的wget命令有 --post... 参数,这个提供了传送表单的接口。 : 首先你能够通过网页内容和url确定这是需要用post下载的页面。 : ...................
yingxinghuan机器人#8 · 2008/5/7
谢谢你的回答。 返回结果怎么获取?我js很弱。能不能写个例子。 还有,正如 sunmoonstar所说,网页中只是一个普通的post的请求,可能没有用到ajax的东西。他的页面确实下载了有个ajax的js但好像并没有调用。(firebug中并没有显示多个请求,单步调试时,那个ajax的函数也并没有调用)。 再次谢谢你的建议。 【 在 spidercoco 的大作中提到: 】 : 用这个JS可以很方便地抓 : 大概这样就成 : new Ajax.Request(url, {method: 'get', onComplete:successFunc, onFailure:errFunc}); : ...................
spidercoco机器人#9 · 2008/5/7
哦,我可能没看清你的要求,我那样只是能单纯地异步下载一个页面而已....