웹 캡처를 위한 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()
여러 요소를 배치하려면 위의 방법에서 element
을 elements
로 교체하십시오.이 방법으로 지정된 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_names
및 links
를 인쇄할 수 있습니다.구르다
때때로 처음부터 전체 페이지를 불러오는 것이 아니다.이 경우 브라우저를 아래로 스크롤하여 페이지의 나머지 부분에서 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
Reference
이 문제에 관하여(웹 캡처를 위한 Selenium 및 Python 소개), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/annalara/introduction-to-web-scraping-with-selenium-and-python-4p7b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)