웹 스크롤링이란?

- 웹페이지의 소스코드를 가져올 수 있는 기능. 소스코드 분석 및 웹페이지를 활용한 자동화를 이용할 시에 유용하다.

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()

위의 코드는 구글에서 아이유를 검색해서 모든 아이유 사진을 다운로드 받을 수 있다.

 

 

+ Recent posts