현재 위치: > 최신 기사 목록> get_meta_tags를 사용할 때 자주 묻는 질문과 솔루션

get_meta_tags를 사용할 때 자주 묻는 질문과 솔루션

gitbox 2025-09-16

get_meta_tags ()는 <meta name = "..."> 태그의 내용을 원격 또는 로컬 HTML 파일에서 추출하기 위해 PHP에서 내장 된 편리한 기능입니다. 종종 페이지 키워드 또는 설명을 기어 다니는 데 사용됩니다. 그러나 실제로 사용하면 개발자가 다양한 문제에 직면 할 수 있습니다. 제목을 추출 할 수없고, 키워드가 비어 있고, 캐릭터 인코딩이 잘못되었고, 원격 요청이 실패했으며, 메타 태그 쓰기 방법이 표준화되지 않은 등이 기사에서는 일반적인 문제를 요약하고, 대응할 수있는 대안 (복제 가능한 PHP 샘플 코드 포함)을 제공합니다.


1. get_meta_tags () 의 방법 및 제한 (먼저 이해하고 디버그)

  • get_meta_tags (String $ filename, bool $ use_include_path = false) : 파일을 읽고 <meta name = "xxx"content = "yyy">를 구문 분석하려고합니다.

  • <title> 태그 컨텐츠 (예 : 페이지 제목)를 얻지 못하거나 <meta property = "oog : ..."> 또는 <meta charset = "..."> 와 같은 비 이름 속성이있는 구문 분석 메타.

  • HTML에 대한 요구 사항은 비교적 엄격합니다. 메타는 이름 = "..."content = "..." 의 형태로 존재해야하며, 속성 또는 줄 브레이크의 순서는 때때로 구문 분석에 영향을 줄 수 있습니다.

결론 : 페이지 <title> 이 필요하거나 Meta가 속성 (예 : 열린 그래프)을 사용하는 경우 get_meta_tags () 만으로는 혼자 사용하기에 충분하지 않습니다.


2. FAQ 및 솔루션 목록

질문 A : <title> (페이지 제목)을 얻을 수 없습니다.

원인 : get_meta_tags ()는 <title>을 해결하지 못합니다.
솔루션 : DomDocument 또는 일반 (권장되지 않음)을 사용하여 <title>을 구문 분석하십시오. 예제 (권장 domdocument ) :

 <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>-&gt;</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>-&gt;</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>-&gt;length ? </span><span><span class="hljs-title function_ invoke__">trim</span></span><span>(</span><span><span class="hljs-variable">$nodes</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">item</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>)-&gt;textContent) : </span><span><span class="hljs-literal">null</span></span><span>;
}
</span></span>

페이지 컨텐츠를 원격으로 얻어야하는 경우 먼저 File_Get_Contents / Curl 로 HTML을 당겨서 Fetch_title () 에 전달하십시오.


질문 B : get_meta_tags () 빈 배열을 반환하거나 일부 메타가 누락됩니다.

가능한 이유 :

  1. HTML Meta는 name = "..." + content = "..." (예 : property = "og : ..." 또는 http-equiv )로 기록되지 않습니다.

  2. 메타는 <head> 외부에 있습니다 (또는 페이지 구조는 표준화되지 않음).

  3. 캐릭터 인코딩 또는 BOM은 구문 분석이 실패하게됩니다.

  4. allow_url_fopen 이 비활성화되어 URL을 사용할 수 없습니다.

해결책 :

  • 메타 속성 유형을 확인하고 domdocument를 사용하여 필요한 경우 메타-> getAttribute ( 'name')meta-> getAttribute ( 'Property')를 확인하십시오.

  • 원격 URL의 경우 CURL을 사용하여 페이지 컨텐츠를 먼저 얻은 다음 DOM을 사용하여 구문 분석하십시오.

  • allow_url_fopen 이 비활성화 된 경우 대신 컬을 사용하십시오.

