データ収集のほとんどは正規表現を使用します。ここで話しているのは、一般的にはローカルマシン上で実行される収集の実装方法です。リソースを大量に消費するだけでなく、file_get_contents($urls)file($url) などのリモート クロール機能もサポートする必要があるため、このスペースに配置するのは賢明ではありません。
1.記事一覧ページの自動切り替えと記事パスの取得2. 取得: タイトル、コンテンツ
3. 保管
4. 質問
1.記事一覧ページの自動切り替えと記事パスの取得
a. リストページの自動切り替えは通常、動的ページに依存します。
http://www.phpfirst.com/foru... d=1&page=$i
$i++ などの $i の自動増加または範囲を使用して、後で実装できます。
penzi が示したものと同じことを、ページからページへとコード内で制御することもできます。
b. 記事パスのポイントを取得するには、次の 2 つの方法があります。1) 上記の記事一覧ページへのリンクをすべて取得するために、通常のルールを入力する必要はありません
ただし、接続をフィルタリングして処理するのが最善です。重複した接続を判断し、1 つだけを残し、相対パスを処理して、それらを絶対パスに変換します。たとえば、../ や ./ などです。
以下は私が書いためちゃくちゃな実装関数です:
PHP:
------------------------------------------------- - ---------------------------------
//$e=clinchgeturl("http://phpfirst.com/forumdisplay.php?fid=1");
//var_dump($e);
関数 clinchgeturl($url)
{
//$url="http://127.0.0.1/1.htm";
//$rootpath="http://fsrootpathfsfsf/yyyyyy/";
//var_dump($rrr);
if(エレギ((.)*[.](.)*,$url)){
$roopath=split("/",$url);
$rootpath="http://".$roopath[2]."/";
$nnn=count($roopath)-1;for($yu=3;$yu
// var_dump($rootpath) // http: ,,127.0.0.1,xnml,index.php
}
else{$rootpath=$url; //var_dump($rootpath);
}
if(isset($url)){
echo "$url には次のリンクがあります:
";$fcontents = file($url);
while(list(,$line)=each($fcontents)){
while(eregi((href[[:space:]]*=[[:space:]]*"?[[:alnum:]:@/._-]+[?]?[^"]*" ?),$line,$regs)){
//$regs[1] = eregi_replace((href[[:space:]]*=[[:space:]]*"?)([[:alnum:]:@/._-]+)( "?),"2",$regs[1]);
$regs[1] = eregi_replace((href[[:space:]]*=[[:space:]]*["]?)([[:alnum:]:@/._-]+[? ]?[^"]*)(.*)[^"/]*(["]?),"2",$regs[1]);
if(!エレギ(^http://,$regs[1])){
if(エレギ(^..,$regs[1])){
// $roopath=eregi_replace((http://)?([[:alnum:]:@/._-]+)[[:alnum:]+](.*)[[:alnum:]+ ],"http://2",$url);
$roopath=split("/",$rootpath);
$rootpath="http://".$roopath[2]."/";
//echo "これは基本です: "." ";
$nnn=count($roopath)-1;for($yu=3;$yu
//var_dump($rootpath);
if(エレギ(^..[/[:alnum:]]],$regs[1])){
//echo "これは ../directory/: "." ";
//$regs[1]="../xx/xxxxxx.xx";
// $rr=split("/",$regs[1]);
//for($oooi=1;$oooi
$rrr=$regs[1];
// {$rrr.="/".$rr[$oooi];
$rrr = eregi_replace("^[.][.][/]",,$rrr);
$regs[1]=$rootpath.$rrr;}
}その他{
if(eregi(^[[:alnum:]],$regs[1])){ $regs[1]=$rootpath.$regs[1] }
;
else{ $regs[1] = eregi_replace("^[/]",,$regs[1]); $regs[1]=$rootpath.$regs[1];}
}
$line = $regs[2];
if(eregi((.)*[.](htm|shtm|html|asp|aspx|php|jsp|cgi)(.)*,$regs[1])){
$out[0][]=$regs[1] }
;}
}
}for ($ouou=0;$ouou
{
if($out[0][$ouou]==$out[0][$ouou+1]){
$sameurlsum=1;
//echo "sameurlsum=1:";
for($sameurl=1;$sameurl
if($out[0][$ouou+$sameurl]==$out[0][$ouou+$sameurl+1]){$sameurlsum++;}
else{ブレイク;}
}
for($p=$ouou;$p
{ $out[0][$p]=$out[0][$p+$sameurlsum];}
}
}
$i=0;
while($out[0][++$i]) {
// $root.$out[0][$i] をエコーします。」 ";
$outed[0][$i]=$out[0][$i];
}
unset($out);
$out=$outed を返します;
}
?>
上記のものはゼンドのみ可能です。そうしないと都市の外観を妨げます: (
一意の接続をすべて取得したら、配列に配置します
2) 定期的なルールを記入する必要があります
必要な記事リンクを正確に取得したい場合は、この方法を使用してください
Ketle のアイデアに従ってください
使用する
PHP:
------------------------------------------------- - ---------------------------------
関数cut($file,$from,$end){
$message=explode($from,$file);
$message=explode($end,$message[1]);
$message[0] を返す;
}
$fromはリストの前のHTMLコードです
$endはリストの背後にあるHTMLコードです
上記のパラメータはフォームから送信できます。
リストページのリストではない部分を削除し、残りは必要な接続です。
以下の通常のルールを使用して取得します:
PHP:
------------------------------------------------- - ---------------------------------
preg_match("/^(http://)?(.*)/i",
$url, $matches);
$matches[2]を返す;
2. 取得: タイトル、コンテンツ
aまず、取得した記事パスを使って対象パスを読み込みます
以下の機能が利用できます。
PHP:------------------------------------------------- - ---------------------------------
関数getcontent($url) {
if($handle = fopen ($url, "rb")){
$contents = "";
する{
$data = fread($handle, 2048);
if (strlen($data) == 0) {
休憩;
}
$contents .= $data;
} while(true);
fclose ($handle);
}
その他
exit("....");
$contents を返す;
}
または直接
PHP:
------------------------------------------------- - ---------------------------------
file_get_contents($urls);
後者の方が便利ですが、上記と比較すると欠点が見えてきます
b、次はタイトルを取得します:
通常、これは次の実装に使用されます:
PHP:
------------------------------------------------- - ---------------------------------
preg_match("||",$allcontent,$title);
中のパーツはフォーム送信で入手可能です
一連のカット機能も使えます
例えば、上記の関数cut($file,$from,$end)、特定の文字列の切り取りは文字処理関数cutによって実現できますが、「コンテンツの取得」については後で詳しく説明します。
c、コンテンツを取得します
コンテンツを取得するという考え方はタイトルを取得するのと同じですが、コンテンツはそれほど単純ではないため、状況はより複雑になります。
1) コンテンツの近くにある二重引用符、スペース、改行などの特徴的な文字列は大きな障害です
二重引用符は、addslashes() で処理できる " に変更する必要があります
改行記号を削除したい場合は、
を渡すことができます
PHP:------------------------------------------------- - ---------------------------------
$a=ereg_replace(" "、、$a);
$a=ereg_replace("", , $a);
削除します
2) アイデア 2、コンテンツを抽出するために多くのカット関連関数を使用するには、多くの練習とデバッグが必要です。これに取り組んでいますが、何の進歩もありません~~~~~~~~
。
3. 保管a. データベースが挿入できることを確認してください。
たとえば、私のものは次のように直接挿入できます:
PHP:
------------------------------------------------- - ---------------------------------
$sql="$articles VALUES (, $title, , $article,, , クリンチ, from, キーワード, 1, $column id, $time, 1); に挿入します。 ";
その中には
PHP:
------------------------------------------------- - ---------------------------------
(、
自動的に昇順になります
http://www.bkjia.com/PHPjc/486262.html