ホームページ > php教程 > PHP开发 > 簡易クローラの開発

簡易クローラの開発

高洛峰
リリース: 2016-11-22 17:28:27
オリジナル
1369 人が閲覧しました

クローラーを開発するには、まずクローラーが何に使用されるかを知る必要があります。これを使用して、さまざまな Web サイトで特定のキーワードを含む記事を検索し、そのリンクを取得して、すぐに読めるようにしたいと考えています。

個人的な習慣によれば、最初にインターフェイスを作成し、自分のアイデアを明確にする必要があります。

1. さまざまな Web サイトにアクセスします。次に、URL 入力ボックスが必要です。

2. 特定のキーワードを含む記事を検索します。次に、記事タイトルの入力ボックスが必要です。

3. 記事のリンクを取得します。次に、検索結果を表示するコンテナが必要になります。

<div class="jumbotron" id="mainJumbotron">
    <div class="panel panel-default">

        <div class="panel-heading">文章URL抓取</div>

        <div class="panel-body">
            <div class="form-group">
                <label for="article_title">文章标题</label>
                <input type="text" class="form-control" id="article_title" placeholder="文章标题">
            </div>
            <div class="form-group">
                <label for="website_url">网站URL</label>
                <input type="text" class="form-control" id="website_url" placeholder="网站URL">
            </div>

            <button type="submit" class="btn btn-default">抓取</button>
        </div>
    </div>
    <div class="panel panel-default">

        <div class="panel-heading">文章URL</div>

        <div class="panel-body">
            <h3></h3>
        </div>
    </div>
</div>
ログイン後にコピー

コードに直接移動し、独自のスタイル調整を追加すると、インターフェイスが完成します。次のステップは、PHP を使用して関数を実装することです。 HTML コードを取得する方法はたくさんありますが、ここでは 1 つずつ紹介しません。 を渡すことで HTML コードを取得できます。ウェブサイトの URL:

private function get_html($url){

    $ch = curl_init();

    $timeout = 10;

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_ENCODING, &#39;gzip&#39;);

    curl_setopt($ch, CURLOPT_USERAGENT, &#39;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36&#39;);

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

    $html = curl_exec($ch);

    return $html;

}
ログイン後にコピー

HTML コードを取得しましたが、エンコーディングの問題が発生したことがすぐにわかります。これにより、次の照合ステップが無駄になる可能性があります。ここでは、取得した HTML コンテンツを utf8 エンコーディングに一律に変換します。 : 簡易クローラの開発

$coding = mb_detect_encoding($html);

if ($coding != "UTF-8" || !mb_check_encoding($html, "UTF-8"))

    $html = mb_convert_encoding($html, &#39;utf-8&#39;, &#39;GBK,UTF-8,ASCII&#39;);
ログイン後にコピー

Web サイトの HTML を取得し、記事の URL を取得します。次に、Web ページの下にあるすべてのタグを照合します。これには、正規表現を使用する必要があります。多くのテストを経て、最終的にはさらに多くの結果が得られました。 a タグの下の構造がどれほど複雑であっても、タグである限り、それをお見逃しなく: (最も重要なステップ)

$pattern = &#39;|<a[^>]*>(.*)</a>|isU&#39;;

preg_match_all($pattern, $html, $matches);
ログイン後にコピー

マッチング結果は $matches にあり、これはおそらく a です。次のような多次元グループ:

array(2) {  
    [0]=>  
    array(*) {    
        [0]=>
        string(*) "完整的a标签"        .
        .
        .
    }
    [1]=>
    array(*) {
        [0]=>
        string(*) "与上面下标相对应的a标签中的内容"    }
}
ログイン後にコピー

このデータを取得できる限り、他のすべては完全に操作可能です。この要素グループを走査し、必要な a タグを見つけて、a タグの対応する属性を取得できます。 a タグを操作しやすくするために推奨されるクラスは次のとおりです:

$dom = new DOMDocument();

@$dom->loadHTML($a);//$a是上面得到的一些a标签

$url = new DOMXPath($dom);

$hrefs = $url->evaluate(&#39;//a&#39;);

for ($i = 0; $i < $hrefs->length; $i++) {

    $href = $hrefs->item($i);

    $url = $href->getAttribute(&#39;href&#39;); //这里获取a标签的href属性

}
ログイン後にコピー

もちろん、これはメソッドの 1 つであり、必要な情報に一致させるために正規表現を使用することもできます。データを使って新しいトリックを試してみませんか。

次のステップは、もちろん、結果をフロントエンドに送り返して表示し、js を使用してフロントエンドでデータを取得し、jquery を使用して結果を照合します。コンテンツを動的に追加して表示します:

var website_url = &#39;你的接口地址&#39;;
$.getJSON(website_url,function(data){
    if(data){
        if(data.text == &#39;&#39;){
            $(&#39;#article_url&#39;).html(&#39;<div><p>暂无该文章链接</p></div>&#39;);
            return;
        }
        var string = &#39;&#39;;
        var list = data.text;
        for (var j in list) {
                var content = list[j].url_content;
                for (var i in content) {
                    if (content[i].title != &#39;&#39;) {
                        string += &#39;<div class="item">&#39; +
                            &#39;<em>[<a href="http://&#39; + list[j].website.web_url + &#39;" target="_blank">&#39; + list[j].website.web_name + &#39;</a>]</em>&#39; +
                            &#39;<a href=" &#39; + content[i].url + &#39;" target="_blank" class="web_url">&#39; + content[i].title + &#39;</a>&#39; +
                            &#39;</div>&#39;;
                    }
                }
            }
        $(&#39;#article_url&#39;).html(string);
});
ログイン後にコピー
Up 最終レンダリング:

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート