>  기사  >  백엔드 개발  >  PHP HTML JavaScript Css는 간단한 크롤러 development_php 기술을 구현합니다.

PHP HTML JavaScript Css는 간단한 크롤러 development_php 기술을 구현합니다.

WBOY
WBOY원래의
2016-05-16 19:55:351132검색

크롤러를 개발하려면 먼저 크롤러가 어떤 용도로 사용될지 알아야 합니다. 다양한 웹사이트에서 특정 키워드가 포함된 기사를 찾고, 해당 기사의 링크를 얻어 빠르게 읽을 수 있도록 하고 싶습니다.

개인 습관에 따라 먼저 인터페이스를 작성하고 아이디어를 명확히 해야 합니다.

1. 다른 웹사이트로 이동합니다. 그런 다음 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>

코드를 직접 추가한 다음 스타일을 직접 조정하면 인터페이스가 완성됩니다.

다음 단계는 함수를 구현하는 것입니다. 첫 번째 단계는 웹사이트의 html 코드를 얻는 것입니다. 하나씩 소개하지는 않겠습니다. 여기서는 Curl이 사용됩니다. 가져오고 웹사이트 URL을 전달하면 HTML 코드가 표시됩니다.

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, 'gzip');
 
 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36');
 
 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, 'utf-8', 'GBK,UTF-8,ASCII');

웹사이트의 HTML을 가져오고 기사의 URL을 가져옵니다. 그런 다음 다음 단계는 웹페이지 아래의 모든 태그를 일치시키는 것입니다. 여러 테스트를 거쳐 마침내 더 안정적인 정규식을 얻을 수 있습니다. a 태그 아래의 구조가 아무리 복잡하더라도 태그인 한 놓치지 않습니다. (가장 중요한 단계)

$pattern = '|<a[^>]*>(.*)</a>|isU';
 
preg_match_all($pattern, $html, $matches);

일치 결과는 $matches에 있으며 이는 아마도 다음과 같은 다차원 그룹일 것입니다.

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

이 데이터를 얻을 수 있는 한 다른 모든 것은 완전히 작동 가능합니다. 이 요소 그룹을 탐색하고 원하는 a 태그를 찾은 다음 원하는 모든 작업을 수행할 수 있습니다. 태그를 더 쉽게 작동할 수 있도록 권장되는 클래스는 다음과 같습니다.

$dom = new DOMDocument();
 
@$dom->loadHTML($a);//$a是上面得到的一些a标签
 
$url = new DOMXPath($dom);
 
$hrefs = $url->evaluate('//a');
 
for ($i = 0; $i < $hrefs->length; $i++) {
 
 $href = $hrefs->item($i);
 
 $url = $href->getAttribute('href'); //这里获取a标签的href属性
 
}

물론 이는 단지 한 가지 방법일 뿐입니다. 정규식을 사용하여 원하는 정보를 일치시키고 데이터를 사용하여 새로운 트릭을 사용할 수도 있습니다.

원하는 결과를 얻고 일치시키는 단계는 물론 이를 프런트 엔드로 다시 보내 인터페이스를 작성한 다음 js를 사용하여 프런트 엔드에서 데이터를 가져오고 jquery를 사용하여 동적으로 수행하는 것입니다. 콘텐츠를 추가하고 표시하세요.

var website_url = '你的接口地址';
$.getJSON(website_url,function(data){
 if(data){
  if(data.text == ''){
   $('#article_url').html('<div><p>暂无该文章链接</p></div>');
   return;
  }
  var string = '';
  var list = data.text;
  for (var j in list) {
    var content = list[j].url_content;
    for (var i in content) {
     if (content[i].title != '') {
      string += '<div class="item">' +
       '<em>[<a href="http://' + list[j].website.web_url + '" target="_blank">' + list[j].website.web_name + '</a>]</em>' +
       '<a href=" ' + content[i].url + '" target="_blank" class="web_url">' + content[i].title + '</a>' +
       '</div>';
     }
    }
   }
  $('#article_url').html(string);
});

최종 렌더링:

위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.