2012-01-06 56 views
1

URL1:https://duapp3.drexel.edu/webtms_du/设置会话凑页

URL2:https://duapp3.drexel.edu/webtms_du/Colleges.asp?Term=201125&univ=DREX

URL3:https://duapp3.drexel.edu/webtms_du/Courses.asp?SubjCode=CS&CollCode=E&univ=DREX

作为个人编程项目,我要刮我的大学的课程目录,并提供它作为一个RESTful API 。

但是,我遇到了以下问题。

我需要刮的页面是URL3。但是,在我访问URL2(它设置术语Colleges.asp?Term=201125)后,URL3仅返回有意义的信息,但URL2只能在访问URL1后访问。

我试着监控HTTP数据来回使用Fiddler,我不认为他们正在使用Cookie。关闭浏览器立即重置所有内容,所以我怀疑他们正在使用Session。

如何刮取URL 3?我以编程方式尝试访问URL 1和2,然后执行file_get_contents(url3)但这不起作用(可能是因为它注册为三个不同的会话)。

+0

没有被设置会话使用Cookie:'ASPSESSIONIDASBRRCCS'是它的名字,但我不明白为什么URL2是必要的(可能是我的,我忘了要注意在第一时间周围) – Grexis 2012-01-06 10:46:03

+0

@Grexis :啊,谢谢你提供的信息。 URL3提供的信息包括课堂举办的地点以及谁将参加。这取决于术语(学期),似乎在URL2 – xbonez 2012-01-06 10:51:06

+0

中设置也许值得一提的是,PHP是少数没有机械化库的动态语言之一。基于这个原因,perl python或ruby都是更好的选择。 – pguardiario 2012-01-06 22:47:39

回答

1

会话还需要一种机制来识别您。 :Cookie,会话ID的URL

在URL 1。curl -v揭示了一个会话cookie确实正在设置

Set-Cookie: ASPSESSIONIDASBRRCCS=LKLLPGGDFBGGNFJBKKHMPCDA; path=/ 

你需要这个cookie发送回服务器上的任何后续请求,让您的。 session alive。

如果您要使用file_get_contents,则需要使用stream_context_create手动为其创建上下文,以便在请求中包含Cookie。

另一种方法(我个人比较喜欢)是使用PHP提供的方便的curl functions。 (它甚至可以为您处理cookie流量!)但这只是我的偏好。

编辑:

这里的工作示例凑在你的问题的路径。

$scrape = array(
    "https://duapp3.drexel.edu/webtms_du/", 
    "https://duapp3.drexel.edu/webtms_du/Colleges.asp?Term=201125&univ=DREX", 
    "https://duapp3.drexel.edu/webtms_du/Courses.asp?SubjCode=CS&CollCode=E&univ=DREX" 
); 

$data = ''; 
$ch = curl_init(); 

// Set cookie jar to temporary file, because, even if we don't need them, 
// it seems curl does not store the cookies anywhere otherwise or include 
// them in subsequent requests 
curl_setopt($ch, CURLOPT_COOKIEJAR, tempnam(sys_get_temp_dir(), 'curl')); 

// We don't want direct output by curl 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

// Then run along the scrape path 
foreach ($scrape as $url) { 
    curl_setopt($ch, CURLOPT_URL, $url); 
    $data = curl_exec($ch); 
} 

curl_close($ch); 

echo $data; 
+0

看起来'卷曲'确实是一个更好的选择。你如何使用'curl -v'。 Fiddler没有给我看cookie,所以我应该'curl -v'是一个更好的选择。你从壳上使用它吗? – xbonez 2012-01-06 10:53:22

+1

是的,'curl'是一个shell程序,'-v'只意味着'verbose',它将显示请求和响应头文件。卷曲手册页:http://www.manpagez.com/man/1/curl/ – 2012-01-06 10:55:18

+0

完美。我能够接收cookie并将其保存到文件中。至于发送下一个请求,手册页将帮助我。顺便说一下,一旦我收到cookie,它的有效时间有多长?这是否取决于他们的配置? – xbonez 2012-01-06 11:04:10