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

, 내 대학 과정 카탈로그를 긁어 편안한 API로 제공 할 .

그러나 다음과 같은 문제가 있습니다.

내가 긁을 필요가있는 페이지는 URL3입니다. 그러나 URL3은 URL2를 방문한 후에 의미있는 정보 만 반환하지만 (이 경우 용어는 Colleges.asp?Term=201125 임), URL2를 방문한 후에 만 ​​URL2를 방문 할 수 있습니다.

나는 Fiddler를 사용하여 HTTP 데이터를 모니터링하려고 시도했지만 쿠키를 사용하고 있다고 생각하지 않습니다. 브라우저를 닫으면 즉시 모든 것이 다시 설정되므로 Session을 사용하고 있다고 생각됩니다.

URL 3을 어떻게 긁을 수 있습니까? 프로그래밍 방식으로 URL 1과 2를 먼저 방문한 다음 file_get_contents(url3)을 시도했지만 작동하지 않습니다 (아마 3 개의 다른 세션으로 등록했기 때문일 수 있습니다).

+0

쿠키를 사용하여 설정되고 세션이'내가 볼 수 없지만 URL2가 필요한 이유 ASPSESSIONIDASBRRCCS', 그것은 이름이다 인은 – Grexis

+0

@Grexis을 (나를 수 있습니다, 나는 주위에 처음으로 관심을 지불하는 걸 잊었) : 아, 정보 주셔서 감사합니다. URL3은 수업이 개최되는 장소와 학생을 데려 갈 사람과 같은 정보를 제공합니다. 이것은 URL2에 설정된 것으로 보이는 학기 (학기)에 달려 있습니다. – xbonez

+0

PHP는 기계화 라이브러리가없는 몇 가지 동적 언어 중 하나임을 언급 할 가치가 있습니다. 이런 이유로 펄 파이썬이나 루비는 모두 긁기에 더 좋은 선택입니다. – pguardiario

답변

1

세션은 사용자를 식별하는 메커니즘이 필요합니다. :. URL 쿠키, 세션 ID

URL 1에 curl -v는 세션 쿠키가 참으로 설정되는 계시

Set-Cookie: ASPSESSIONIDASBRRCCS=LKLLPGGDFBGGNFJBKKHMPCDA; path=/ 

당신은 유지하기 위해 후속 요청에 다시 서버로이 쿠키를 보낼 필요가 당신. 세션이 살아 있습니다.

file_get_contents을 사용하려면 수동으로 컨텍스트를 만들고 stream_context_create과 함께 쿠키를 포함시켜야합니다.

대안 (내가 개인적으로 선호하는)은 PHP에서 편리하게 제공하는 curl functions을 사용하는 것입니다. (쿠키 트래픽도 처리 할 수 ​​있습니다!)하지만 그건 내가 선호하는 것입니다.

편집 :

여기에 귀하의 질문에 경로를 긁어하는 작업 예입니다.

$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)'은 훨씬 더 나은 옵션입니다. 'curl -v'는 어떻게 사용합니까? Fiddler는 쿠키를 보여주지 않았으므로 curl -v가 더 좋은 옵션 인 것 같습니다. 당신은 껍질에서 그것을 사용합니까? – xbonez

+1

예, curl은 쉘 프로그램이고, -v는 요청과 응답 헤더를 보여주는'verbose '를 의미합니다. 컬 맨 페이지 : http://www.manpagez.com/man/1/curl/ –

+0

완벽. 쿠키를 받고 파일에 저장할 수 있습니다. 다음 요청에서 그것을 보내면 맨 페이지가 도움이 될 것입니다. 그건 그렇고, 쿠키를 받으면 얼마나 오래 유효합니까?그것은 그들의 설정에 달려 있습니까? – xbonez