웹 캡처를 위한 Selenium 및 Python 소개

네트워크 캡처는 신속하고 경제적이며 신뢰할 수 있는 방식으로 필요할 때 데이터를 얻을 수 있다.더 좋은 것은 데이터가 통상적으로 최신이라는 것이다.이제 사이트를 삭제할 때 사용 정책을 위반할 수도 있고 사이트에서 쫓겨날 수도 있다는 것을 기억하세요.비록 긁는 것은 어느 정도 합법적이지만, 당신이 데이터를 사용하는 방식에 따라 약간의 예외가 있을 수 있습니다.그러니까 시작하기 전에 꼭 연구해야 돼.그러나 간단한 개인이나 개원 프로젝트에 대해서는 할 수 있을 것입니다.
데이터를 긁어내는 방법은 많지만 내가 가장 좋아하는 방법은 사용하는 것이다Selenium.브라우저 자동화에 사용되기 때문에 테스트에 주로 사용됩니다.간단한 언어로 로봇 브라우저를 만들었습니다. HTML 데이터를 얻고, 스크롤하고, 단추를 누르는 등입니다. 가장 큰 장점은 우리가 그것을 적절하게 조직하고 저장할 수 있도록 어떤 HTML 데이터가 필요한지 명확하게 알려줄 수 있다는 것입니다.
Selenium은 많은 프로그래밍 언어와 호환되지만, 이 강좌는 Python을 중점적으로 소개할 것입니다.확인this link을 통해 Selenium(Python 사용) 문서를 읽습니다.

첫걸음


Selenium을 다운로드하려면 명령줄에서 다음 간단한 명령을 사용합니다.pip install selenium만약 당신이 Jupyter 노트북에서 일한다면, 명령줄이 아니라 그곳에서 완성할 수 있습니다.처음에 느낌표를 하나만 추가하면 됩니다.!pip install selenium필요한 모듈만 가져오면 됩니다.from selenium.webdriver import Chrome, Firefox다른 브라우저도 지원하지만 이 두 브라우저가 가장 자주 사용됩니다.
시작 시 두 가지 간단한 명령이 필요합니다.browser = Firefox()(또는 browser = Chrome(), 선호도에 따라 다름)
이것은 Firefox WebDriver 실례를 만들어서 우리가 모든 유용한 방법과 속성에 접근할 수 있도록 합니다.우리는 변수 browser 에 분배하지만, 당신은 자신의 이름을 자유롭게 선택할 수 있습니다.Firefox 브라우저에서 새 빈 창이 자동으로 열립니다.
다음으로 스크랩할 URL을 가져옵니다.browser.get('https://en.wikipedia.org/wiki/Main_Page') get() 메서드는 브라우저에서 URL을 열고 완전히 로드될 때까지 기다립니다.
이제 이 URL에서 원하는 모든 HTML 정보를 얻을 수 있습니다.

요소 위치 지정


셀렌으로 원소를 포지셔닝하는 데는 서로 다른 방법이 있다.가장 좋은 것은 캡처 중인 페이지의 HTML 구조에 달려 있습니다.액세스에 필요한 요소를 찾는 가장 효과적인 방법은 어려울 수 있습니다.그러니까 천천히 HTML 체크해.
선택한 검색 매개 변수를 사용하여 단일 요소(검색 매개 변수에 해당하는 첫 번째 요소를 얻을 것)에 액세스하거나 검색 매개 변수와 일치하는 모든 요소에 액세스할 수 있습니다.단일한 것을 얻으려면 다음과 같은 방법을 사용하십시오.find_element_by_id() find_element_by_name() find_element_by_xpath() find_element_by_link_text() find_element_by_partial_link_text() find_element_by_tag_name() find_element_by_class_name() find_element_by_css_selector()여러 요소를 배치하려면 위의 방법에서 elementelements 로 교체하십시오.이 방법으로 지정된 WebDriver 객체의 목록이 표시됩니다.

위키백과를 잡다


앞에서 언급한 위키백과 페이지https://en.wikipedia.org/wiki/Main_Page와 어떻게 협동하여 작업하는지 봅시다
WebDriver의 실례를 포함하는 변수 browser 를 만들었고 Wikipedia 홈페이지를 불러왔습니다.
이 페이지에서 번역할 수 있는 언어 목록에 접근하고 이 언어를 가리키는 모든 링크를 저장하고 싶다고 가정하십시오.

몇 가지 검사를 통해 우리는 모든 요소가 유사한 구조를 가지고 있음을 알 수 있다. 클래스 <li>'interlanguage-link' 요소, 포함 <a> 과 URL 및 텍스트:
<li class="interlanguage-link interwiki-bg">

   <a href="https://bg.wikipedia.org/wiki/" title="Bulgarian"
   lang="bg" hreflang="bg" class="interlanguage-link-target">

       Български

   </a>

