LAINO의 개발노트

PHP로 뉴스파싱 API만들기 본문

PHP/프로젝트

PHP로 뉴스파싱 API만들기

Laino 2017. 11. 23. 23:43

안녕하세요 오늘은 PHP를 통해 제가 관심있어하는 사이트의 뉴스를 파싱해보고 손쉽게 가져올수 있도록 API까지 구성해볼까 합니다.


먼저 오늘 제가 파싱할 사이트는 https://cointelegraph.com 입니다.

대부분 외국사이트들이 rss를 지원하는 만큼 혹시나 하는 마음에 https://cointelegraph.com/rss를 들어가보니 

RSS를 지원합니다! 이로써 우리의 작업은 간단해질것이 틀림이 없습니다.


그럼 바로 PHP소스부터 짜도록 하겠습니다.



Postman을 통해 리퀘스트를 해본 결과 아무 헤더 없이 잘 날아가는것을 확인하였습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
 
  $curl = curl_init();
  $url = "https://cointelegraph.com/rss";
 
  curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
  curl_setopt($curl,CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_HTTPHEADER, array(
        'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'));
 
  $res = curl_exec($curl);
  echo curl_error($curl);
 
  echo '<pre>' ;
  print_r($res); //debug
  echo '</pre>';
 
?>
cs


제가 사용한 PHP소스는 이렇습니다. 결과도 잘 표시 되고요.


이제 받아온 데이터를 가공하여 우리가 쓸수있도록 만들어야 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<item>
    <title>
        <![CDATA[Blockchain Unlocks Consulting Model for Experts of All Kinds, Worldwide]]>
    </title>
    <link>https://cointelegraph.com/news/blockchain-unlocks-consulting-model-for-experts-of-all-kinds-worldwide</link>
    <media:content url="https://cointelegraph.com/images/528_Ly9jb2ludGVsZWdyYXBoLmNvbS9zdG9yYWdlL3VwbG9hZHMvdmlldy8zMTg3MWE2NjViNWRjMTdiMDM5OTFiMDY1ZTdkODFlNC5qcGc=.jpg"  medium="image"  />
    <enclosure url="http://cointelegraph.com/images/528_Ly9jb2ludGVsZWdyYXBoLmNvbS9zdG9yYWdlL3VwbG9hZHMvdmlldy8zMTg3MWE2NjViNWRjMTdiMDM5OTFiMDY1ZTdkODFlNC5qcGc=.jpg"  length="528" type="image/jpg"/>
    <pubDate>Thu, 23 Nov 2017 01:48:32 +0000</pubDate>
    <dc:creator>
        <![CDATA[CoinTelegraph By Iyke Aru]]>
    </dc:creator>
    <category>
        <![CDATA[Blockchain]]>
    </category>
    <category>
        <![CDATA[Internet]]>
    </category>
    <category>
        <![CDATA[Payments]]>
    </category>
    <category>
        <![CDATA[Decentralization]]>
    </category>
    <guid isPermaLink="false">https://cointelegraph.com/news/blockchain-unlocks-consulting-model-for-experts-of-all-kinds-worldwide</guid>
    <description>
        <![CDATA[<img src="https://cointelegraph.com/images/528_Ly9jb2ludGVsZWdyYXBoLmNvbS9zdG9yYWdlL3VwbG9hZHMvdmlldy8zMTg3MWE2NjViNWRjMTdiMDM5OTFiMDY1ZTdkODFlNC5qcGc=.jpg"><p>Many clients use primitive tools to consult with professionals, wasting time and causing inefficiency, mistrust.</p>]]>
    
    </description>
</item>
cs


한 아이템을 뜯어보니 이렇게 나옵니다. 

저는 title, link, enclosure:url pubDate 이렇게만 필요하니 이것들을 파싱해서 json으로 뿌려주도록 간단히 구성해보겠습니다.


1
2
3
4
5
6
7
8
9
10
<?php
    $curl = curl_init();
    $url = "https://cointelegraph.com/rss";
 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($curl,CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array(
        'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'));
 
?>
cs


먼저 php를 통해 cURL을 구성합니다. 헤더는 데스크톱 환경과 동일하게 User-Agent 하나만 넣어줍시다. (아까 postman으로 아무것도 안넣어도 잘날아가는걸 확인했으니..)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

    $data = array();
    $xml = simplexml_load_string($res'SimpleXMLElement', LIBXML_NOCDATA);
    $rawdata = $xml->channel;
 
    foreach($rawdata->item as $value) {
    $title = $value->title;
    $link = $value->link;
    $imgUrl = $value->enclosure['url'];
    $pubDate = $value->pubDate;
    $format = date_create_from_format('D, d M Y H:i:s O'$pubDate);
    $arr = array(
          'title' => "$title",
          'url' => "$link",
          'img' => "$imgUrl",
          'date' => $format->format('Y-m-d H:i:s'));
    array_push($data$arr);
  }

cs


Simple XML Parser을 통해 xml을 사용가능한 object로 만들어 줍니다. 우리가 파싱하는 데이터에는 CDATA가 포함되어 있기 때문에 파싱시 LIBXML_NOCDATA 옵션을 통해 CDATA도 파싱을 할수있도록 포함해줍시다.


파싱후에는 channel 엘리먼트의 자식 엘리먼트들인 item을 foreach를 통해 제가 필요한 데이터만 파싱했는데요,

퍼블리싱한 날짜는 포맷을 지정하여 데이터를 가공해주고 우리가 바꾸기 쉽도록 파싱해줍시다.


데이터들이 준비가 끝났으면 array를 생성하여 데이터를 담고 상위 array에 push합니다.


1
2
3
4
5
 $result = array_merge($data$merge_data);
  array_multisort(array_column($result'date'), SORT_DESC, $result);
  echo json_encode($result) Colored by Color Scripter
cs


저같은경우에는 사이트를 이것말고 다른 사이트도 파싱하였는데요.

파싱한 데이터를 날짜순으로 정렬했습니다.


그러고 푸싱한 데이터들을 JSON으로 인코딩하여 출력하면 간단히 끝납니다.




이렇게하여 간편하게 쓰기쉬운 PHP XML 파싱에 대하여 알아봤습니다.

문의는 댓글 혹은 laino@laino.ml 로 부탁드립니다.


Comments