61

Web スクレイピングに役立つ組み込みの PHP 関数は何ですか? PHP を使用した Web スクレイピングの速度を上げるための優れたリソース (Web または印刷物) は何ですか?

4

10 に答える 10

50

スクレイピングには通常、次の3つのステップが含まれます。

  • まず、指定したURLにリクエストをGETまたはPOSTします
  • 次に、応答として返されるhtmlを受け取ります
  • 最後に、そのhtmlからスクレイプしたいテキストを解析します。

手順1と2を実行するために、以下はCurlを使用してGETまたはPOSTを使用してWebページをフェッチする単純なphpクラスです。HTMLを取り戻したら、正規表現を使用して、スクレイプするテキストを解析することでステップ3を実行します。

正規表現の場合、私のお気に入りのチュートリアルサイトは次のとおりです。 正規表現のチュートリアル

正規表現を操作するための私のお気に入りのプログラムは、正規表現バディです。購入するつもりがなくても、その製品のデモを試してみることをお勧めします。これは非常に貴重なツールであり、選択した言語(phpを含む)で作成した正規表現のコードも生成します。

使用法:

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

// now, do your regex work against $html

PHPクラス:



<?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, $this->cookieJar); 
        curl_setopt($this->curl,CURLOPT_COOKIEFILE, $this->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);
    }
}

?>

于 2008-09-19T16:40:07.803 に答える
15

シンプルな PHP Web Scraper である Goutteをお勧めします。

使用例:-

Goutte Client インスタンスを作成します (これは を拡張します Symfony\Component\BrowserKit\Client):

use Goutte\Client;

$client = new Client();

request()メソッドを使用してリクエストを行います。

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

requestメソッドはオブジェクトCrawler( Symfony\Component\DomCrawler\Crawler) を返します。

リンクをクリックしてください:

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

フォームを送信:

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

データの抽出:

$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());
于 2012-05-26T04:08:12.887 に答える
11

ScraperWikiは非常に興味深いプロジェクトです。Python、Ruby、または PHP でオンラインでスクレーパーを作成するのに役立ちます - 私は数分で簡単な試みを始めることができました。

于 2010-09-24T04:50:43.230 に答える
2

高速に実行するのではなく、保守が容易なものが必要な場合は、SimpleTest の.

于 2008-09-19T21:49:25.080 に答える
2

何をしたいかによっては、スクレイピングはかなり複雑になる可能性があります。The Basics Of Writing A Scraper In PHPに関するこのチュートリアル シリーズを読んで、理解できるかどうかを確認してください。

同様の方法を使用して、フォームのサインアップ、ログイン、さらには広告の偽のクリックを自動化できます! ただし、CURL を使用する際の主な制限は、JavaScript の使用をサポートしていないことです。そのため、たとえばページネーションに AJAX を使用するサイトをスクレイピングしようとすると、少し面倒になる可能性があります...しかし、それを回避する方法があります!

于 2015-01-22T17:41:33.627 に答える
1

ここに別のものがあります: Regex のない単純な PHP Scraperです。

于 2010-06-19T13:41:44.367 に答える
0

私のフレームワークのスクレーパークラス:

<?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;
    }

}
?>
于 2009-12-26T06:19:02.660 に答える
0

file_get_contents()リモート URL を取得してソースを提供できます。その後、正規表現を (Perl 互換の関数と共に) 使用して、必要なものを取得できます。

好奇心から、何をこすり取ろうとしていますか?

于 2008-08-25T21:31:03.067 に答える
0

libcurl または Perl の LWP (perl の場合は libwww) を使用します。PHP用のlibwwwはありますか?

于 2008-08-25T21:39:43.730 に答える
-2

curl ライブラリを使用すると、Web ページをダウンロードできます。スクレイピングを行うには、正規表現を調べる必要があります。

于 2008-08-25T21:30:01.040 に答える