2010-01-07 2 views
0
<? 
$request_url = 'http://www.betjamaica.com/livelines2008/lines.asmx/Load_Latest_Lines?SportType=Football&SportSubType=NFL&GameType=GAME'; 
$ch = curl_init(); 
$timeout = 5; 
curl_setopt($ch, CURLOPT_URL, $request_url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
$data = curl_exec($ch); 
curl_close($ch); 
print "<textarea rows='10' cols='80'>"; 
print htmlentities($data); 
print "</textarea>"; 
exit(); 
?> 

이렇게하면 텍스트 영역에 결과가 나타나지 않지만 반드시 있어야합니다. 다른 피드도 정상적으로 작동합니다.CuRL이이 XML url의 내용을 가져 오지 못합니까?

+1

오류 코드를 확인하지 않고 있습니다. 그 시작하는 것이 좋을 것입니다;) –

답변

0

는 여기에 내가 곱슬 페이지 스크래핑 문제를 디버깅하는 방법을 연습입니다 :

  1. 은 ( LiveHTTPHeaders와) 브라우저에서 URL을 시도하고 CURLOPT_VERBOSE와 컬에서 사용 가능. 이것은 두 가지 용도로 사용됩니다. HTTP 헤더를 공개하고 URL의 간단한 테스트 역할을합니다.
  2. 브라우저에서는 작동하지만 cURL에서는 작동하지 않는 경우 HTTP 헤더 cURL이 브라우저와 일치 할 때까지 cURL로 작업하십시오.

예제로 시도해 보겠습니다. 서버가 응답하는 아니에요

* About to connect() to www.betjamaica.com port 80 
* Trying 72.52.5.34... * connected 
* Connected to www.betjamaica.com (72.52.5.34) port 80 
> GET /livelines2008/lines.asmx/Load_Latest_Lines?SportType=Football&SportSubType=NFL&GameType=GAME HTTP/1.1 
Host: www.betjamaica.com 
Accept: */* 

* Empty reply from server 
* Connection #0 to host www.betjamaica.com left intact 
* Closing connection #0 

:

URL은 브라우저에서 작품을 제공, 그러나 ...

이 CURLOPT_VERBOSE을 설정하면 다음과 같은 보여준다. 브라우저 요청과 cURL 요청 간의 유일한 차이점은 브라우저가 더 많은 헤더를 전송한다는 것입니다. 따라서 브라우저 헤드가 작동하기 시작할 때까지 브라우저 헤더를 추가하는 것이 좋습니다. 브라우저가 보내는 모든 헤더를 복사하는 경우 요청은 동일해야하며 결과적으로 기능적이어야합니다. 여기

은 단순히 복사하여 PHP로 내 파이어 폭스 요청 헤더를 붙여 넣은 :

$request_url = 
'http://www.betjamaica.com/livelines2008/lines.asmx/Load_Latest_Lines?SportType=Football&SportSubType=NFL&GameType=GAME'; 
$ch = curl_init(); 
$timeout = 5; 
curl_setopt($ch, CURLOPT_URL, $request_url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
$headers = array(
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16', 
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
'Accept-Language: en-us,en;q=0.5', 
'Accept-Encoding: gzip,deflate', 
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7', 
'Keep-Alive: 300', 
'Connection: keep-alive', 
); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
$data = curl_exec($ch); 
curl_close($ch); 
var_dump($data); 

을 그리고 그것은 작동합니다.

$headers = array(
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.16)', 
); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

을 그리고 거기 당신은 다음과 같습니다 : 조금 더 실험은 사용자 에이전트 이외의 모든 헤더를 제거 할 수 있다는 것을 보여 분명히이 IIS 서버가 사용자 에이전트없이 요청을 처리하기를 거부한다. 하나 추가하면 갈 수 있습니다.

3

오타가 있습니다.

print htmlentities($data); 

대신

print htmlentities($date); 

는 또한, 당신이 존재하지 않는 변수를 사용하려고하는 경우를 알려 같은 수준으로, error_reporting를 설정하는 것이 좋습니다 것보십시오. 당신은 사용하여 해당 작업을 수행 할 수 있습니다

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); 

E_NOTICE 오류보고 수준은 당신에게 초기화되지 않은 변수 사용에 대한 경고를 줄 것이다.

+0

Tatu, 당신은 typ_o_을 의미합니다. :) –

+0

그래, 내가 '오타'를 타이프했다는 것을 믿을 수 없다. :) –

+0

고정되었지만 여전히 아무것도 검색하지 못함 – justin

관련 문제