Neden bu fonksiyonu diğerleri değil, bazı URL'ler için CURL çalışma kullanarak ama olacak?

3 Cevap php

Ben çeşitli web sitelerinden gelen verileri toplayan PHP bir web sitesi yazıyorum. Ben bir URL alır ve bir dize olarak bu URL'den html döndüren bir işlev 'returnPageSource' var.

function returnPageSource($url){
	$ch = curl_init();
	$timeout = 5;	// set to zero for no timeout		

	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);		// means the page is returned
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOUT_CONNECTTIMEOUT, $timeout);	// how long to wait to connect
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);		// follow redirects
	//curl_setopt($ch, CURLOPT_HEADER, False);			// only request body

	$fileContents = curl_exec($ch);	// $fileContents contains the html source of the required website
	curl_close($ch);

	return $fileContents;
}

This works fine for some of the websites I need, like http://atensembl.arabidopsis.info/Arabidopsis_thaliana_TAIR/unisearch?species=Arabidopsis_thaliana_TAIR;idx=;q=At5g02310, but not for others, like http://www.bar.utoronto.ca/efp/cgi-bin/efpWeb.cgi?dataSource=Chemical&modeInput=Absolute&primaryGene=At5g02310&orthoListOn=0 . Does anybody have any idea why?

Update

Yanıt için teşekkürler. Benim tarayıcınızın (ince sitelere erişebilirsiniz Firefox 3,) gibi aynı olması benim UserAgent değiştirdim, 0 zaman aşımı değişti ve ben hala bağlanamıyorum, ama bazı hata mesajları alabilirsiniz. curl_error () "ev sahipliği bağlanamadı" Bana hata verir ve curl_getinfo ($ ch, CURLINFO_HTTP_CODE); çok yararlı ikisi de ... HTTP kodu 0 döndürür. Ben de curl_setopt ($ ch, CURLOPT_VERBOSE, 1) denedim, ama hiçbir şeyin görüntülenir. Herkes başka bir fikir var mı?

Final Update

Ben sadece yanlış olduğunu açıklamak yoktu fark - Ben sadece (I üniversitenin sunucusunu kullanarak ediyorum) benim üniversite için proxy ayarlarını girmek gerekiyordu. Her şey bundan sonra para cezası çalıştı!

3 Cevap

Dikkate alınması gereken iki şey.

İlk düşük için zaman aşımı kurdum. Talebimiz bu web sitelerinde 5 saniyeden daha uzun sürüyor olabilir.

Ikinci soruda web kasten isteğinizi engelliyor olabilir, olduğunu. Bunlar kıvrılma gelen isteklerini engellemek için yerinde bir kural var, ya da (ekran kazıma veya başkasının ağ kötüye ya) IP adresinden gelen ve istekleri kısıcı / engelleyen bir şüpheli aktiviteyi fark etmiş olabilirsiniz.

Ben 0 zaman aşımını ayarlama denedim varsayalım.

Ne HTTP durum kodları bu siteler dönüyor? Giriş curl_getinfo($ch, CURLINFO_HTTP_CODE);.

Bu sayfalara erişmek için çalıştığını biliyorum çünkü denemek için başka bir şey, kendi tarayıcısı o belki de, User-Agent başlığı sızdırma olabilir. Onlar sadece sayfaya erişen botlara durdurmaya çalışıyor olabilir.

Başlıkları ve http kodları incelenmesi size biraz daha bilgi vermek gerekir.

Edit:

Ben biraz daha bu içine baktı. Bir şey bağlantı zaman aşımı için bir yazım hatası var olduğunu - olmalı CURLOPT_CONNECTTIMEOUT.

Her neyse, (bence) için aradıklarını döndü bu senaryoyu (aşağıda) koştu. Bunun sizinki arasında farklı ne olduğunu görmek için kontrol edin. Eğer yardımcı olur ben PHP 5.2.8 kullanıyorum.

<?php

$addresses = array(
    'http://atensembl.arabidopsis.info/Arabidopsis_thaliana_TAIR/unisearch?species=Arabidopsis_thaliana_TAIR;idx=;q=At5g02310',
    'http://www.bar.utoronto.ca/efp/cgi-bin/efpWeb.cgi?dataSource=Chemical&modeInput=Absolute&primaryGene=At5g02310&orthoListOn=0'
);

