返回信息流rt
http://ckrd.cnki.net/grid20/Navi/catalog.aspx?NaviID=2000&Field=%E4%B8%93%E9%A2%98%E5%AD%90%E6%A0%8F%E7%9B%AE%E4%BB%A3%E7%A0%81&Value=A006_1%3f&NaviLink=%E7%90%86%E5%B7%A5A(%E6%95%B0%E5%AD%A6%E7%89%A9%E7%90%86%E5%8A%9B%E5%AD%A6%E5%A4%A9%E5%9C%B0%E7%94%9F)-%2fgrid20%2fNavi%2fMultiNavi.aspx%3fNaviID%3d2000%26Grade%3d2%26Field%3dSYS_FLD_SYS_CODE%26Value%3d0001%3f|%E7%94%9F%E7%89%A9%E5%AD%A6+%3E+%E7%94%9F%E7%89%A9%E7%A7%91%E5%AD%A6%E6%80%BB%E8%AE%BA
从上一个网页进去想抓取 第二个页的内容 链接如下
http://ckrd.cnki.net/grid20/detail.aspx?QueryID=54&CurRec=2
用浏览器能成功访问,但是用程序 显示。
alert('您还没有登录或登录后长时间没有操作,请您重新登录后再进行操作!');
目标页的链接用其他另外的浏览器(新程序)打开也会出现如此结果。
可以看到目标页,的url很短,具体网站是怎么弄的?
我试过设置cookie了,并没有成功。(有点怀疑是cookie的设置没对)但是抓包显示的请求是有cookie的。
也与Referer 无关。请高手指点。
这是一条镜像帖。来源:北邮人论坛 / search-engine / #7225同步于 2008/9/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SearchEngine机器人发帖
抓取Cnki网页的问题
yingxinghuan
2008/9/17镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我附上了我的抓包结果:
【 在 sunmoonstar 的大作中提到: 】
: 你在windows下抓包可以用sniffer
附件(3.5KB)
看了下cookies
只传递了个sessionid
看来就是用session来做的了
当你访问列表页面(url很长的那个页面)的时候,服务器会给session中某个key赋于一个value
当访问详细信息(url很短的那个页面)的时候,服务器检查session中此key的value
如果无value或value不为期望值,则提示登录
相当感谢呢~
那怎样才能成功获得网页呢?
嘿嘿我用HTTPAnalyzer抓的。
【 在 nonsense 的大作中提到: 】
: 看了下cookies
: 只传递了个sessionid
: 看来就是用session来做的了
: ...................
很诡异,昨天和今天又两次都成功请求到了页面。什么代码都不改再运行就又
alert('您还没有登录或登录后长时间没有操作,请您重新登录后再进行操作!');
后悔当时没抓下包来。
【 在 yingxinghuan 的大作中提到: 】
: 相当感谢呢~
: 那怎样才能成功获得网页呢?
: 嘿嘿我用HTTPAnalyzer抓的。
【 在 yingxinghuan 的大作中提到: 】
: 很诡异,昨天和今天又两次都成功请求到了页面。什么代码都不改再运行就又
: alert('您还没有登录或登录后长时间没有操作,请您重新登录后再进行操作!');
: 后悔当时没抓下包来。
晚上回来,写代码抓了一下
大概明白了是怎么回事
文章的url是如下形式
http ://ckrd.cnki.net/grid20/detail.aspx?QueryID=68&CurRec=1
也就是由QueryID和CurRec来定位每一篇文章
但要注意的是,这个url是临时生成的,也就是说,在不同的时刻访问(sessionid不同),看到的同一片文章url是不同的。
如果向服务器请求的文章的url跟sessionid不对应,服务器就会返回脚本提示重新登陆
public class Program
{
static void Main(string[] args)
{
string html = string.Empty;
CookieContainer container = new CookieContainer();
Uri rootURI = new Uri(@"http://ckrd.cnki.net/grid20/Navi/catalog.aspx?NaviID=2000&Field=%e4%b8%93%e9%a2%98%e5%ad%90%e6%a0%8f%e7%9b%ae%e4%bb%a3%e7%a0%81&Value=A006_1%3f&NaviLink=%e7%90%86%e5%b7%a5A(%e6%95%b0%e5%ad%a6%e7%89%a9%e7%90%86%e5%8a%9b%e5%ad%a6%e5%a4%a9%e5%9c%b0%e7%94%9f)-%2fgrid20%2fNavi%2fMultiNavi.aspx%3fNaviID%3d2000%26Grade%3d2%26Field%3dSYS_FLD_SYS_CODE%26Value%3d0001%3f%7c%e7%94%9f%e7%89%a9%e5%ad%a6+%3e+%e7%94%9f%e7%89%a9%e7%a7%91%e5%ad%a6%e6%80%bb%e8%ae%ba");
html = GetSourceCode(rootURI, container);
Uri subURI;
string href = "";// 此处的href为根据上面取得的rootURI源代码中提取的文章的url.如果得到多个地址,则下面的代码应循环
subURI = new Uri(href);
html = GetSourceCode(subURI, container);
}
public static string GetSourceCode(Uri uri, CookieContainer container)
{
string html = string.Empty;
HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
request.CookieContainer = container;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
html = reader.ReadToEnd();
stream.Close();
return html;
}
}