웹 스크롤링이란?
- 웹페이지의 소스코드를 가져올 수 있는 기능. 소스코드 분석 및 웹페이지를 활용한 자동화를 이용할 시에 유용하다.
Request
- Request는 웹 사이트에 소스코드를 요청하는 라이브러리다.
Mac Terminal
1. pip3 install requests
import requests
res=requests.get("http://google.com")
res.raise_for_status()
print(len(res.text))
print(res.text)
with open("mygoogle.html", "w", encoding="utf-8") as f:
f.write(res.text)
request를 통해서 구글.com을 스크래핑한다.
res.text를 mygoogle.html이라는 파일로 만들고 "w" 쓰기모드로 저장한다.
User-Agent
import requests
url = "http://codingboycc.tistory.com"
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36"}
res = requests.get(url, headers=headers)
res.raise_for_status()
with open("codingboycc.html", "w", encoding="utf8") as f:
f.write(res.text)
티스토리에서는 '우리가 request를 통해서 접속하는 사람이 사람이 아니고 기계일 것이다' 가정하여 정확한 웹스크롤링이 가능하지 않다. 이럴 경우에 이용할 수 있는 것이 User-Agent다.
1. 구글에 what is my user agent를 검색한다.
headers = {} 안에 user agent 값을 입력한다.
이렇게 코드를 실행하고 나면 정확한 웹스크롤링이 가능해진다.
Beautiful Soup
- Beautiful Soup은 웹 페이지의 소스코드를 가져 온 뒤에 특정 소스만을 색인하여 가져올 수 있는 라이브러리이다.
1. pip3 install beautifulsoup4
2. pip3 install lxml
* XML이란 단순한 문자열을 넘어서서, 내부적으로 트리 구조를 가진 파일을 표현하기 위한 마크업 언어이다. html 및 오피스파일도 XML에 속한다. 파이썬에서도 XML parser로서 주로 이용되는 패키지가 lxml이다.
import requests
from bs4 import BeautifulSoup
url = "https://comic.naver.com/webtoon/weekday.nhn"
res = requests.get(url)
res.raise_for_status()
soup = BeautifulSoup(res.text, "lxml")
print(soup.title)
print(soup.title.get_text())
print(soup.a) # soup 객체에서 처음 발견되는 a element 반환
print(soup.a.attrs) a element의 속성 정보를 출력
print(soup.a["href"]) #a element의 href 정보 출력
print(soup.find("a", attrs={"class":"Nbtn_upload"}))
print(soup.find(attrs={"class":"Nbtn_upload"}))
print(soup.find("li", attrs={"class":"rank01"}))
rank1 = soup.find("li", attrs={"class":"rank01"})
print(rank1.a)1
위의 해당 url에 페이지 내에서 원하는 정보를 마음대로 빼올 수 있다. class 값을 설정하여 특정 class 소스만 크롤링한다던가 등등...
정규식
- 예시로 이것은 올바른 주민번호의 형식이야, 이건 올바른 이메일의 형식이야 등, 올바른 정규 표현식에 대해서 알아보자.
Import re를 하는데 re = regular expression(정규 표현식)의 줄임말인 듯 하다.
import re
p = re.compile("ca.e")
def print_match(m):
if m :
print(m.group())
else:
print("매칭되지 않음")
m = p.match("careless")
print_match(m)
위의 함수에 대해서 ca.e를 기준으로 잡아서 careless와 일치하는 지를 판단하는 코드이다.
# . (ca.e) : 하나의 문자를 의미 > cane, cake, cafe(O) | caffe (x)
# ^ (^de) : 문자열의 시작 > deer, delay (O) | blonde (x)
# $ (se$) : 문자열의 끝 > rose, pose (O) | pace (x)
정규식은 더 공부할 것이 많다고 하니 꾸준히 찾아보고 공부할 필요가 있을 것 같다.
5. Selenium
- 셀레니엄은 실제 브라우저를 코드를 통해 조작하는 방식이다. 웹브라우저로 할 수 있는 모든 것을 자동화할 수 있다고 한다. 아래 코드를 통하여 이미지를 자동으로 다운로드 받는 코드를 확인해보자.
1. pip3 install selenium
2. Chrome Driver 다운로드
1) 구글에서 아이유를 검색하여 아이유의 첫 번째 이미지를 다운로드
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import urllib.request
import time
driver = webdriver.Chrome('./chromedriver')
driver.get("https://www.google.co.kr/imghp?hl=ko&ogbl")
elem = driver.find_element_by_name("q")
elem.send_keys("아이유")
elem.send_keys(Keys.RETURN)
images = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
count =1
for image in images :
image.click()
time.sleep(3)
imgUrl = driver.find_element_by_css_selector(".n3VNCb").get_attribute("src")
urllib.request.urlretrieve(imgUrl, "IU" + str(count) + ".jpg")
count = count + 1
위의 코드를 입력하게 되면 구글에서 아이유를 자동으로 입력하여 첫 번째 아이유 사진을 다운로드 받을 수 있다.
2) 구글에서 아이유를 입력하여 구글에 있는 모든 아이유 이미지를 스크롤 다운하고 + 결과 더보기 버튼을 눌러서 다운로드.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import urllib.request
import time
driver = webdriver.Chrome('./chromedriver')
driver.get("https://www.google.co.kr/imghp?hl=ko&ogbl")
elem = driver.find_element_by_name("q")
elem.send_keys("아이유")
elem.send_keys(Keys.RETURN)
SCROLL_PAUSE_TIME = 2
# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# Scroll down to bottom
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Wait to load page
time.sleep(SCROLL_PAUSE_TIME)
# Calculate new scroll height and compare with last scroll height
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
try:
driver.find_element_by_css_selector(".mye4qd").click()
except:
break
last_height = new_height
images = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
count =1
for image in images :
try:
image.click()
time.sleep(3)
imgUrl = driver.find_element_by_css_selector(".n3VNCb").get_attribute("src")
urllib.request.urlretrieve(imgUrl, "IU" + str(count) + ".jpg")
count = count + 1
except:
pass
driver.close()
위의 코드는 구글에서 아이유를 검색해서 모든 아이유 사진을 다운로드 받을 수 있다.
'Tech Blog > Python' 카테고리의 다른 글
파이썬 Tensorflow 데이터 사이언스에 빠져들다!! (0) | 2021.05.11 |
---|---|
데이터 사이언스 Tool, Orange3 소개 (0) | 2021.05.10 |
(셀레니엄)나이키 자동응모 웹 자동화 도전했으나... (0) | 2021.05.10 |
Python Escape Characters, 이스케이프 시퀀스 (0) | 2021.05.04 |
Python venv 가상환경 세팅 (0) | 2021.04.30 |