PHP bir web kazıyıcı uygulamak nasıl?

12 Cevap php

Ne yerleşik PHP fonksiyonları web kazıma için yararlıdır? PHP ile kazıma web hızlandırmak için almak için bazı iyi kaynaklar (web ya da baskı) nelerdir?

12 Cevap

Bir Değerlendirmenizi görmek here - Bir Book "Webbots, Spiders, and Screen Scrapers: A Guide to Developing Internet Agents with PHP/CURL" bu konuda var

PHP-Mimar Matthew Turland tarafından December 2007 Issue olarak iyi yazılmış bir makalede kapladım

Kazıma genellikle 3 adımları kapsar:

  • first you GET or POST your request to a specified URL
  • next you receive the html that is returned as the response
  • finally you parse out of that html the text you'd like to scrape.

1. ve 2. adımları gerçekleştirmek için, aşağıdaki GET veya POST kullanarak web sayfalarını almak için Curl kullanan basit bir PHP sınıfı. Eğer HTML geri aldıktan sonra, sadece size kazımak istiyorum metin üzerinden ayrıştırma adım 3 gerçekleştirmek için normal ifadeleri kullanabilirsiniz.

For regular expressions, my favorite tutorial site is the following: Regular Expressions Tutorial

RegExs ile çalışmak için Favori program Regex Buddy. Ben bunu satın alma niyetim yok olsa bile bu ürünün demo denemek için tavsiye ediyorum. Bu paha biçilmez bir araçtır ve hatta (php dahil) seçtiğiniz dilde yapmak sizin regexs için kod üretecektir.

Kullanımı:



$curl = new Curl();
$html = $curl->get("http://www.google.com");

// now, do your regex work against $html
PHP Class:


<?php

class Curl
{   	

    public $cookieJar = "";

    public function __construct($cookieJarFile = 'cookies.txt') {
        $this->cookieJar = $cookieJarFile;
    }

    function setup()
    {


        $header = array();
        $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
        $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
        $header[] =  "Cache-Control: max-age=0";
        $header[] =  "Connection: keep-alive";
        $header[] = "Keep-Alive: 300";
        $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
        $header[] = "Accept-Language: en-us,en;q=0.5";
        $header[] = "Pragma: "; // browsers keep this blank.


        curl_setopt($this->curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7');
        curl_setopt($this->curl, CURLOPT_HTTPHEADER, $header);
    	curl_setopt($this->curl,CURLOPT_COOKIEJAR, $cookieJar); 
    	curl_setopt($this->curl,CURLOPT_COOKIEFILE, $cookieJar);
    	curl_setopt($this->curl,CURLOPT_AUTOREFERER, true);
    	curl_setopt($this->curl,CURLOPT_FOLLOWLOCATION, true);
    	curl_setopt($this->curl,CURLOPT_RETURNTRANSFER, true);	
    }


    function get($url)
    { 
    	$this->curl = curl_init($url);
    	$this->setup();

    	return $this->request();
    }

    function getAll($reg,$str)
    {
    	preg_match_all($reg,$str,$matches);
    	return $matches[1];
    }

    function postForm($url, $fields, $referer='')
    {
    	$this->curl = curl_init($url);
    	$this->setup();
    	curl_setopt($this->curl, CURLOPT_URL, $url);
    	curl_setopt($this->curl, CURLOPT_POST, 1);
    	curl_setopt($this->curl, CURLOPT_REFERER, $referer);
    	curl_setopt($this->curl, CURLOPT_POSTFIELDS, $fields);
    	return $this->request();
    }

    function getInfo($info)
    {
    	$info = ($info == 'lasturl') ? curl_getinfo($this->curl, CURLINFO_EFFECTIVE_URL) : curl_getinfo($this->curl, $info);
    	return $info;
    }

    function request()
    {
    	return curl_exec($this->curl);
    }
}

?>

Ben tavsiye Goutte, a simple PHP Web Scraper.

Example Usage:-

Create a Goutte Client instance (which extends Symfony\Component\BrowserKit\Client):

use Goutte\Client;

$client = new Client();

request() yöntemi ile isteklerini yapmak:

$crawler = $client->request('GET', 'http://www.symfony-project.org/');

The request method returns a Crawler object (Symfony\Component\DomCrawler\Crawler).

Linklere tıklayın:

$link = $crawler->selectLink('Plugins')->link();
$crawler = $client->click($link);

Formlarını Gönder:

$form = $crawler->selectButton('sign in')->form();
$crawler = $client->submit($form, array('signin[username]' => 'fabien', 'signin[password]' => 'xxxxxx'));

Veri ayıklayın:

$nodes = $crawler->filter('.error_list');

if ($nodes->count())
{
  die(sprintf("Authentification error: %s\n", $nodes->text()));
}

printf("Nb tasks: %d\n", $crawler->filter('#nb_tasks')->text());

İşte cURL ve file_get_contents kullanarak web kazıma üzerinde bir ok öğretici (kaldırıldı bağlantı, aşağıya bakınız) bulunuyor. De önümüzdeki birkaç parça okumak Besure.

(Malware dolayı uyarıları kaldırıldı direkt köprü)

http://www.oooff.com/php-scripts/basic-php-scraped-data-parsing/basic-php-data-parsing.php

Aslında onlar oluşturmak için arıyorum, bir web uygulaması için erişim ayetleri bir API sağlamak yok gibi BibleGateway.com kazımak için arıyorum.

Eğer onların site içeriği dayanarak, gerçek zamanlı yani update 'hotlink' için çalışırken ziyade kazımak olabilir gibi geliyor?

Bu eğitimde oldukça iyi:

http://www.merchantos.com/makebeta/php/scraping-links-with-php/

Ayrıca Prowser bakmak isteyebilirsiniz.

Korumak için kolay bir şey, yerine yürütmek hızlı gerekiyorsa, bu tür SimpleTest's gibi bir script tarayıcı kullanmak yardımcı olabilir.

Benim çerçevesinden Kazıyıcı sınıfı:

<?php

/*
	Example:

	$site = $this->load->cls('scraper', 'http://www.anysite.com');
	$excss = $site->getExternalCSS();
	$incss = $site->getInternalCSS();
	$ids = $site->getIds();
	$classes = $site->getClasses();
	$spans = $site->getSpans(); 

	print '<pre>';
	print_r($excss);
	print_r($incss);
	print_r($ids);
	print_r($classes);
	print_r($spans);		

*/

class scraper
{
	private $url = '';

