Bağlantıları tarama PHP kullanmak için bir yolu var mı?

6 Cevap

Ben bunun yaklaşık 6 ya da 7 bin href bağlantıları vardır buna sahip bir belge tarama PHP kullanmak istiyorum. İhtiyacımız PHP her bağlantıyı takip ve bağlantı içeriğini kapmak zorunda anlamına gelir bağlantının diğer tarafta ne olduğunu. Bu yapılabilir mi?

Teşekkürler

6 Cevap

Tabii, sadece file_get_contents gibi bir işlevle (http://nl.php.net/file%5Fget%5Fcontents), bu URL benzerlerinin içeriğini kapmak, normal bir ifade kullanarak bu sayfanın içeriği URL bulun ile başlangıç ​​url içeriğini kapmak.

Regexp gibi bir şey olacaktır:

$regexUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";

Eğer bağlantıları hasat sonra, curl veya file_get_contents kullanabilirsiniz (güvenli bir ortam file_get_contents olsa http protokolü üzerinde yürümeye izin vermemelidir)

Ben sadece bulduk tüm bağlantıların bir SQL tablosu var ve onlar çözümlenen veya değildir varsa.

O büyük sayfaları (html 500kb +) ile bellek tükendi eğilimi gibi ben bazı * için regex kullanmak rağmen ben, sonra Simple HTML DOM eski eklenen sayfa ayrıştırmak için kullanın. Ben ayrıştırma gerek olarak SQL veritabanına eklemek bulmak her bağlantı, ve bir süre için ben buldum.

SQL veritabanı bir hata kayıp olan veri engeller, ve ben ayrıştırmak için 100.000 + bağlantıları var, ben uzun bir süre boyunca bunu.

Ben emin değilim, ama file_get_contents userAgent kontrol var (?) Bu sayfaları değildir ve istekleri 1000'ler yaparsanız, yükleyici kendi HTTP aşağı yazarken veya (ben Zend Framework birini kullanın) bir kütüphaneden birini kullanarak ancak cURL vb yoluyla, kullanıcı aracısı değiştirmek isteyebilirsiniz cezası çalışır. Özel bir kullanıcı aracısı kullanırsanız, bu günlükleri üzerinde seyir yönetici sizin bot hakkında bilgileri görmek için izin verir. (Ben emekleme ediyorum nedenini ve benimkinde bir kişiyi koymak eğilimindedir).

* Ben kullanmak regex olduğunu:

'/<a[^>]+href="([^"]+)"[^"]*>/is'

(Bamya itibaren) daha iyi bir çözüm olabilir:

'/<a\s+(?:[^"'>]+|"[^"]*"|'[^']*')*href=("[^"]+"|'[^']+'|[^<>\s]+)/i'

PHP Snoopy kütüphane aradığınız tam olarak ne başarmak için fonksiyonları yerleşik bir grup vardır.

http://sourceforge.net/projects/snoopy/

Daha sonra o sayfadaki tüm URL'leri ayıklamak için başka bir işlevi vardır, Snoopy ile sayfayı kendisi indirebilirsiniz. Hatta tam teşekküllü URI'larını (yani sayfa üzerinde bulunduğu alanı / dizinine sadece göreceli değil) olmak üzere bağlantıları düzeltecektir.

Sen aşağıdakileri deneyebilirsiniz. this thread daha fazla bilgi için bkz:

<?php
//set_time_limit (0);
function crawl_page($url, $depth = 5){
$seen = array();
if(($depth == 0) or (in_array($url, $seen))){
    return;
}   
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result = curl_exec ($ch);
curl_close ($ch);
if( $result ){
    $stripped_file = strip_tags($result, "<a>");
    preg_match_all("/<a[\s]+[^>]*?href[\s]?=[\s\"\']+"."(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/", $stripped_file, $matches, PREG_SET_ORDER ); 
    foreach($matches as $match){
        $href = $match[1];
            if (0 !== strpos($href, 'http')) {
                $path = '/' . ltrim($href, '/');
                if (extension_loaded('http')) {
                    $href = http_build_url($url, array('path' => $path));
                } else {
                    $parts = parse_url($url);
                    $href = $parts['scheme'] . '://';
                    if (isset($parts['user']) && isset($parts['pass'])) {
                        $href .= $parts['user'] . ':' . $parts['pass'] . '@';
                    }
                    $href .= $parts['host'];
                    if (isset($parts['port'])) {
                        $href .= ':' . $parts['port'];
                    }
                    $href .= $path;
                }
            }
            crawl_page($href, $depth - 1);
        }
}   
echo "Crawled {$href}";
}   
crawl_page("http://www.sitename.com/",3);
?>

Ben size var liste üzerinden, sizin 6000 URL'ler ile HTML belgesi almak onları ayrıştırmak ve döngü öneririz. Senin döngü içinde, böylece, (file_get_contents sunucu üzerinde etkin olduğunda, bu amaçla, gerçekten cURL gerekmez) file_get_contents kullanarak geçerli URL içeriğini almak tekrar içeren URL'leri ayrıştırmak ve.

Bu gibi bir şey olur:

<?php
function getUrls($url) {
    $doc = file_get_contents($url);
    $pattern = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
    preg_match_all($pattern, $doc, $urls);
    return $urls;
}

$urls = getUrls("your_6k_file.html"); 
foreach($urls as $url) {
    $moreUrls = getUrls($url); 
    //do something with moreUrls
}
?>