PHPを使用して私たちが持っている文書をクロールしたいと思っています。その中には約6,700のhrefリンクがあります。私たちが必要とするのは、リンクの反対側にあるものです。つまり、PHPが各リンクをたどってリンクの内容を取得する必要があります。これはできますか?PHPを使用してリンクをクロールする方法はありますか?
おかげ
PHPを使用して私たちが持っている文書をクロールしたいと思っています。その中には約6,700のhrefリンクがあります。私たちが必要とするのは、リンクの反対側にあるものです。つまり、PHPが各リンクをたどってリンクの内容を取得する必要があります。これはできますか?PHPを使用してリンクをクロールする方法はありますか?
おかげ
確かに、ただのfile_get_contents(http://nl.php.net/file_get_contents)のような関数を使用して、開始URLの内容をつかむ、正規表現を使用して、このページのコンテンツにはURLのを見つけ、それらのURLのエトセトラの内容をつかみます。私はちょうど私が発見したすべてのリンクのSQLテーブルを持っている、と彼らは解析されたかされている場合は
$regexUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
:
正規表現は次のようになります。
Simple HTML DOMを使用して、最も古いページを解析しますが、大きなページ(500kb + html)でメモリが不足する傾向がありますが、その一部に正規表現を使用します*。すべてのリンクについて、私はそれを解析の必要性としてSQLデータベースに追加して、それを見つけたときに見つけました。
SQLデータベースは、エラーでデータが失われるのを防ぎます。また、解析するために100,000以上のリンクがあるので、私はそれを長時間にわたって行います。
私は不明ですが、file_get_contents()のユーザーエージェントをチェックしましたか?あなたのページではなく、リクエストが1000回ある場合は、独自のHTTPダウンローダを作成するか、ライブラリから1つ(Zend Frameworkのものを使用します)のcURLなどを使用して、ユーザエージェントを変更することができますうまく動作します。カスタムユーザエージェントを使用すると、管理者はログを見て、あなたのボットに関する情報を見ることができます。 (私は私がクロールしている理由と私の連絡先を入れる傾向があります)。
*私が使用する正規表現は次のとおりです。(ガンボから)
'/<a[^>]+href="([^"]+)"[^"]*>/is'
よりよい解決策は次のようになります。あなたがリンクを収穫したら
'/<a\s+(?:[^"'>]+|"[^"]*"|'[^']*')*href=("[^"]+"|'[^']+'|[^<>\s]+)/i'
こんにちはヤコビ、まあ...それは私のデータではありません。私はユーザーエージェントを変更することは考えていませんでした。私はこの種のものについて本当に知識がありませんが、私がユーザーエージェントを変更しないと、何が起こる可能性がありますか? –
正規表現ありがとう。私はそれを試してみましょう。 –
属性値には '>'文字を含めることができ、一重引用符で囲むか、まったく引用符で囲まないでください。それでは、これをもっとうまく使ってください: '/] + | "[^"] * ")* href =(" [^ "] +" |' [^ '] +' | [^ < > \ s] +)/ i' – Gumbo
、あなたがcurlかのfile_get_contentsを(使用することができます安全な環境file_get_contentsはhttpプロトコルでのウォークスルーを許可してはいけません)
こんにちは、Einekiさん、私が持っているのは6Kリンクのメインのhtml文書です。私はそれらを最初に解析し、そのデータを後ろに取り込むことに取り組んでいると考えました。私はカールにアクセスする必要はありません。これは問題になりますか?私の選択肢は何ですか? –
_allow_url_fopen_が_php.ini_で有効になっている場合は、パラメータとしてファイル名を持つ関数を使用してURLを開くことができます(includeとrequireを使用できない場合があります)。 readfile、fopen、get_file_contentsを選択してください。おそらく他にもあります。 もしあなたが_allow_url_fopen_の場合は、手動でソケットを使用して回復する必要があるかもしれませんが、私はあなたの靴にいるのが好きではありません;) – Eineki
6000 URLでHTML文書を取り出し、それらを解析してlあなたが持っているリストを見てください。あなたのループでは、file_get_contentsを使って現在のURLの内容を取得します(この目的のために、あなたのサーバーでfile_get_contentsが有効になっているときにcURLは必要ありません)。
は次のようになります。
<?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
}
?>
あなたはおそらくforeach($ urls [0] $ URL):) – bisko
PHPスヌーピーライブラリは、あなたが探している正確に何を達成するための機能で構築されたの束を持っています。
http://sourceforge.net/projects/snoopy/
あなたはスヌーピーとページ自体をダウンロードすることができ、それは、そのページのすべてのURLを抽出するために別の機能を持っています。完全なURIになるようにリンクを修正する(つまり、ページが存在するドメイン/ディレクトリとの相対的な関係ではない)。
以下を試すことができます。詳細はthis threadを参照してください。
<?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);
?>
ありがとうございます。はい、私はコンテンツを取得したら、すべてのURLを言うと、私はそれぞれをループしますが、どのようにPHPにリンクに従うように指示しますか? –
ちょっとサンダーさん、リンクごとにfile_get_contents()を使用できませんでしたか? –
はい、file_get_contents()を使用すると、ページ内のリンクの内容を取得できます。基本的には、あなたが見つけたリンクごとに、「URLコンテンツを取得し+リンクを抽出する」プロセスを繰り返します。 – Sander