	public function __construct($url)
	{
		$this->url = file_get_contents("$url");
	}

	public function getInternalCSS()
	{
		$tmp = preg_match_all('/(style=")(.*?)(")/is', $this->url, $patterns);
		$result = array();
		array_push($result, $patterns[2]);
		array_push($result, count($patterns[2]));
		return $result;
	}

	public function getExternalCSS()
	{
		$tmp = preg_match_all('/(href=")(\w.*\.css)"/i', $this->url, $patterns);
		$result = array();
		array_push($result, $patterns[2]);
		array_push($result, count($patterns[2]));
		return $result;
	}

	public function getIds()
	{
		$tmp = preg_match_all('/(id="(\w*)")/is', $this->url, $patterns);
		$result = array();
		array_push($result, $patterns[2]);
		array_push($result, count($patterns[2]));
		return $result;
	}

	public function getClasses()
	{
		$tmp = preg_match_all('/(class="(\w*)")/is', $this->url, $patterns);
		$result = array();
		array_push($result, $patterns[2]);
		array_push($result, count($patterns[2]));
		return $result;
	}

	public function getSpans(){
		$tmp = preg_match_all('/(<span>)(.*)(<\/span>)/', $this->url, $patterns);
		$result = array();
		array_push($result, $patterns[2]);
		array_push($result, count($patterns[2]));
		return $result;
	}

}
?>

Burada başka biri: basit bir PHP Scraper without Regex.

Kıvırmak kütüphane web sayfaları indirmenize izin veriyor. Sen kazıma yapmak için normal ifadelerin içine bakmak gerekir.

file_get_contents() uzak bir URL almak ve size kaynağını verebilir. O zaman ne gerek kapmak için (Perl-uyumlu fonksiyonları ile) düzenli ifadeler kullanabilirsiniz.

Meraktan soruyorum, sen kazımak için ne yapmak istiyorlar?

Ben kullanım libcurl veya Perl LWP (Perl için libwww) ya olur. Php için bir libwww var mı?

Güzel PHP web buraya ebook kazıma:

https://leanpub.com/web-scraping