2012-01-06 49 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