예 : Curl + Dom을 사용하여 공통 메타 ( 이름속성 포함) 및 제목을 추출합니다.

 <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 =&gt; </span><span><span class="hljs-literal">true</span></span><span>,
        CURLOPT_FOLLOWLOCATION =&gt; </span><span><span class="hljs-literal">true</span></span><span>,
        CURLOPT_MAXREDIRS =&gt; </span><span><span class="hljs-number">5</span></span><span>,
        CURLOPT_CONNECTTIMEOUT =&gt; </span><span><span class="hljs-variable">$timeout</span></span><span>,
        CURLOPT_TIMEOUT =&gt; </span><span><span class="hljs-variable">$timeout</span></span><span>,
        CURLOPT_USERAGENT =&gt; </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>-&gt;</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> =&gt; </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-string">'meta'</span></span><span> =&gt; []];

    </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>-&gt;</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>-&gt;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>-&gt;</span><span><span class="hljs-title function_ invoke__">item</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>)-&gt;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>-&gt;</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>-&gt;</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>-&gt;</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: 기다리다</span></span><span>
        </span><span><span class="hljs-variable">$http_equiv</span></span><span> = </span><span><span class="hljs-variable">$meta</span></span><span>-&gt;</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>-&gt;</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>

질문 C : 문자 인코딩 (중국어 및 기타의 다중 바이트) 차량 코드

이유 :

  • 페이지에서 사용되는 인코딩 (예 : UTF-8, GBK)은 domDocument :: loadhtml 의 기본 동작과 일치하지 않습니다.

  • HTTP 헤더는 페이지 메타의 ​​숯불 정보와 일치하지 않습니다.

해결책 :

  • loadhtml () 전에 html을 UTF-8 (그렇지 않은 경우)로 변환하고 <meta http-equiv = "content-type"content = "text/html; charset = utf-8">를 헤드에 넣으므로 domdocument를 더 쉽게 인식하기가 더 쉬워집니다.

  • mb_detect_encoding ()을 사용하여 인코딩을 결정하고 UTF-8로 변환하십시오.

예:

 <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">// 통과하려고 노력하십시오 BOM 또는 meta 판사 인코딩,확실하지 않은 경우 사용하십시오 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">'/&lt;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> &amp;&amp; </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">// 보장하다 loadHTML 식별하십시오 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">'&lt;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">'/&lt;head([^&gt;]*)&gt;/i'</span></span><span>, </span><span><span class="hljs-string">'&lt;head$1&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;'</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>

질문 D : get_meta_tags () 는 HTML 주석 또는 불규칙 형식에 민감합니다.

원인 :이 기능은 내부적으로 간단한 구문 분석기를 기반으로하며 컨텐츠 속성에서 신형, 댓글 또는 이상한 문자가 발생하지 않습니다.
솔루션 : DomDocument 의 결함을 더 잘 견딜 수 있습니다. 또는 먼저 HTML에서 헤드를 전제로 처리합니다 (주석 제거, 속성을 같은 줄로 평평하게합니다 ) .


질문 E : 원격 페이지를 크롤링하여 시간이 걸리거나 취소되거나 403/429로 돌아갑니다.

대책 :

  • curlopt_useragent를 사용하여 공통 브라우저 UA를 설정하십시오.

  • 합리적인 curlopt_timeoutcurlopt_connecttimeout을 설정하십시오.

  • curlopt_followlocation을 지원합니다 (일부 환경에서는 활성화되어야합니다).

  • 이 사이트에 크롤링 전략 (검증 코드, JS 렌더링, 로봇)이있는 경우 다음을 고려하십시오.

    • 간단한 요청 헤더 변장 (그러나 법률 및 웹 사이트 로봇 계약을 준수).

    • JS (예 : 헤드리스 브라우저)가있는 크롤러를 사용하지만 PHP 기본 범위를 벗어납니다.

  • HTTP 상태 코드를 처리하고 실패에 대해 다시 시도하지만 (운동 낙하) 과도한 요청을 피하십시오.

