Heim  >  Artikel  >  php教程  >  Entwicklung eines einfachen Crawlers

Entwicklung eines einfachen Crawlers

高洛峰
高洛峰Original
2016-11-22 17:28:271358Durchsuche

Um einen Crawler zu entwickeln, müssen Sie zunächst wissen, wofür Ihr Crawler verwendet werden soll. Ich möchte damit Artikel mit bestimmten Schlüsselwörtern auf verschiedenen Websites finden und deren Links erhalten, damit ich sie schnell lesen kann.

Je nach persönlichen Gewohnheiten muss ich zunächst eine Schnittstelle schreiben und meine Ideen klären.

1. Besuchen Sie verschiedene Websites. Dann brauchen wir ein URL-Eingabefeld.

2. Finden Sie Artikel mit bestimmten Schlüsselwörtern. Dann benötigen wir ein Eingabefeld für den Artikeltitel.

3. Holen Sie sich den Artikellink. Dann benötigen wir einen Anzeigecontainer für Suchergebnisse.

<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>

Fügen Sie den Code direkt hinzu und fügen Sie dann einige eigene Stilanpassungen hinzu, und die Schnittstelle ist fertig:

Entwicklung eines einfachen Crawlers

Dann ist der nächste Schritt Bei der Implementierung der Funktion verwende ich PHP. Der erste Schritt besteht darin, den HTML-Code der Website abzurufen. Ich werde sie daher nicht einzeln vorstellen Geben Sie die URL der Website ein und Sie können den HTML-Code erhalten:

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;

}

Obwohl Sie den HTML-Code erhalten haben, werden Sie bald auf ein Problem stoßen, nämlich auf das Codierungsproblem , was Ihren nächsten Schritt des Abgleichs möglicherweise umsonst macht. Wir werden den HTML-Inhalt hier umwandeln:

$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;);

Um die URL des Artikels zu erhalten. Der nächste Schritt besteht darin, alle a-Tags unter der Webseite abzugleichen. Nach vielen Tests habe ich endlich einen relativ zuverlässigen regulären Ausdruck erhalten, egal wie komplex die Struktur unter dem a-Tag ist ein Tag, es wird nicht übersehen: (der kritischste Schritt)

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

preg_match_all($pattern, $html, $matches);

Matching Das Ergebnis in $matches ist wahrscheinlich eine mehrdimensionale Gruppe wie diese:

array(2) {  
    [0]=>  
    array(*) {    
        [0]=>
        string(*) "完整的a标签"        .
        .
        .
    }
    [1]=>
    array(*) {
        [0]=>
        string(*) "与上面下标相对应的a标签中的内容"    }
}

As Solange Sie diese Daten erhalten, ist alles andere vollständig bedienbar. Sie können diese Gruppe durchsuchen und die entsprechenden Attribute des Tags abrufen Empfohlene Klasse, um Ihnen die Bedienung des a-Tags zu erleichtern:

$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属性

}

Natürlich ist dies nur eine Möglichkeit, Sie können auch reguläre Ausdrücke verwenden, um die gewünschten Informationen abzugleichen und neue Tricks zu spielen mit den Daten.

Erhalten Sie die gewünschten Ergebnisse und passen Sie sie an. Der nächste Schritt besteht natürlich darin, sie an das Frontend zurückzusenden, um sie anzuzeigen. Verwenden Sie dann js, um die Daten im Frontend abzurufen jquery, um den anzuzeigenden Inhalt dynamisch hinzuzufügen:

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);
});

Das endgültige Rendering:

Entwicklung eines einfachen Crawlers

Entwicklung eines einfachen Crawlers

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn