[Python] 웹크롤링 - 태그를 이용해서 크롤링하기 - (2) 사전구축

2023. 3. 7. 22:22·python/자동화
728x90
반응형

이전 코드에서 나아가 한국민족대백과사전의 사전을 크롤링을 통해 만들어보겠습니다.

from bs4 import BeautifulSoup
import urllib.request as req 
import argparse # 특정 웹사이트로 접속하기 위해
import re

def crawling_list(url):
    res = req.urlopen(url).read()
    soup = BeautifulSoup(res, 'html.parser') #분석 용이하게 파싱
    find_tag = soup.findAll("a",{"class":"depth1-title"}) # "div",{"class":"section_body"}

    korean_hist = dict()
    for i in range(len(find_tag)):
        txt = re.sub(r"[^가-힣]","",str(find_tag[i].get_text())) # 특수문자 제거
        korean_hist[txt] = []

    return korean_hist

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    
    parser.add_argument("--url", type=str, default='https://encykorea.aks.ac.kr/')

    args = parser.parse_args()

    korean_hist = crawling_list(args.url)

    print(korean_hist)

이전 코드에서 특수문자를 제거하는 코드를 더 작성했습니다. ^-^ v

 

저는 사전을 크롤링을 통해서 구축할 것이기 때문에 해당 태그들을 수집하겠습니다.

<div class="title">가군(加群)</div>

그리고 한 페이지만 흭득하는 것이 아니라, 모든 페이지의 내용을 흭득할 것이므로

페이지를 넘겼을때 어떻게 사이트가 이동하는지 확인합니다.

해당 사이트는 이렇게 페이지를 이동할 때마다 "전체/?p=2&" 에서 숫자가 증하나는 것 같습니다.

 

페이지를 벗어나면 이렇게 목록이 안뜨는 것을 볼 수 있습니다.

 

그리고 해당 주소를 이렇게 복사 붙여넣기 해보면

https://encykorea.aks.ac.kr/Article/List/Type/%EC%9D%B8%EB%AC%BC/%EC%A0%84%EC%B2%B4?p=1&

저희는 분명 중간에 한글을 넣었는데 이렇게 인코딩 된 주소가 되는 것을 알 수 있습니다.

그래서 파이썬에 주소를 그냥 한글로 입력하면 오류가 발생합니다.

def visit_site(visit_url,word):
    word_list = []
    i = 1
    while True:
        url = visit_url + word + "/" + "전체" + "?p=" + str(i) + "&"
        print(url)
        
        res = req.urlopen(url).read()
        soup = BeautifulSoup(res, 'html.parser') #분석 용이하게 파싱
        find_tag = soup.findAll("div",{"class":"title"}) # "div",{"class":"section_body"}
        for i in range(len(find_tag)):
            word_list.append(re.sub(r"[^가-힣a-zA-Z0-9]","",str(find_tag[i].get_text())))
        i += 1
        break
    print(word_list)
    return word_list
UnicodeEncodeError: 'ascii' codec can't encode characters in position 23-24: ordinal not in range(128) 오류

해당 코드로 실행하면 다음과 같은 오류를 볼 수 있습니다.

 

따라서 주소에 적힌 한글을 인코딩하는 코드를 추가합니다.

 

갓GPT...

def visit_site(visit_url,word):
    word_list = []
    i = 1
    while True:
        url = visit_url + word + "/" + "전체" + "?p=" + str(i) + "&"
        encoded_url = quote(url, safe=':/?&') # 한글 주소 인코딩
        print(encoded_url)
        res = req.urlopen(encoded_url).read()
        soup = BeautifulSoup(res, 'html.parser') #분석 용이하게 파싱
        find_tag = soup.findAll("div",{"class":"title"}) # "div",{"class":"section_body"}
        for i in range(len(find_tag)):
            word_list.append(re.sub(r"[^가-힣a-zA-Z0-9]","",str(find_tag[i].get_text())))
        i += 1
        break
    print(word_list)
    return word_list

이렇게 인코딩이 잘 되는 모습을 볼 수 있습니다 ㅎㅎ

 

전체 코드

from bs4 import BeautifulSoup
import urllib.request as req 
import argparse # 특정 웹사이트로 접속하기 위해
import re
from urllib.parse import quote

def crawling_list(url):
    res = req.urlopen(url).read()
    soup = BeautifulSoup(res, 'html.parser') #분석 용이하게 파싱
    find_tag = soup.findAll("a",{"class":"depth1-title"}) # "div",{"class":"section_body"}

    korean_hist = dict()
    for i in range(len(find_tag)):
        txt = re.sub(r"[^가-힣a-zA-Z0-9]","",str(find_tag[i].get_text())) # 특수문자 제거
        korean_hist[txt] = []

    return korean_hist