foreach ($addresses as $address) {
    echo "Address: http://www.bar.utoronto.ca/efp/cgi-bin/efpWeb.cgi?dataSource=Chemical&modeInput=Absolute&primaryGene=At5g02310&orthoListOn=0\n";
    // This box doesn't have http registered as a transport layer - pfft
    //var_dump(fsockopen($address, 80));

    $ch = curl_init($address);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);

    $fc = curl_exec($ch);

    echo "Info: " . print_r(curl_getinfo($ch), true) . "\n";

    echo "$fc\n";

    curl_close($ch);
}

Hangi (TL; DR: Benim cURL ince sayfalarını okuyabilirsiniz) aşağıdaki döndürür:

C:\Users\Ross>php -e D:\sandbox\curl.php

Address: http://www.bar.utoronto.ca/efp/cgi-bin/efpWeb.cgi?dataSource=Chemical&modeInput=Absolute&primaryGene=At5g02310&orthoListOn=0

Info: Array
(
    [url] => http://atensembl.arabidopsis.info/Arabidopsis_thaliana_TAIR/unisearch?species=Arabidopsis_thaliana_TAIR;idx=;q=At5g02310
    [content_type] => text/html; charset=ISO-8859-1
    [http_code] => 200
    [header_size] => 168
    [request_size] => 151
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.654
    [namelookup_time] => 0.004
    [connect_time] => 0.044
    [pretransfer_time] => 0.044
    [size_upload] => 0
    [size_download] => 7531
    [speed_download] => 11515
    [speed_upload] => 0
    [download_content_length] => 0
    [upload_content_length] => 0
    [starttransfer_time] => 0.57
    [redirect_time] => 0
)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-gb"  lang="en-gb">
<head>
  <title>AtEnsembl release 49: Arabidopsis thaliana TAIR EnsEMBL UniSearch results</title>
  <style type="text/css" media="all">
    @import url(/css/ensembl.css);
    @import url(/css/content.css);
  </style>
  <style type="text/css" media="print">
    @import url(/css/printer-styles.css);
  </style>
  <style type="text/css" media="screen">
    @import url(/css/screen-styles.css);
  </style>
  <script type="text/javascript" src="/js/protopacked.js"></script>
  <script type="text/javascript" src="/js/core42.js"></script>
  <!-- Snipped for freedom - lots of lines -->
</body>
</html>

Address: http://www.bar.utoronto.ca/efp/cgi-bin/efpWeb.cgi?dataSource=Chemical&modeInput=Absolute&primaryGene=At5g02310&orthoListOn=0

Info: Array
(
    [url] => http://www.bar.utoronto.ca/efp/cgi-bin/efpWeb.cgi?dataSource=Chemical&modeInput=Absolute&primaryGene=At5g02310&orthoListOn=0
    [content_type] => text/html; charset=UTF-8
    [http_code] => 200
    [header_size] => 146
    [request_size] => 155
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 2.695
    [namelookup_time] => 0.004
    [connect_time] => 0.131
    [pretransfer_time] => 0.131
    [size_upload] => 0
    [size_download] => 14156
    [speed_download] => 5252
    [speed_upload] => 0
    [download_content_length] => 0
    [upload_content_length] => 0
    [starttransfer_time] => 2.306
    [redirect_time] => 0
)

<html>
<head>
  <title>Arabidopsis eFP Browser</title>
  <link rel="stylesheet" type="text/css" href="efp.css"/>
  <link rel="stylesheet" type="text/css" href="domcollapse.css"/>
  <script type="text/javascript" src="efp.js"></script>
  <script type="text/javascript" src="domcollapse.js"></script>
</head>
<body>
<!-- SANITY SNIP -->
</body>
</html>

Peki bu ne demektir? Tamamen emin değildi. Ben (sayfaya erişmek gibi bir web sunucusu üzerinde bu komut dosyası çalıştıran sürece,) onlar özellikle sizi bloke ediyoruz şüpheliyim. Yukarıda benim kod çalıştırmayı deneyin - İşe yarayıp yaramadığını zaman farklı (ve muhtemelen bir tıkanma neden) neler olduğunu görmek için kod parçaları dışında yorum deneyin. Ayrıca PHP sürümü çalıştırıyorsunuz?