Web 크롤링/PHP Crawling

네이버 증권 최대주주 지분율 크롤링

Link2Me 2024. 8. 17. 11:11
728x90

네이버 증권에서 최대주주 지분율을 가져오는 코드를 구현해보자.

 

위 보유지분을 일일이 확인하기 귀찮아서 구현한 코드이다.

 

<?php
error_reporting(0);
//*
ini_set("display_startup_errors"1);
ini_set("display_errors"1);
error_reporting(E_ALL);
// */
 
ini_set('max_execution_time'0);
ini_set('memory_limit','-1'); // 메모리 무제한으로 늘리기
 
require_once 'simple_html_dom.php';
 
$code = '142280';
 
    // Naver Finance URL 생성
    $url = 'https://finance.naver.com/item/coinfo.naver?code=' . $code;
 
    // 웹페이지에서 HTML 데이터 가져오기
    $ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";
    $options = [
        "http" => [
            "header" => "User-Agent: " . $ua
        ]
    ];
    $context = stream_context_create($options);
    $html = file_get_html($urlfalse$context);
 
    if ($html !== false) {
        // iframe을 찾아서 src 속성 값을 가져온다.
        $frame = $html->find('iframe#coinfo_cp'0);
        if ($frame) {
            $frameaddr = $frame->src;
 
            // iframe에서 HTML 데이터 가져오기
            $frame_html = file_get_html($frameaddrfalse$context);
 
            if ($frame_html !== false) {
                // 특정 클래스를 가진 모든 <td> 요소를 찾는다.
                $coinfo = $frame_html->find('#cTB13 > tbody tr td.noline-right.num');
 
                // 합계 변수 초기화
                $sum = 0;
 
                foreach ($coinfo as $val) {
                    $info = trim($val->plaintext);
                    if ($info !== '') {
                        // 문자열을 숫자로 변환하여 합계에 추가
                        $info = floatval($info);
                        $sum += $info;
                    }
                }
                echo $sum// 이걸 확인한다. 필요시 DB 저장하는 코드를 추가하면 된다.
 
            } else {
                echo 'Failed to retrieve iframe content';
            }
        } else {
            echo 'Failed to find iframe';
        }
    } else {
        echo 'Failed to retrieve main content';
    }
 
?>
 

 

Python 으로 구현했던 코드를 chatGPT에 PHP코드로 변환해 달라고 했더니 변환해주었다.

약간의 오류를 수정하고 원하는 결과를 얻었다.

PHP로 구현했던 함수를 Python 으로 변경 요청하면 제대로 동작이 안되는 경우가 많아 이기종 언어간에 변환은 크게 기대하지 않았었다.

PHP 와 Python 을 접목하여 사용했었는데 이 코드로 Python을 별도 설치하지 않고 해결할 수 있어 편하다.

 

위 코드에서 치명적인 단점은 한글 인식을 못한다는 것이다.

몇차례 chatGPT에 해결책을 요구했으나 끝내 해결되지 않아서 내가 해결책을 제시해줬다.

    $userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0';
    $options = [
        'http' => [
            'header' => 'User-Agent: ' . $userAgent
        ]
    ];
 
    $context = stream_context_create($options);
 
    $html = file_get_html($urlfalse$context);
 
    // HTML의 인코딩을 감지
    $enc = mb_detect_encoding($htmlarray('EUC-KR''UTF-8''shift_jis''CN-GB'));
 
    // 감지된 인코딩이 UTF-8이 아닌 경우 변환
    if ($enc != 'UTF-8') {
        $html = iconv($enc'UTF-8'$html);
    }
 
    $html = str_get_html($html);

 

 

 

728x90