get_meta_tags () ist eine bequeme Funktion, die in PHP eingebaut ist, um den Inhalt von <meta name = "..."> Tags aus Remote- oder Lokal -HTML -Dateien zu extrahieren. Es wird oft verwendet, um die Schlüsselwörter oder Beschreibungen von Seiten zu kriechen. Im tatsächlichen Gebrauch werden Entwickler jedoch auf verschiedene Probleme stoßen: Der Titel kann nicht extrahiert werden, das Schlüsselwort ist leer, die Zeichenkodierung ist falsch, die Remote -Anforderung fehlgeschlagen, die Meta -Tag -Schreibmethode ist nicht standardisiert usw. Dieser Artikel fasst häufige Probleme, Ursachen und enthält Gegenmaßnahmen und robustere Alternativen (einschließlich nachhaltiger Probencode).
get_meta_tags (String $ Dateiname, bool $ use_include_path = false) : Es liest die Datei und versucht , <meta name = "xxx" content = "yyy"> zu analysieren und einen assoziativen Array -Namen zu zurückzugeben => Inhalt (alle Kleinbuchstaben).
Es wird weder den <title> Tag-Inhalt (d. H. Der Seitentitel) erhalten noch Metas mit Nicht- Namensattributen wie <meta property = "og: ..."> oder <meta charset = "..."> .
Die Anforderungen an HTML sind relativ streng: Meta muss in Form von name = "..." und content = "..." vorhanden sein, und die Reihenfolge der Attribute oder Linienbrüche kann sich manchmal auf das Parsen auswirken.
Schlussfolgerung : Wenn Sie die Seite <Titels> oder die Meta verwenden, endet die Eigenschaft (z. B. offene Grafiken), Get_Meta_Tags () reicht nicht aus, um sie allein zu verwenden.
Ursache : get_meta_tags () löst <title> nicht auf.
Lösung : Verwenden Sie Domdocument oder regelmäßig (nicht empfohlen), um <title> zu analysieren. Beispiel (empfohlenes Domdokument ):
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">fetch_title</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$html</span></span></span><span>) {
</span><span><span class="hljs-variable">$dom</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMDocument</span></span><span>();
</span><span><span class="hljs-comment">// suppress warnings for malformed HTML</span></span><span>
@</span><span><span class="hljs-variable">$dom</span></span><span>-></span><span><span class="hljs-title function_ invoke__">loadHTML</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>, LIBXML_NOWARNING | LIBXML_NOERROR);
</span><span><span class="hljs-variable">$nodes</span></span><span> = </span><span><span class="hljs-variable">$dom</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getElementsByTagName</span></span><span>(</span><span><span class="hljs-string">'title'</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$nodes</span></span><span>->length ? </span><span><span class="hljs-title function_ invoke__">trim</span></span><span>(</span><span><span class="hljs-variable">$nodes</span></span><span>-></span><span><span class="hljs-title function_ invoke__">item</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>)->textContent) : </span><span><span class="hljs-literal">null</span></span><span>;
}
</span></span>Wenn Sie den Seiteninhalt remote erhalten müssen, ziehen Sie zuerst die HTML mit File_get_Contents / Curl herunter und geben Sie sie dann an fetch_title () weiter.
Mögliche Gründe :
HTML-Meta ist nicht in name = "..." + content = "..." (wie property = "og: ..." oder http-äquiv ).
Meta ist außerhalb <kopf> (oder die Seitenstruktur ist nicht standardisiert).
Charaktercodierung oder BOM bewirken, dass Parsen scheitert.
degal_url_fopen ist deaktiviert und die URL kann nicht verwendet werden.
Lösung :
Überprüfen Sie den META-Attributtyp und überprüfen Sie das Domdocument , um meta-> getAtTribute ('Name') und meta-> getAtTribute ('Eigenschaft') zu überprüfen.
Verwenden Sie für Remote -URLs Curl , um zuerst Seiteninhalte (flexibler) zu erhalten und dann DOM zu analysieren.
Wenn degly_url_fopen deaktiviert ist, verwenden Sie stattdessen Curl .
Beispiel: Verwenden Sie Curl + DOM, um gemeinsame Metas (einschließlich Name und Eigenschaft ) und Titel zu extrahieren:
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">fetch_html</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$url</span></span></span><span>, </span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">10</span></span><span>) {
</span><span><span class="hljs-variable">$ch</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt_array</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, [
CURLOPT_RETURNTRANSFER => </span><span><span class="hljs-literal">true</span></span><span>,
CURLOPT_FOLLOWLOCATION => </span><span><span class="hljs-literal">true</span></span><span>,
CURLOPT_MAXREDIRS => </span><span><span class="hljs-number">5</span></span><span>,
CURLOPT_CONNECTTIMEOUT => </span><span><span class="hljs-variable">$timeout</span></span><span>,
CURLOPT_TIMEOUT => </span><span><span class="hljs-variable">$timeout</span></span><span>,
CURLOPT_USERAGENT => </span><span><span class="hljs-string">'Mozilla/5.0 (compatible; PHP script)'</span></span><span>,
]);
</span><span><span class="hljs-variable">$html</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_exec</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-variable">$err</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_error</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_close</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$html</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RuntimeException</span></span><span>(</span><span><span class="hljs-string">"Failed to fetch URL: <span class="hljs-subst">$err</span></span></span><span>");
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$html</span></span><span>;
}
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">parse_meta_and_title</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$html</span></span></span><span>) {
</span><span><span class="hljs-variable">$dom</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMDocument</span></span><span>();
@</span><span><span class="hljs-variable">$dom</span></span><span>-></span><span><span class="hljs-title function_ invoke__">loadHTML</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>, LIBXML_NOWARNING | LIBXML_NOERROR);
</span><span><span class="hljs-variable">$result</span></span><span> = [</span><span><span class="hljs-string">'title'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-string">'meta'</span></span><span> => []];
</span><span><span class="hljs-comment">// title</span></span><span>
</span><span><span class="hljs-variable">$titles</span></span><span> = </span><span><span class="hljs-variable">$dom</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getElementsByTagName</span></span><span>(</span><span><span class="hljs-string">'title'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$titles</span></span><span>->length) {
</span><span><span class="hljs-variable">$result</span></span><span>[</span><span><span class="hljs-string">'title'</span></span><span>] = </span><span><span class="hljs-title function_ invoke__">trim</span></span><span>(</span><span><span class="hljs-variable">$titles</span></span><span>-></span><span><span class="hljs-title function_ invoke__">item</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>)->textContent);
}
</span><span><span class="hljs-comment">// metas</span></span><span>
</span><span><span class="hljs-variable">$metas</span></span><span> = </span><span><span class="hljs-variable">$dom</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getElementsByTagName</span></span><span>(</span><span><span class="hljs-string">'meta'</span></span><span>);
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$metas</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$meta</span></span><span>) {
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-variable">$meta</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getAttribute</span></span><span>(</span><span><span class="hljs-string">'name'</span></span><span>);
</span><span><span class="hljs-variable">$prop</span></span><span> = </span><span><span class="hljs-variable">$meta</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getAttribute</span></span><span>(</span><span><span class="hljs-string">'property'</span></span><span>); </span><span><span class="hljs-comment">// og: Warten</span></span><span>
</span><span><span class="hljs-variable">$http_equiv</span></span><span> = </span><span><span class="hljs-variable">$meta</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getAttribute</span></span><span>(</span><span><span class="hljs-string">'http-equiv'</span></span><span>);
</span><span><span class="hljs-variable">$content</span></span><span> = </span><span><span class="hljs-variable">$meta</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getAttribute</span></span><span>(</span><span><span class="hljs-string">'content'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$name</span></span><span>) {
</span><span><span class="hljs-variable">$result</span></span><span>[</span><span><span class="hljs-string">'meta'</span></span><span>][</span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$name</span></span><span>)] = </span><span><span class="hljs-variable">$content</span></span><span>;
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$prop</span></span><span>) {
</span><span><span class="hljs-variable">$result</span></span><span>[</span><span><span class="hljs-string">'meta'</span></span><span>][</span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$prop</span></span><span>)] = </span><span><span class="hljs-variable">$content</span></span><span>;
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$http_equiv</span></span><span>) {
</span><span><span class="hljs-variable">$result</span></span><span>[</span><span><span class="hljs-string">'meta'</span></span><span>][</span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$http_equiv</span></span><span>)] = </span><span><span class="hljs-variable">$content</span></span><span>;
}
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>;
}
</span></span>Grund :
Die von der Seite (z. B. UTF-8, GBK) verwendete Codierung stimmt nicht mit dem Standardverhalten von Domdocument :: loadHTML überein.
Der HTTP -Header steht im Widerspruch zu den Charset -Informationen in der Seite Meta.
Lösung :
Konvertieren Sie HTML in UTF-8 (wenn nicht) vor loadHtml () und injizieren Sie <meta http-äquiv = "content-type" content = "text/html; charSet = utf-8"> in den Kopf, so dass das Domdocument einfacher zu erkennen ist.
Verwenden Sie MB_DETECT_ENCODING (), um die Codierung zu bestimmen und in UTF-8 zu konvertieren.
Beispiel:
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">normalize_to_utf8</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$html</span></span></span><span>) {
</span><span><span class="hljs-comment">// Versuchen Sie zu bestehen BOM oder meta Richterkodierung,Wenn Sie sich nicht sicher sind, verwenden Sie es mb_detect_encoding</span></span><span>
</span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-string">'/<meta.+?charset=["\']?\s*([a-zA-Z0-9\-\_]+)\b/i'</span></span><span>, </span><span><span class="hljs-variable">$html</span></span><span>, </span><span><span class="hljs-variable">$m</span></span><span>)) {
</span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtoupper</span></span><span>(</span><span><span class="hljs-variable">$m</span></span><span>[</span><span><span class="hljs-number">1</span></span><span>]);
}
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$encoding</span></span><span>) {
</span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_detect_encoding</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>, [</span><span><span class="hljs-string">'UTF-8'</span></span><span>,</span><span><span class="hljs-string">'GB2312'</span></span><span>,</span><span><span class="hljs-string">'GBK'</span></span><span>,</span><span><span class="hljs-string">'ISO-8859-1'</span></span><span>], </span><span><span class="hljs-literal">true</span></span><span>);
}
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$encoding</span></span><span> && </span><span><span class="hljs-title function_ invoke__">strtoupper</span></span><span>(</span><span><span class="hljs-variable">$encoding</span></span><span>) !== </span><span><span class="hljs-string">'UTF-8'</span></span><span>) {
</span><span><span class="hljs-variable">$html</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_convert_encoding</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-variable">$encoding</span></span><span>);
}
</span><span><span class="hljs-comment">// sicherstellen loadHTML Identifizieren als UTF-8</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stripos</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>, </span><span><span class="hljs-string">'<meta http-equiv="Content-Type"'</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-variable">$html</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/<head([^>]*)>/i'</span></span><span>, </span><span><span class="hljs-string">'<head$1><meta http-equiv="Content-Type" content="text/html; charset=utf-8">'</span></span><span>, </span><span><span class="hljs-variable">$html</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>);
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$html</span></span><span>;
}
</span></span> Ursache : Die Funktion basiert auf einem einfachen Parser intern und wird nicht auf Neulinnern, Kommentaren oder seltsamen Zeichen in der Inhaltseigenschaft stoßen.
Lösung : Es handelt sich besser um Fehler mit Domdocument ; oder zuerst den Kopf in HTML vorab (Kommentare entfernen, die Attribute in dieselbe Zeile flachen) und dann Get_Meta_Tags (nicht sehr elegant, kann aber als kurzfristiges Mittel verwendet werden).
Gegenmaßnahmen :
Verwenden Sie Curlopt_Useragent , um den gemeinsamen Browser UA einzurichten.
Setzen Sie angemessene curlopt_timeout und curlopt_connectTimeout .
Unterstützen Sie Curlopt_follocation (Beachten Sie, dass es in einigen Umgebungen aktiviert werden muss).
Wenn die Website über eine Anti-Crawl-Strategie verfügt (Überprüfungscode, JS-Rendering, Anti-Robot), sollten Sie:
Einfache Anfrage -Header -Verkleidung (aber die Rechts- und Website -Roboter -Vereinbarung einhalten).
Verwenden Sie Crawler mit JS (wie z. B. kopflosen Browsern), aber dies geht außerhalb des PHP -nativen Bereichs.
Verarbeiten Sie die HTTP -Statuscodes und versuchen Sie es erneut beim Ausfall (exertional fallback), vermeiden Sie jedoch übermäßige Anfragen.
Beispiel: Locken mit Header:
<span><span><span class="hljs-title function_ invoke__">curl_setopt_array</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, [
CURLOPT_RETURNTRANSFER => </span><span><span class="hljs-literal">true</span></span><span>,
CURLOPT_FOLLOWLOCATION => </span><span><span class="hljs-literal">true</span></span><span>,
CURLOPT_MAXREDIRS => </span><span><span class="hljs-number">5</span></span><span>,
CURLOPT_CONNECTTIMEOUT => </span><span><span class="hljs-number">10</span></span><span>,
CURLOPT_TIMEOUT => </span><span><span class="hljs-number">15</span></span><span>,
CURLOPT_USERAGENT => </span><span><span class="hljs-string">'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'</span></span><span>,
CURLOPT_HTTPHEADER => [
</span><span><span class="hljs-string">'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'</span></span><span>,
</span><span><span class="hljs-string">'Accept-Language: en-US,en;q=0.5'</span></span><span>,
],
]);
</span></span>Dies ist das Design der Funktion: Der Schlüsselname wird in Kleinbuchstaben konvertiert. Wenn sich Ihr Unternehmen auf fallempfindliche Felder stützt, beachten Sie die standardisierten Schlüsselnamen.
Hier ist eine Kombinationsfunktion: Verwenden Sie zuerst Curl , um HTML zu erhalten, dann die Codierungsnormalisierung durchzuführen und schließlich DOM, um gemeinsame Felder und alle Meta -Listen zu analysieren und zurückzugeben.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">fetch_page_info</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$url</span></span></span><span>) {
</span><span><span class="hljs-variable">$html</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fetch_html</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>);
</span><span><span class="hljs-variable">$html</span></span><span> = </span><span><span class="hljs-title function_ invoke__">normalize_to_utf8</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>);
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">parse_meta_and_title</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>);
</span><span><span class="hljs-comment">// Gemeinsame Feldernormalisierung:title, keywords, description</span></span><span>
</span><span><span class="hljs-variable">$info</span></span><span> = [];
</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'title'</span></span><span>] = </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'title'</span></span><span>] ?? </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-variable">$meta</span></span><span> = </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'meta'</span></span><span>] ?? [];
</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'keywords'</span></span><span>] = </span><span><span class="hljs-variable">$meta</span></span><span>[</span><span><span class="hljs-string">'keywords'</span></span><span>] ?? (</span><span><span class="hljs-variable">$meta</span></span><span>[</span><span><span class="hljs-string">'og:site_name'</span></span><span>] ?? </span><span><span class="hljs-literal">null</span></span><span>);
</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'description'</span></span><span>] = </span><span><span class="hljs-variable">$meta</span></span><span>[</span><span><span class="hljs-string">'description'</span></span><span>] ?? (</span><span><span class="hljs-variable">$meta</span></span><span>[</span><span><span class="hljs-string">'og:description'</span></span><span>] ?? </span><span><span class="hljs-literal">null</span></span><span>);
</span><span><span class="hljs-comment">// Kehre zu allen zurück meta Für weitere Verwendung</span></span><span>
</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'meta_all'</span></span><span>] = </span><span><span class="hljs-variable">$meta</span></span><span>;
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$info</span></span><span>;
}
</span><span><span class="hljs-comment">// Beispiel verwenden:</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$url</span></span><span> = </span><span><span class="hljs-string">'https://example.com'</span></span><span>;
</span><span><span class="hljs-variable">$info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fetch_page_info</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_export</span></span><span>(</span><span><span class="hljs-variable">$info</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Error: "</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span></span>Wenn Sie eine große Anzahl von Seiten in Chargen kriechen müssen, kriechen Sie bitte nicht jedes Mal die gleiche URL in Echtzeit. Es wird empfohlen, Caches (Redis, Memcached oder Datei -Cache) zu verwenden und entsprechende Ablaufrichtlinien wie 1 Stunde oder 24 Stunden festzulegen, abhängig von der Häufigkeit von Seitenaktualisierungen.
Steuern Sie die Anzahl der gleichzeitigen Kriechen, um nicht von der Zielstelle blockiert zu werden oder von seinem Wirt zu hohen Druck zu haben.
Priority Crawling -Homepages und wichtige Seiten für große Standorte werden vermieden, um alle Links blind zu kriechen.
Die Meta -Tags -Schreibmethode ist nicht einheitlich : Viele moderne Websites verwenden OG: Titel und Twitter: Titel , die nicht im Zielbereich von get_meta_tags () liegen. Die Verwendung von DOM kann alle Typen gleichzeitig erfassen.
Meta -Tag -Duplikat : Wenn auf der Seite mehrere Meta -Namen angezeigt werden (kann für mehrsprachige oder Versionskontrolle verwendet werden), sollte Ihre Parsen -Logik entscheiden, ob Sie den ersten nehmen, zusammenführen oder speichern.
HTML -Unternehmen in Meta : Achten Sie auf decodierende Unternehmen wie & amp; , { ( html_entity_decode () ).
Roboter/Meta-Refresh : Wenn Sie die Meta-Aktualisierung (Umleitung) oder Roboter noIndex verarbeiten müssen, überprüfen Sie bitte http-äquiv und entsprechende Eigenschaften speziell.
Einhalten Sie Robots.txt und das Gesetz : Überprüfen Sie die Zielwebsite Robots.txt und die Nutzungsbedingungen vor dem Kriechen, respektieren Sie die Privatsphäre und das Urheberrecht und kriechen Sie nicht eingeschränkte Inhalte.
Bestätigen Sie, ob Sie <meta name = "Keywords"> oder <title> crawlen möchten (die beiden sind verschiedene Tools).
Wenn es sich um einen Fernkriechen handelt: Verwenden Sie zuerst Curl , um die ursprüngliche HTML zu erhalten und zu drucken, und überprüfen Sie das spezifische Schreiben und Codieren von Meta.
Überprüfen Sie, ob es nicht UTF-8 ist, konvertieren Sie zuerst und analysieren Sie sich dann.
Wenn GET_META_TAGS () nicht extrahiert werden kann, wechseln Sie gleichzeitig in Domdocument und erfassen Sie den Namen , die Eigenschaft und das HTTP-Equiv .
Behandeln Sie HTTP-Fehler, Umleitung und Anti-Kriechen-Mechanismen (Setzen Sie UA, Timeout- und Wiederholung von Richtlinien angemessen).
Implementieren Sie Caches wichtiger Seiten, um doppelte Anforderungen zu vermeiden.
get_meta_tags () ist einfach und einfach zu bedienen, gilt jedoch nur für Standard- und einfache Meta -Name = "..." -Szenarien. Es kriecht nicht das Meta von Typ <titels> oder Eigenschaft .
Für komplexe, nicht standardmäßige oder nicht-UTF-8-Seiten wird empfohlen, eine Kombination aus Curl + Domdocument zu verwenden: flexibler und robuster.
Codierung, ferner Anforderungsfehler, Reverse Crawling und Meta-Schreiben sind übliche Fehlerpunkte. Die meisten Probleme können in der Reihenfolge der oben genannten Reihenfolge der Fehlerbehebung befestigt werden.
Wenn Sie Seiten verarbeiten müssen, für die JS-Rendering (SPA, dynamisches Lade-Meta) erforderlich ist, müssen Sie einen kopflosen Browser oder eine serverseitige Rendering-Lösung (aus PHP-nativem Bereich) verwenden.