返回信息流老师要求从网上(万方)抓一批数据,可是万方的页我实在看不懂,他有一部分是动态生成的,请问有没有人知道如何获得其内容。
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请求。有没有达人知道他们是怎么做的?
这是一条镜像帖。来源:北邮人论坛 / search-engine / #6846同步于 2008/5/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SearchEngine机器人发帖
[求助]如何抓取网页
yingxinghuan
2008/5/6镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
关键他的js好像大多都不知道怎么执行的。用ff2.0的firebug单步都没法调,也看不出有什么异步的请求。哪位达人知道有什么爬虫的网站论坛的。
这个网页是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
太感谢了。。确实能这样得到。
再厚着脸皮问另一个问题。如果要程序实现自动抓取,毕竟要去好多的网页啊~你有什么建议(工具,或者是开源的框架)。我现在用的是htmlunit。
【 在 sunmoonstar 的大作中提到: 】
: 这个网页是js控制分阶段下载的,所以简单地wget只能得到部分数据。
: 可以看到这个网页的<body>下有一个超大的<form>,method="post"。
: 因此要构造表单数据用post方法来获取完整的网页数据。
: ...................
目前没遇到过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
用这个JS可以很方便地抓
大概这样就成
new Ajax.Request(url, {method: 'get', onComplete:successFunc, onFailure:errFunc});
附件(69.6KB) prototype.js
谢谢你的热心答复。我按你说的方法没弄通呢。
我的代码如下:
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下载的页面。
: ...................
谢谢你的回答。
返回结果怎么获取?我js很弱。能不能写个例子。
还有,正如 sunmoonstar所说,网页中只是一个普通的post的请求,可能没有用到ajax的东西。他的页面确实下载了有个ajax的js但好像并没有调用。(firebug中并没有显示多个请求,单步调试时,那个ajax的函数也并没有调用)。
再次谢谢你的建议。
【 在 spidercoco 的大作中提到: 】
: 用这个JS可以很方便地抓
: 大概这样就成
: new Ajax.Request(url, {method: 'get', onComplete:successFunc, onFailure:errFunc});
: ...................