[Python] Beautiful Soup으로 크롤링하기 (기본편)

    Beautiful Soup이란?

    Beautiful Soup는 HTML 및 XML 문서를 파싱하기 위한 파이썬 라이브러리(Python Library)입니다. 웹 스크래핑(Web Scraping)에 사용되며, 복잡하고 비정형적인 웹 페이지로부터 필요한 데이터를 빠르고 쉽게 추출하는 것을 도와주고 있습니다.

     

    [Python] Beautiful Soup으로 크롤링하기 (기본편)


    Beautiful Soup 예제

    from bs4 import BeautifulSoup
    import requests
    
    # 스크래핑할 URL
    url = "https://needjarvis.tistory.com/802"
    
    # 해당 url에 연결한 후 HTML 내용을 가져옵니다.
    response = requests.get(url)
    html_content = response.text
    
    print(html_content)

     

    위 예제를 실행할 때 만약 아래와 같이 에러가 발생한다면, 코드를 아래로 변경합니다.

     

    에러 상황

    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)

     

    코드 교체

    response = requests.get(url, verify=False)

    request.get 부분에서 verify=False 인자값을 추가합니다.

     

    실행 결과

    위와 같이 HTML의 내용을 정상적으로 가져온 것을 확인할 수 있습니다. 이제 이 HTML 태그를 파싱하여 스크래핑해보도록 하겠습니다.

     

     

    제목 추출하기

    제목을 추출해보도록 할텐데요. 그럴려면 사이트에서 제목이 어느 위치에 있는지를 알아야 합니다.

     

     

    크롤링하는 URL의 제목의 경우 위 이미지 처럼 jb-content-title이라는 클래스에 담겨져 있기도 하며, 현재 포스팅의 경우 title 태그안에도 해당 제목으로 만들어져 있습니다.

     

    우선 title 태그를 그냥 가지고 오는 예제를 보겠습니다.

    from bs4 import BeautifulSoup
    import requests
    
    # 스크래핑할 URL
    url = "https://needjarvis.tistory.com/802"
    
    # 해당 url에 연결한 후 HTML 내용을 가져옵니다.
    response = requests.get(url, verify=False)
    html_content = response.text
    
    # Beautiful Soup 객체로 파싱
    soup = BeautifulSoup(html_content, 'html.parser')
    
    title = soup.find('title')
    print(title)

    실행 결과

     

    위와 같이 title이라는 태그를 입력하면, title에 적힌 내용을 리턴하여 변수에 담게 됩니다. 이번에는 title 태그가 아니라 포스팅의 Html 태그를 캡쳐 했던 jb-content-title 클래스가 있는 태그값을 가져와보도록 하겠습니다.

     

    from bs4 import BeautifulSoup
    import requests
    
    # 스크래핑할 URL
    url = "https://needjarvis.tistory.com/802"
    
    # 해당 url에 연결한 후 HTML 내용을 가져옵니다.
    response = requests.get(url, verify=False)
    html_content = response.text
    
    # Beautiful Soup 객체로 파싱
    soup = BeautifulSoup(html_content, 'html.parser')
    
    title = soup.find(class_='jb-content-title')
    print(title)

     

    실행 결과

     

    jb-content-title 클래스가 있는 태그값이 다른 값도 포함이 되어 있어서 보긴 그렇지만, 태그의 결과는 잘 가져오는 것을 확인할 수 있습니다. 이번에는 좀 더 심화로 jb-content-title > h2 > a 태그의 값을 가져와보도록 하겠습니다.

     

    from bs4 import BeautifulSoup
    import requests
    
    # 스크래핑할 URL
    url = "https://needjarvis.tistory.com/802"
    
    # 해당 url에 연결한 후 HTML 내용을 가져옵니다.
    response = requests.get(url, verify=False)
    html_content = response.text
    
    # Beautiful Soup 객체로 파싱
    soup = BeautifulSoup(html_content, 'html.parser')
    
    title = soup.select_one('.jb-content-title > h2 > a')
    print(title)

     

     

    이전 예제와 차이점은 find를 사용하지 않고, select라는 메소드를 사용했다는 것입니다. select를 사용하면 css, jquery처 태그를 접근할 수 있어서 find보다 훨씬 사용하기 수월합니다.

     

    이제 값을 가져왔으면, 태그를 제거해야 하는데요 태그를 제거하는 것과 beautiful soup의 다양한 메소드를 사용하는 방법은 다음 포스팅(심화편)에서 작성해보도록 하겠습니다.

     

    참고자료

    [1] https://beautiful-soup-4.readthedocs.io/en/latest/

    댓글

    Designed by JB FACTORY