ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [python] 웹 사이트 크롤링(parsing) with BeautifulSoup/requests/selenium
    Programing/python 2020. 3. 16. 01:55

    python을 이용해 웹 사이트 파싱을 한번 해보자.

     

    간단한 파싱 예제는 구글에 검색하면 충분히 접 할 수 있다.

     

    이 글은 javascript를 통해 비동기적으로 데이터가 뿌려지거나(딜레이 로드),

    파싱하는 과정에서 클릭 등과 같은 이벤트가 필요할때 유용하고자 함을 목적으로 한다.

     

    python3를 사용하며,

    필요한 모듈은 아래와 같이 pip3를 사용해 설치해준다.

    # install modules
    pip3 install requests # 이 예제에선 사용 안함
    pip3 install bs4
    pip3 install selenium
    pip3 install webdriver-manager

    그리고 여기 에서 OS에 맞게 geckodriver를 다운로드하여 적당한 위치에 압축을 풀어준다.

    나의 경우 프로젝트 루트에 압축을 풀었다.

     

     

    긴 설명 없이 바로 코드로 말한다.

     

    먼저 관련 모듈을 가져온다.

    // crawling.py
    import time	# 딜레이를 위함
    # import requests	# html 파싱
    from bs4 import BeautifulSoup # 파싱된 데이터를 python에서 사용하기 좋게 변환
    from selenium import webdriver # webdriver를 통해 파싱하기 위함
    driver = webdriver.Firefox(executable_path='./geckodriver') # Firefox사용 (또는 chromium)
    

     

    driver를 통해 실제 브라우저(Firefox)를 실행해 페이지를 로드하고

    해당 페이지의 모든 javascript가 실행된 후 html을 가져온다.

    (이 방법을 사용하지 않으면 javascript에서 생성된 데이터를 가져올 수 없다.)

    그리고 BeautifulSoup를 통해 작업하기 쉽게 구조화시킨다.

    driver.get('WEBSITEURL')
    html = driver.page_source
    soup = BeautifulSoup(html)

     

    그런 뒤 사이트에 들어가 원하는 객체의 태그 selector를 가져온다.

    직접 하지말고 브라우저의 개발자도구 탭에서 가져오면 쉽게 가져올 수 있다.

    #contents > table > tbody

     

    앞서 가져온 selector를 이용해 아래와 같이 사용하면

    해당 tbody 안 tr 안 모든 td들을 출력된다.

    tbody = soup.select(
        '#contents > table > tbody'
        )
    # prodList = soup.find_all("태그명", {"class": "클래스명"})
    
    for trs in tbody:
        for tds in trs.findAll('td'):
            print(tds)

     

    만약 버튼을 눌러야 원하는 데이터가 나타나는 경우는

    아래와 같이 버튼의 태그를 찾아 스크립트 코드를 복사한다.

    그리고 driver.execute_script 함수 호출시 인자로 넘겨주면 된다.

    driver.execute_script("스크립트코드")
    time.sleep(1)

     

     

    이 과정을 모두 마쳤다면,

    이제 당신은 파싱 마스터다.

     

     

     


     

    FileNotFoundError: [Errno 2] No such file or directory: 'geckodriver': 'geckodriver' with GeckoDriver and Python in MAC OS
    

     

     

    참조

    참조

    댓글

Designed by Tistory.