본문 바로가기
프로그래밍언어/Python

[Python] : 정적 웹 페이지 크롤링

by 오주현 2021. 11. 17.
반응형
정적 웹 페이지 크롤링

국내 커피 브랜드 중 하나인 할리스 커피의 전국 매장 정보를 크롤링합니다.

 

https://www.hollys.co.kr/robots.txt

웹 페이지 크롤링하기 전에 크롤링 허용 여부를 확인하기 위해 위 링크로 들어가 봅니다.

 

User_agent: *

Allow: /

 

또는

 

User-agent: *

Disallow:

 

위 두개는 모든 접근을 허용합니다.

 

User-agent:*

Disallow: /

 

모든 접근을 금지합니다.

 

User-agent:*

Disallow:/user/

 

특정 디렉토리만 접근을 금지합니다.

 

만약 robots.txt 파일이 없다면 수집에 대한 정책이 없으니 크롤링해도 된다는 의미로 받아들이면 됩니다.

 

매장 검색 페이지에서 HTML 소스를 분석해 보면 <tbody> 태그가 매장 정보 테이블임을 알 수 있습니다.

 

각 매장 정보는 <tr> ~ </tr>에 있고 하위에 있는 첫 번째 <td> 태그는 매장이 있는 지역, 두번째 <td> 태그는 매장 이름, 네번째 <td> 태그는 매장 주소, 여섯 번째 <td> 태그는 매장 전화 번호입니다.

 

<tr> 태그가 10개씩 보이기 때문에 다른 매장을 추가적으로 더 보려면 다음 페이지로 이동해서 확인해야 합니다.

 

주소창을 보면 pageNo= 다음에 페이지 번호를 붙여 페이지 주소(url)를 생성하는 원리입니다.

 

이것을 이용해서 매장 정보를 모두 다 크롤링해 올 수 있습니다.

 

마지막 페이지가 56 페이지라는 것을 확인할 수 있습니다.

 

오류가 떠서 확인해 보니 pandas 패키지를 다운하지 않았습니다.

 

pandas 패키지도 다운해 줍니다.

 

패키지는 위 처럼 링크를 눌러서 저장해도 되고 명령 프롬프트에서 다운을 받아도 됩니다.

 

이렇게 python이 있는 곳에 들어가서 

pip install pandas

명령어를 입력해주면 됩니다.

 

from bs4 import BeautifulSoup
import urllib.request
import pandas as pd
import datetime

#[CODE 1]
def hollys_store(result):
    for page in range(1, 58):
        Hollys_url = 'https://www.hollys.co.kr/store/korea/korStore2.do?pageNo=%d&sido=&gugun=&store=' %page
        print(Hollys_url)
        html = urllib.request.urlopen(Hollys_url)
        soupHollys = BeautifulSoup(html, 'html.parser')
        tag_tbody = soupHollys.find('tbody')
        for store in tag_tbody.find_all('tr'):
            if len(store) <= 3:
                break
            store_td = store.find_all('td')
            store_name = store_td[1].string
            store_sido = store_td[0].string
            store_address = store_td[3].string
            store_phone = store_td[5].string
            result.append([store_name] + [store_sido] + [store_address] + [store_phone])

    return

#[CODE 0]
def main():
    result = []
    print('Hollys store crawling >>>>>>>>>>>>>>>>')
    hollys_store(result) #[CODE 1] 호출
    hollys_tb1 = pd.DataFrame(result, columns=('store', 'sido-gu', 'address', 'phone'))
    hollys_tb1.to_csv('./hollys.csv', encoding='cp949', mode='w', index=True)
    del result[:]

if __name__ =='__main__':
    main()

56페이지 모두 다 저장이 된 것을 확인할 수 있습니다.

반응형

댓글