def visit_site(visit_url,word):
    word_list = []
    idx = 1
    while True:
        url = visit_url + word + "/" + "전체" + "?p=" + str(idx) + "&"
        encoded_url = quote(url, safe=':/?&=') # 한글 주소 인코딩
        print(encoded_url)
        res = req.urlopen(encoded_url).read()
        soup = BeautifulSoup(res, 'html.parser') #분석 용이하게 파싱
        find_tag = soup.findAll("div",{"class":"title"}) # "div",{"class":"section_body"}
        if find_tag:
            for i in range(len(find_tag)):
                word_list.append(re.sub(r"[^가-힣a-zA-Z0-9]","",str(find_tag[i].get_text())))
                
            idx += 1
        else:
            break
    print("done")
    return word_list


if __name__ == "__main__":

    parser = argparse.ArgumentParser()
    
    parser.add_argument("--url", type=str, default='https://encykorea.aks.ac.kr/')
    parser.add_argument("--visit_url", type=str, default='https://encykorea.aks.ac.kr/Article/List/Type/')

    args = parser.parse_args()

    korean_hist = crawling_list(args.url)
    visit_site(args.visit_url,"인물")
    for hist in korean_hist:
        korean_hist[hist] += visit_site(args.visit_url,hist)
        print(hist,"사전의 전체 개수:",len(korean_hist[hist]))
728x90
반응형

'python > 자동화' 카테고리의 다른 글

[Python] 웹크롤링 - 태그를 이용해서 크롤링하기 - (최종) 한국민족문화대백과사전 크롤링하기  (0) 2023.03.08
[Python] 웹크롤링 - 태그를 이용해서 크롤링하기 - (3) 사전을 Json파일로 저장  (0) 2023.03.07
[Python] 네이버 뉴스 기사 태그 출력하기  (0) 2022.09.29
[Python] 웹 자동화 기초 - 경고창 이동, 쿠키, 자바스크립트 코드 실행  (1) 2022.09.29
[Python] 웹 자동화 기초 - 엘레먼트(클릭, 텍스트, 프레임 이동)  (0) 2022.09.29
'python/자동화' 카테고리의 다른 글
  • [Python] 웹크롤링 - 태그를 이용해서 크롤링하기 - (최종) 한국민족문화대백과사전 크롤링하기
  • [Python] 웹크롤링 - 태그를 이용해서 크롤링하기 - (3) 사전을 Json파일로 저장
  • [Python] 네이버 뉴스 기사 태그 출력하기
  • [Python] 웹 자동화 기초 - 경고창 이동, 쿠키, 자바스크립트 코드 실행
sillon
sillon
꾸준해지려고 합니다..
    반응형
  • sillon
    sillon coding
    sillon
  • 전체
    오늘
    어제
    • menu (614)
      • notice (2)
      • python (68)
        • 자료구조 & 알고리즘 (23)
        • 라이브러리 (19)
        • 기초 (8)
        • 자동화 (14)
        • 보안 (1)
      • coding test - python (301)
        • Programmers (166)
        • 백준 (76)
        • Code Tree (22)
        • 기본기 문제 (37)
      • coding test - C++ (5)
        • Programmers (4)
        • 백준 (1)
        • 기본기문제 (0)
      • 공부정리 (5)
        • 신호처리 시스템 (0)
        • Deep learnig & Machine lear.. (41)
        • Data Science (18)
        • Computer Vision (17)
        • NLP (40)
        • Dacon (2)
        • 모두를 위한 딥러닝 (강의 정리) (4)
        • 모두의 딥러닝 (교재 정리) (9)
        • 통계 (2)
      • HCI (23)
        • Haptics (7)
        • Graphics (11)
        • Arduino (4)
      • Project (21)
        • Web Project (1)
        • App Project (1)
        • Paper Project (1)
        • 캡스톤디자인2 (17)
        • etc (1)
      • OS (10)
        • Ubuntu (9)
        • Rasberry pi (1)
      • App & Web (9)
        • Android (7)
        • javascript (2)
      • C++ (5)
        • 기초 (5)
      • Cloud & SERVER (8)
        • Git (2)
        • Docker (1)
        • DB (4)
      • Paper (7)
        • NLP Paper review (6)
      • 데이터 분석 (0)
        • GIS (0)
      • daily (2)
        • 대학원 준비 (0)
      • 영어공부 (6)
        • job interview (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    백준
    programmers
    소수
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
sillon
[Python] 웹크롤링 - 태그를 이용해서 크롤링하기 - (2) 사전구축
상단으로

티스토리툴바