Bu XML url içeriğini kapma kıvırmak?

2 Cevap 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);
$data = curl_exec($ch);
curl_close($ch);
print "<textarea rows='10' cols='80'>";
print htmlentities($data);
print "</textarea>";
exit();
?>

Bu textarea hiçbir sonuç üretir ama orada olmalı. Diğer beslemeleri iyi çalışır.

2 Cevap

İşte cURL ile sayfa kazıma sorunları hata ayıklama nasıl bir örneklerde bulunuyor:

  1. Try the URL in a browser (with LiveHTTPHeaders), and in cURL with CURLOPT_VERBOSE enabled. This serves two purposes: revealing the HTTP headers in play, and it serves as a simple test of the URL itself.
  2. Bu tarayıcıda çalışır, ancak cURL de, HTTP başlıklarını kadar cURL ile çalışıyorsanız cURL tarayıcıyı maç yayar.

Senin örnek ile deneyelim.

URL ancak, bir tarayıcıda çalışmalarını sağladı ...

CURLOPT_VERBOSE açma şöyle bildirmektedir:

* 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

Sunucu yanıtlarken değil. Tarayıcı istek ve cURL isteği arasındaki tek fark, tarayıcı daha başlıklarını gönderir. Yani, yapılacak bir şey çalışmaya başlar kadar tarayıcı başlıklarını ekleyerek deneydir. Eğer tarayıcınızın gönderdiği tüm başlıkları kopyalarsanız, istek aynı olmalıdır, ve sonuç olarak, fonksiyonel.

İşte, ben sadece kopyaladım ve PHP içine benim Firefox istek başlıklarını yapıştırılan ettik:

$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);

Ve çalışır. Biraz daha deneme User-Agent dışındaki tüm başlıkları silinebilir ortaya koymaktadır:

$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);

Ve orada mısın: görünüşe göre, bu IIS sunucu User-Agent olmadan herhangi isteklere hizmet reddediyor. Birini ekleyin ve gitmek için iyi bir konum.

Orada bir yazım hatası var. Denemek

print htmlentities($data);

yerine

print htmlentities($date);

Ayrıca, var olmayan değişkenleri kullanmaya çalışırsanız sizi bilgilendirir böyle bir seviyeye error_reporting açmak için tavsiye olacaktır. Bunu kullanarak bunu yapabilirsiniz:

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

E_NOTICE hata raporlama düzeyi başlatılmamış değişkenleri kullanmak için size bir uyarı verecektir.