웹 스크래핑은 웹페이지에서 원하는 데이터를 추출하는 것을 말한다.
파이썬의 여러 모듈들을 이용해서 웹 스크래핑을 할 수 있다.
웹 스크래핑을 하려면 먼저 웹페이지를 불러와야 한다. 다르게 말하면 웹페이지의 html 코드를 가져오는 것이기도 하다.
그 다음 html에서 특정 데이터를 추출한다.
html 코드를 가져오는 모듈 2가지가 있다.
Requests는 html을 읽어오고 빠르지만 동적인 웹페이지에서 사용하기엔 힘들다.
Selenium은 동적인 페이지에서 유용하다. 클릭, 검색을 하거나 페이지 화면이 바뀌어야 할 때 쓸 수 있다. 다만 느리다.
requests로 구글 홈페이지를 불러와보고, selenium으로 네이버 로그인을 해보자.
import requests
res = requests.get("http://google.com")
res.raise_for_status()
with open("mygoogle.html", "w", encoding="utf8") as f:
f.write(res.text)
import selenium from webdriver
from selenium.webdriver.common import keys
from webdriver_manager.chrome import ChromeDriverManager
browser = webdriver.Chrome(ChromeDriverManager().install())
# 1. 네이버 이동
browser.get("http://naver.com")
# 2. 로그인 버튼 클릭
elem = browser.find_element_by_class_name("link_login")
elem.click()
# 3. id, pw 입력
browser.find_element_by_id("id").send_keys("naver_id")
browser.find_element_by_id("pw").send_keys("password")
# 4. 로그인 버튼 클릭
browser.find_element_by_id("log.login").click()
# 5. id를 새로 입력
browser.find_element_by_id("id").clear()
browser.find_element_by_id("id").send_keys("my_id")
# 6. 브라우저 종료
browser.quit()
selenium을 사용하려면 2가지를 설치해야 한다.
1. selenium 설치 : 파이썬 터미널에서 설치할 수 있다. pip install selenium
2. webdriver 다운로드 : 자신이 주 웹브라우저 버전에 맞는 웹드라이버를 다운로드한다. 저장위치는 같은 경로로 해주면 편하다.
나의 경우 같은 디렉토리 안에 넣었는데도, 'chromedriver' executable needs to be in PATH 에러가 발생하였다. webdriver-manager 라이브러리를 설치하면 자동으로 driver의 경로를 설정해준다.
import requests
import bs4 from BeautifulSoup
url = "https://comic.naver.com/webtoon/weekday.nhn"
res = requests.get(url)
res.raise_for_status()
soup = BeautifulSoup(res.text, "lxml")
#네이버 웹툰 전체목록 가져오기
#class 속성이 title인 모든 a element 를 반환
cartoons = soup.find_all("a", attrs={"class":"title"})
# a element안의 값들을 출력
for cartoon in cartoons:
print(cartoon.get_text())
웹페이지를 가져온 후 BeautifulSoup 모듈을 이용해 그 안에서 원하는 데이터를 추출할 수 있다. 사전에 BeautifulSoup 모듈과 lxml 모듈을 설치해야 한다.
XML(eXtensible Markup Language)은 확장할 수 있는 마크업 언어이며, html은 xml의 일종이다. xml을 해석하는 프로그램을 parser라고 하고 여러 종류가 있다. 파이썬에서 주로 사용하는 xml parser는 lxml이다.
BeautifulSoup을 이용해 네이버 웹툰 페이지의 웹툰 제목들을 추출해보자.