</li>
따라서 우선 모든 요소<li>를 방문합시다.우리는 클래스 이름을 사용하여 그것들을 격리할 수 있다.languages = browser.find_elements_by_class_name('interlanguage-link') languages는 WebDriver 객체의 목록입니다.첫 번째 요소를 인쇄하는 경우:print(languages[0])다음과 같이 인쇄됩니다.<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="73e70f48-851a-764d-8533-66f738d2bcf6", element="2a579b98-1a03-b04f-afe3-5d3da8aa9ec1")>따라서 그 내용을 진정으로 이해하기 위해서는 목록의 모든 요소에 접근하고 <a> 하위 요소에 접근하여 <a> 텍스트와 'href' 속성을 얻기 위한 for 순환을 작성해야 합니다.
텍스트를 얻기 위해 text 속성을 사용할 수 있습니다.'href'를 얻으려면 get_attribute('attribute_name') 방법을 사용하십시오.코드는 다음과 같습니다.
language_names = [language.find_element_by_css_selector('a').text 
                 for language in languages]

links = [language.find_element_by_css_selector('a').get_attribute('href') 
        for language in languages]
유효한지 확인하려면 language_nameslinks 를 인쇄할 수 있습니다.

구르다


때때로 처음부터 전체 페이지를 불러오는 것이 아니다.이 경우 브라우저를 아래로 스크롤하여 페이지의 나머지 부분에서 HTML을 가져올 수 있습니다.JavaScript 코드를 매개변수로 사용하는 방법execute_script()은 간단합니다.
scroll_down = "window.scrollTo(0, document.body.scrollHeight);"
browser.execute_script(scroll_down)
scrollTo(x-coord, y-coord)는 지정된 좌표로 스크롤하는 JavaScript 방법입니다.이 예에서 우리는 원소의 높이를 되돌려 주는 document.body.scrollHeight를 사용한다.
이미 짐작한 바와 같이, 브라우저가 각종 스크립트를 실행할 수 있도록 body 방법을 사용할 수 있습니다.따라서 자바스크립트를 사용한 경험이 있다면 실험 공간이 넓다.

클릭


요소를 선택하고 execute_script() 방법을 적용하는 것처럼 간단하게 누르십시오.경우에 따라 액세스할 URL을 알고 있으면 브라우저에서 URL로 페이지를 로드할 수 있습니다.다시 한 번, 무엇이 더 효율적인지 봅시다.click() 방법의 예시를 제시하기 위해 왼쪽 메뉴의 내용 링크를 누르십시오.

이 링크의 HTML은 다음과 같습니다.
<li id="n-contents">
   <a href="/wiki/Portal:Contents" title="Guides to browsing Wikipedia">

        Contents

   </a>
</li>
우리는 우선 유일한 idclick()를 가진 <li> 원소를 찾은 다음에 그 'n-contents' 하위 원소를 방문해야 한다
content_element = browser.find_element_by_id('n-contents') \
                         .find_element_by_css_selector('a')

content_element.click()
이제 브라우저가 디렉터리 페이지를 불러오는 것을 볼 수 있습니다.

이미지 다운로드


지금 만약 우리가 이 페이지에서 그림을 다운로드하기로 결정한다면 어떻게 해야 합니까?이를 위해, 우리는 <a> 라이브러리와 uid 생성기를 사용할 것입니다.우리는 먼저 CSS 선택기urllib를 사용하여 모든 이미지를 포지셔닝한 다음 'img' 속성에 접근한 다음 각 이미지에 유일한 id를 만들고 'src' 방법으로 이미지를 다운로드할 것입니다.이 방법은 이미지의 URL과 이름, 다운로드할 폴더 (해당하는 경우) 등 두 가지 인자가 필요합니다.
from urllib.request import urlretrieve
from uuid import uuid4

# get the main page again
browser.get('https://en.wikipedia.org/wiki/Main_Page')

# locate image elements
images = browser.find_elements_by_css_selector('img')

# access src attribute of the images
src_list = [img.get_attribute('src') for img in images]


for src in src_list:
    # create a unique name for each image by using UUID generator
    uuid = uuid4()

    # retrieve umages using the URLs
    urlretrieve(src, f"wiki_images/{uuid}.jpg")

작업 간 대기 시간 추가


마지막으로 브라우저의 작업 사이에 대기 시간을 도입해야 할 때가 있습니다.예를 들어 많은 페이지를 하나하나 불러올 때.urlretrieve('url', 'folder/name.jpg') 모듈을 사용하여 완료할 수 있습니다.time 목록에서 URL 3개를 로드하고 브라우저에서 3초간 기다린 다음 links 방법으로 각 페이지를 로드합니다.
import time

urls = links[0:3]

for url in urls:
    browser.get(url)
    # stop for 3 seconds before going for the next page
    time.sleep(3)

WebDriver 닫기


마지막으로 우리는 쓸 수 있다time.sleep() browser.close()browser 방법의 실례를 포함하는 변수라는 것을 잊지 마십시오 (본 강좌의 시작 참조).

GitHub의 코드


이 문서의 코드는 GitHub에서 사용할 수 있습니다.
https://github.com/AnnaLara/scraping_with_selenium_basics

좋은 웹페이지 즐겨찾기