예 : 헤더가있는 컬 :

 <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 =&gt; </span><span><span class="hljs-literal">true</span></span><span>,
    CURLOPT_FOLLOWLOCATION =&gt; </span><span><span class="hljs-literal">true</span></span><span>,
    CURLOPT_MAXREDIRS =&gt; </span><span><span class="hljs-number">5</span></span><span>,
    CURLOPT_CONNECTTIMEOUT =&gt; </span><span><span class="hljs-number">10</span></span><span>,
    CURLOPT_TIMEOUT =&gt; </span><span><span class="hljs-number">15</span></span><span>,
    CURLOPT_USERAGENT =&gt; </span><span><span class="hljs-string">'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'</span></span><span>,
    CURLOPT_HTTPHEADER =&gt; [
        </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>

질문 F : get_meta_tags ()는 소문자 키 이름 만 반환합니다

기능의 디자인입니다. 키 이름은 소문자로 변환됩니다. 비즈니스가 사례에 민감한 필드에 의존하는 경우 표준화 된 키 이름을 알고 있습니다.


3. 권장 강력한 구현 (제목, 키워드, 설명, OG 태그의 통합 획득)

조합 기능은 다음과 같습니다. 먼저 Curl을 사용하여 HTML을 얻은 다음 정규화를 인코딩 한 다음 DOM을 사용하여 공통 필드 및 모든 메타 목록을 구문 분석하고 반환합니다.

 <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">// 공통 필드 정규화: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">// 모든 사람에게 돌아갑니다 meta 추가 사용을 위해</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">// 예제를 사용하십시오:</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>-&gt;</span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span></span>

4. 성능 및 캐싱 제안

  • 많은 수의 페이지를 배치로 크롤링 해야하는 경우 매번 동일한 URL을 실시간으로 크롤링하지 마십시오. 캐시 (Redis, Memcached 또는 File Cache)를 사용하고 페이지 업데이트 빈도에 따라 1 시간 또는 24 시간과 같은 적절한 만료 정책을 설정하는 것이 좋습니다.

  • 대상 부위에 의해 차단되지 않거나 호스트로부터 너무 높은 압력을받지 않도록 동시 크롤링의 수를 제어하십시오.

  • 우선 순위 크롤링 홈페이지 및 대형 사이트의 중요한 페이지는 모든 링크를 맹목적으로 크롤링하는 것을 피합니다.


5. 보충 팁 및 예방 조치

  • 메타 태그 쓰기 방법은 균일하지 않습니다 . 많은 현대 사이트에서 OG : 제목트위터 : 제목을 사용합니다 . DOM을 사용하면 모든 유형을 한 번에 캡처 할 수 있습니다.

  • 메타 태그 복제 : 페이지에 여러 메타 이름이 표시되면 (다국어 또는 버전 제어에 사용될 수 있음), 구문 분석 로직을 첫 번째를 취할지, 병합 또는 저장할지 여부를 결정해야합니다.

  • 메타의 HTML 엔티티 : & amp와 같은 디코딩 엔티티에주의를 기울입니다. &#123; ( html_entity_decode () ).

  • 로봇/메타-프레 쉬 : 메타 새로 고침 (리디렉션) 또는 로봇 noindex를 처리 해야하는 경우 HTTP-equiv 및 해당 속성을 구체적으로 확인하십시오.

  • Robots.txt 및 법률을 준수하십시오 : 크롤링하기 전에 대상 사이트 robots.txt 및 서비스 약관을 확인하고 개인 정보 및 저작권을 존중하며 제한된 콘텐츠를 크롤링하지 마십시오.


6. 실제 점검 목록 (빠른 확인 단계)

  1. <meta name = "keywords"> 또는 <title>을 크롤링할지 여부를 확인하십시오 (두 도구는 다른 도구입니다).

  2. 원격 크롤링 인 경우 : 먼저 Curl을 사용하여 원래 HTML을 얻고 인쇄하고 메타의 특정 쓰기 및 인코딩을 확인하십시오.

  3. UTF-8이 아닌 경우 charset을 확인한 다음 먼저 변환 한 다음 구문 분석하십시오.

  4. get_meta_tags ()를 추출 할 수없는 경우 domdocument 로 전환하여 이름 , 속성HTTP-Queviv를 동시에 캡처하십시오.

  5. HTTP 오류, 리디렉션 및 크롤링 메커니즘을 처리하십시오 (UA, 타임 아웃 및 재시도 정책을 적절하게 설정).

  6. 중복 요청을 피하기 위해 중요한 페이지의 캐시를 구현하십시오.


7. 요약

  • get_meta_tags () 는 간단하고 사용하기 쉽지만 표준 및 간단한 메타 이름 = "..." 시나리오에만 적용됩니다. 유형 <title> 또는 속성 의 메타를 크롤링 하지 않습니다 .

  • 복잡한 비표준 또는 비우프 -8 페이지의 경우 Curl + Domdocument 의 조합을 사용하는 것이 좋습니다. 더 유연하고 강력합니다.

  • 코딩, 원격 요청 실패, 역 크롤링 및 메타 작성은 일반적인 결함 지점입니다. 대부분의 문제는 위의 문제 해결 순서대로 찾아서 고정 될 수 있습니다.

  • JS 렌더링 (SPA, 동적로드 메타)이 필요한 페이지를 처리 ​​해야하는 경우 헤드리스 브라우저 또는 서버 측 렌더링 솔루션 (PHP 기본 범위에서)을 사용해야합니다.