Selenium (Python)을 사용한 웹 스크래핑

7031 단어 파이썬셀레늄
파이썬을 사용한 기계 학습 등을 실시하는 시스템을 구축하거나 하면, 인터넷상에서 공개되고 있는 오픈 데이터라고 불리는 특허등의 제어 메카니즘의 제한 없이 이용할 수 있는 데이터를 이용하기도 합니다.
물론, 취득한 데이터를 이용해, 효율적으로 모델을 갱신하거나 합니다만, 자동화하고 싶은 경우가 있습니다.
이번에는 흔히 말하는 웹 스크래핑으로 셀레늄을 사용해 보겠습니다.

주의사항



기계적인 다운로드가 금지되어 있는 경우가 많기 때문에, 액세스 대상 사이트의 이용 약관을 잘 읽어 주세요.

웹 스크래핑 라이브러리의 대표적인 것



조사한 한이라면 몇 가지 선택 프레임이 있지만 이번에는 사용한 적이 없으므로 Selenium을 사용해 보겠습니다.
내 인식에서는 Selenium은 웹의 화면 조작을 자동화하는 도구이지만, 화면 조작의 자동화를 스크래핑에 이용해 버리는 것입니다.
  • lxm
  • Requests/BeautifulSoup
  • Scrapy
  • Selenium (이번 사용)

  • 환경



    Selenium과 브라우저 (이번에는 Chrome) 사이에 WebDriver라는 드라이버가 필요합니다.
  • Windows 10 64bit
  • Google 크롬 (78.0.3904.108)
  • MacOSX x86_64
  • Anaconda(3.6)

  • Selenium 설치



    Python은 Anaconda를 사용하므로 conda로 설치합니다.
    conda install selenium
    

    WebDriver 설치



    WebDriver는 바이너리 파일을 http://chromedriver.chromium.org/downloads에서 다운로드
    Path가 통과하는 위치에 복사하는 방법과 pip에서 설치하는 방법이 있습니다.
    이번에는 pip(conda)로 설치합니다.
    conda install chromedriver-binary
    

    샘플 실행



    환경이 생겼으므로 먼저 소개 아래 chromedriver 사이트의 샘플을 실행해 보겠습니다.
    내용을 보려면 구글 사이트를 표시하고 ChromeDriver를 검색하고 5 초 수면 종료 등의 내용.
    h tp // ch로메 d리ゔぇr. ch 로미우 m. 오 rg / 갓친 g-s r d

    test1.py
    import time
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get('http://www.google.com/');
    time.sleep(5) # Let the user actually see something!
    search_box = driver.find_element_by_name('q')
    search_box.send_keys('ChromeDriver')
    search_box.submit()
    time.sleep(5) # Let the user actually see something!
    driver.quit()
    
    python test1.py
    

    실행되면 브라우저가 시작되어 ChromeDriver를 검색하기 시작합니다. 브라우저에 "자동 테스트 소프트웨어에 의해 제어됩니다."라고 표시됩니다!
    그리고 간단하다!



    오픈 데이터 취득 샘플



    샘플이 기동하는 것만으로 종료에서는 외롭기 때문에, 아래와 같은 사이트로부터 CSV를 다운로드해 오는 샘플을 만들어 보겠습니다.
  • 지정된 URL (이번에는 특정 URL이 아닌 XXXXX로 흐리게 표시됨)
  • 일일 데이터 (CSV) 링크 대상 CSV 다운로드 (C :\프로젝트에 저장)
  • from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.add_argument('--headless')
    
    download_dir = 'C:\\project'
    prefs = {}
    prefs['download.prompt_for_download'] = False
    prefs['download.directory_upgrade'] = True
    prefs['download.default_directory'] = download_dir
    
    options.add_experimental_option('prefs', prefs)
    
    driver = webdriver.Chrome(chrome_options=options)
    
    driver.get('https://XXXXXXXXXXXXXXXXXXXXXX');
    time.sleep(5) # Let the user actually see something!
    url = driver.find_element_by_partial_link_text("日次データ(CSV)")
    
    
    driver.command_executor._commands["send_command"] = (
        "POST",
        '/session/$sessionId/chromium/send_command'
    )
    params = {
        'cmd': 'Page.setDownloadBehavior',
        'params': {
            'behavior': 'allow',
            'downloadPath': download_dir
        }
    }
    driver.execute("send_command", params=params)
    
    driver.get(url.get_attribute('href'));
    
    time.sleep(5) # Let the user actually see something!
    driver.quit()
    

    브라우저 숨기기 실행



    코드의 다음 부분에서 브라우저를 시작할 때 선택적으로 --headless를 전달하여 브라우저를 숨깁니다.
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.add_argument('--headless')
    options.add_experimental_option('prefs', prefs)
    driver = webdriver.Chrome(chrome_options=options)
    

    다운로드 파일을 저장할 위치 지정



    코드의 다음 부분에서 다운로드 파일을 저장할 위치를 지정합니다.
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    download_dir = 'C:\\project'
    prefs = {}
    prefs['download.prompt_for_download'] = False
    prefs['download.directory_upgrade'] = True
    prefs['download.default_directory'] = download_dir
    options.add_experimental_option('prefs', prefs)
    driver = webdriver.Chrome(chrome_options=options)
    

    --hedless의 경우 추가로 다운로드 파일을 저장할 위치 지정



    --hedless의 경우, 추가로 다운로드 파일을 저장할 위치를 지정하는 코드가 필요합니다.
    driver.command_executor._commands["send_command"] = (
        "POST",
        '/session/$sessionId/chromium/send_command'
    )
    params = {
        'cmd': 'Page.setDownloadBehavior',
        'params': {
            'behavior': 'allow',
            'downloadPath': download_dir
        }
    }
    driver.execute("send_command", params=params)
    

    이것으로 다운로드가 완료됩니다! 간단.

    요약



    복잡한 일을 하면 코드가 늘어날 것 같습니다만, Selenium을 사용한 적이 있는 사람이라면 Web스크래핑에 Selenium을 선택하는 일도 있을 것 같습니다.
    단점으로는 브라우저 드라이버와 설치하는 것이 늘어날 정도입니까.
    브라우저상에서, 작성한 Selenium 스크립트가 움직이면 편리할 것 같습니다만, 아직 불완전한 것 같습니다.

    복잡한 일을하는 데 도움이 될 것 같은 사이트


  • htps //w w. 세니에 mq레 f. 코m/
  • 좋은 웹페이지 즐겨찾기