ホームページ >バックエンド開発 >PHPチュートリアル >PHPコレクションクラス スヌーピーキャプチャ画像例_PHPチュートリアル

PHPコレクションクラス スヌーピーキャプチャ画像例_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:24:36695ブラウズ

私は PHP の Snoopy クラスを 2 日間使用してきましたが、非常に便利であることがわかりました。要求された Web ページ内のすべてのリンクを取得するには、fetchlinks を直接使用します。すべてのテキスト情報を取得するには、fetchtext を使用します (内部処理には依然として正規表現が使用されます)。フォーム送信のシミュレーションなど、他にも多くの機能があります。 。


使用方法:

まず Snoopy クラスをダウンロードします。ダウンロード アドレス: http://sourceforge.net/projects/snoopy/
まずオブジェクトをインスタンス化し、次に対応するメソッドを呼び出してクロールされた Web ページ情報を取得します

コードをコピーします コードは次のとおりです:

'snoopy/Snoopy.class.php' を含めます;

$snoopy = 新しいスヌーピー();

$sourceURL = "http://www.jb51.net";
$snoopy->fetchlinks($sourceURL);

$a = $snoopy->結果;

Web ページ内のすべての画像のアドレスを取得する方法は提供されていません。ページ上のすべての記事のリスト内の画像のアドレスを取得する必要があります。次に、主に正規表現の一致が重要であるため、自分でコードを作成しました。

コードをコピーします コードは次のとおりです:

//画像と一致する正規表現
$reTag = "/PHPコレクションクラス スヌーピーキャプチャ画像例_PHPチュートリアル/i";


ニーズが非常に特殊であるため、http:// で始まる画像のみをキャプチャする必要があります (外部サイトからの画像はホットリンクを妨げる可能性があるため、最初にローカルでキャプチャする必要があります)

1. 指定された Web ページをクロールし、予想される記事アドレスをすべて除外します。

2. 最初のステップでループして記事のアドレスを取得し、正規表現を使用して画像と一致し、ページ上のルールに一致するすべての画像アドレスを取得します。

3. 画像のサフィックスと ID に従って画像を保存します (ここでは gif、jpg のみ) --- この画像ファイルが存在する場合は、まずそれを削除してから保存します。

コードをコピーします コードは次のとおりです:


「snoopy/Snoopy.class.php」をインクルードします;

$snoopy = 新しいスヌーピー();

$sourceURL = "http://xxxxx";
$snoopy->fetchlinks($sourceURL);

$a = $snoopy->結果;
$re = "/d+.html$/";

//リクエストをフィルタリングして、指定されたファイルアドレスを取得します
foreach ($a として $tmp) {
If (preg_match($re, $tmp)) {
getImgURL($tmp);
}
}

関数 getImgURL($siteName) {
$snoopy = 新しいスヌーピー();
$snoopy->fetch($siteName);

$fileContent = $snoopy->結果;

//画像と一致する正規表現
$reTag = "/PHPコレクションクラス スヌーピーキャプチャ画像例_PHPチュートリアル/i";

If (preg_match($reTag, $fileContent)) {
$ret = preg_match_all($reTag, $fileContent, $matchResult);
                                                for ($i = 0, $len = count($matchResult[1]); $i saveImgURL($matchResult[1][$i], $matchResult[2][$i]);
}
}
}

関数 saveImgURL($name, $suffix) {
$url = $name.".".$suffix;

echo "リクエストされた画像アドレス: ".$url."
";

$imgSavePath = "E:/xxx/style/images/";
$imgId = preg_replace("/^.+/(d+)$/", "1", $name);
if ($suffix == "gif") {
$imgSavePath .= "感情";
} else {
$imgSavePath .= "トピック";
}
$imgSavePath .= ("/".$imgId.".".$suffix);

If (is_file($imgSavePath)) {
unlink($imgSavePath);
echo "

ファイル「.$imgSavePath.」はすでに存在するため、削除されます

";
}

$imgFile = file_get_contents($url);
$flag = file_put_contents($imgSavePath, $imgFile);

if ($flag) {
echo "

File".$imgSavePath."正常に保存されました

";
}
}
?>

PHP を使用して Web ページ (コンテンツ、画像、リンク) をクロールする場合、最も重要なことは規則性 (クロールされたコンテンツと指定されたルールに基づいて目的のデータを取得すること) であると思います。アイデアは実際には比較的単純で、使用されるメソッドも同様です。たくさんあるわけではなく、ほんの少しだけです (コンテンツをキャプチャするには、他の人が書いたクラスのメソッドを呼び出すだけです)

しかし、以前思ったのは、PHP は次のメソッドを実装していないようです。たとえば、ファイル内に N 行がある場合 (N は非常に大きい)、ルールに適合する行の内容を置き換える必要があります。たとえば、3 行目は aaa であり、 bbbbb に変換する必要があります。ファイルを変更する必要がある場合の一般的な方法:

1. ファイル全体を一度に読み取り (または 1 行ずつ読み取り)、一時ファイルを使用して最終的な変換結果を保存し、元のファイルを置き換えます

2. 1 行ずつ読み取り、fseek を使用してファイル ポインターの位置を制御し、fwrite で書き込みます

オプション 1 は、ファイルが大きい場合に一度に読み取ることはお勧めできません (1 行ずつ読み取り、一時ファイルに書き込んでから元のファイルを置き換えるのは効率的ではありません)。オプション 2 は、置換される文字列の長さが非常に短い場合です。目標値以下の場合は問題ありませんが、それを超えると問題が発生し、次の行のデータが破壊されます(のように新しい内容に置き換えることはできません)。 JavaScript における「選択」の概念)。

以下はオプション 2 を使用したテストのコードです:

コードをコピーします コードは次のとおりです:

$mode = "r+";
$filename = "d:/file.txt";
$fp = fopen($filename, $mode);
if ($fp) {
$i = 1;
while (!feof($fp)) {
$str = fgets($fp);
エコー $str;
If ($i == 1) {
$len = strlen($str);
fseek($fp, -$len, SEEK_CUR);//ポインタを前に移動します
fwrite($fp, "123");
}
i++;
}
fclose($fp);
}
?>

このとき、ファイル ポインタは実際には次の行の先頭を指します。その後、fwrite を使用してファイル ポインタを前の行の先頭に戻します。長さが指定されていない場合、これは置換操作です。この場合、次の行のデータに影響します。必要なのは、この行を削除するか、行全体を次の行に置き換えるなど、この行のみを操作することです。 1 つだけ 1. 上記の例は要件を満たしていません。適切な方法がまだ見つかっていない可能性があります...

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/825392.html技術記事 PHP の Snoopy クラスを 2 日間使用してきましたが、非常に便利であることがわかりました。要求された Web ページ内のすべてのリンクを取得するには、fetchlinks を直接使用します。すべてのテキスト情報を取得するには、fetchtext を使用します (...
もあります)。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。