Web スクレイピングに役立つ組み込みの PHP 関数は何ですか? PHP を使用した Web スクレイピングの速度を上げるための優れたリソース (Web または印刷物) は何ですか?
10 に答える
スクレイピングには通常、次の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);
}
}
?>
シンプルな 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());
ScraperWikiは非常に興味深いプロジェクトです。Python、Ruby、または PHP でオンラインでスクレーパーを作成するのに役立ちます - 私は数分で簡単な試みを始めることができました。
高速に実行するのではなく、保守が容易なものが必要な場合は、SimpleTest の.
何をしたいかによっては、スクレイピングはかなり複雑になる可能性があります。The Basics Of Writing A Scraper In PHPに関するこのチュートリアル シリーズを読んで、理解できるかどうかを確認してください。
同様の方法を使用して、フォームのサインアップ、ログイン、さらには広告の偽のクリックを自動化できます! ただし、CURL を使用する際の主な制限は、JavaScript の使用をサポートしていないことです。そのため、たとえばページネーションに AJAX を使用するサイトをスクレイピングしようとすると、少し面倒になる可能性があります...しかし、それを回避する方法があります!
ここに別のものがあります: Regex のない単純な PHP Scraperです。
私のフレームワークのスクレーパークラス:
<?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;
}
}
?>
file_get_contents()
リモート URL を取得してソースを提供できます。その後、正規表現を (Perl 互換の関数と共に) 使用して、必要なものを取得できます。
好奇心から、何をこすり取ろうとしていますか?
libcurl または Perl の LWP (perl の場合は libwww) を使用します。PHP用のlibwwwはありますか?
curl ライブラリを使用すると、Web ページをダウンロードできます。スクレイピングを行うには、正規表現を調べる必要があります。