파이썬/크롤링

[python-파이썬] 14 네이버에서 지역별 인구정보 크롤링 (crawling) - 1탄

모두의 실험실 2022. 4. 22. 21:16
728x90

안녕하세요. 모두의 파이썬입니다. 부동산 공부를 하면서 부동산 가격에 영향을 끼치는 요소가 무엇이라고 생각하나요? 여려가지가 있겠지만, 인구, 기업(일자리), 철도 정도로 축소해 보겠습니다. 3개 모두 연관이 있습니다. '닭이 먼저냐 달걀이 먼저냐' 묻는 것과 비슷할 수 있습니다. 당연 인구가 젤 중요한 요소로 꼽힙니다. 그리고 그 인구의 절대 수치도 중요하지만, 절대 수치는 부동산 가격에 선반영되어 있다고 감히 말해 봅니다. 그래서 1탄에서는 네이버 크롤링을 통해 절대적 수치를 구해보고 2탄에서는 예상되는 추이인 변화량을 절대적 수치를 활용하여 구해 보겠습니다.

전체 글을 요약하면, 1탄에서는 네이버에서 지역별 인구의 연도별 수치를 크롤링 하겠습니다.

 

모두의 파이썬은 1위를 추종하므로, 대한민국 1위 도시인 서울시 인구를 확인하겠습니다. 네이버에서 '서울시 인구'라고 검색을 하면, 통계청 지표를 참조한 그래프를 볼 수 있습니다. 서울시 인구는 연도별 감소하고 있습니다. 특별한 정책이 일어나지 않는다면, '22년 12월의 수치는 21년도 12월보다 감히 할 것이라고 예상해 볼 수 있습니다.

ⓒ서울시 연도별 인구 정보, 출처 네이버검색

 

크롤링의 기본은 개발자도 구 (F12 or 우 클릭>검사) 분석입니다. html 내에서 규칙을 찾아보겠습니다. 'tag'정보로는 찾기 어려워서, html을 출력하여 서울시 연도별 인구 정보가 있는 text 위치를 확인해 보겠습니다. 여러분이 최종적으로 구하려는 데이터는 '서울시 인구'입니다. 2020년 서울시 인구 (966.8)를 찾기 위해 코드를 구현해 보겠습니다.

ⓒ서울시 연도별 인구 정보, 출처 네이버검색

 

 

In [6]:
### 네이버에서 지역별 인구정보 크롤링
### 네이버에서 지역별 인구정보 크롤링
### 네이버에서 지역별 인구정보 크롤링

import requests
from bs4 import BeautifulSoup

def get_html(url):
    ## 브라우저 호환을 위해서 설정
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '+ \
        '(KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
                } 
    ##해당 url에 htlm(정보) 요청에사용 / url은 사용자가 원하는 url
    r = requests.get(url, headers=headers) 
    ## 해당 url의 html을 사용자가 활용하기 쉽게 변환
    html = BeautifulSoup(r.content, 'html.parser')
    ## 결과값 전달
    return html

def get_population_info(city_name):
    #try:
        url = 'https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=' + city_name + '인구'
        html = get_html(url)
        ## 도시별 html출력 예외케이스를 방지하기위해 공백제거
        html = str(html).replace(' ','')
        
        print(html)
    

get_population_info('서울시')
 
 
html 출력 후 find(ctrl+f) 기능을 활용하여 '966.8'을 입력해 보겠습니다. 아래 그림을 보면 연도별 서울시 인구 전체 결과를 확인할 수 있습니다. 그리고 연도별 인구 수치 시작과 끝을 확인하겠습니다. 시작은 ',{"billboard":{"data":{"type":Chart.type.line(),columns:[["data1",' 이며 끝은 ']],"colors":{"data1":' 를 찾았습니다. 전체 코드를 구현하겠습니다. 
 

네이버검색 '서울시 인구' html정보

 

 

 

In [8]:
### 네이버에서 지역별 인구정보 크롤링
### 네이버에서 지역별 인구정보 크롤링
### 네이버에서 지역별 인구정보 크롤링

import requests
from bs4 import BeautifulSoup

def get_html(url):
    ## 브라우저 호환을 위해서 설정
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '+ \
        '(KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
                } 
    ##해당 url에 htlm(정보) 요청에사용 / url은 사용자가 원하는 url
    r = requests.get(url, headers=headers) 
    ## 해당 url의 html을 사용자가 활용하기 쉽게 변환
    html = BeautifulSoup(r.content, 'html.parser')
    ## 결과값 전달
    return html

def get_population_info(city_name):
    #try:
        url = 'https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=' + city_name + '인구'
        html = get_html(url)
        ## 도시별 html출력 예외케이스를 방지하기위해 공백제거
        html = str(html).replace(' ','')
        
        ## 인구정보 시작 point
        data_text = ',{"billboard":{"data":{"type":Chart.type.line(),columns:[["data1",'
        ## 인구정보 끝 point
        data_end_text = ']],"colors":{"data1":'

        ## 인구정보 시작 point 찾기
        p_data =str(html).find(data_text,0)
        ## 인구정보 끝 point 찾기
        p_data_end = str(html)[p_data:].find(data_end_text,0)
        ## 최종 인구정보 크롤링
        data = str(html)[p_data + len(data_text):p_data + p_data_end]
        ## text가공하여 list형태로 변형
        l_data = [float(i) for i in str(html)[p_data + len(data_text):p_data + p_data_end].split(',')]
        return l_data

print(get_population_info('서울시'))
 
[1019.5, 1014.4, 1010.3, 1002.2, 993.1, 985.7, 976.6, 972.9, 966.8, 950.9]

 

1탄에서는 도시를 입력으로 해서 연도별 인구를 크롤링 하였습니다. 코드 구현 전체 순서를 요약해 보겠습니다. 네이버에서 도시 인구 검색 > 검색 페이지 html 출력 > html 출력에서 도시인구 find > 인구 정보 시작과 끝부분 text 확인 > 코드 구현 비유를 하자면, 처음이 어렵지 반복하면 어느새 '구구단 말하기'와 같아집니다. 끝까지 포기 말고 이해하면서 끊임없이 도전하길 바랍니다. 2탄에서는 국내에 '시'로 분류되는 전체 도시 인구를 얻고, 인구 정보를 활용하여 증가량 또는 감소량을 구해 보겠습니다.

 

print('모두의 파이썬')

※좋아요/댓글은 서로를 응원합니다!

728x90
반응형