파이썬으로 크롤링 해보기 part.1

앙이🐯·2021년 9월 26일
0

크롤링

목록 보기
1/3

웹 스크래핑이란?

웹 스크래핑(web scraping)은 웹 페이지에서 우리가 원하는 부분의 데이터를 수집해오는 것으로 크롤링(crawling)이라는 용어로 혼용해서 사용합니다.

1. 파이썬 기초 문법

변수 & 기본 연산
a = 3      # 3을 a에 넣는다
b = a      # a를 b에 넣는다
a = a + 1  # a+1을 다시 a에 넣는다

num1 = a*b # a*b의 값을 num1이라는 변수에 넣는다
num2 = 99 # 99의 값을 num2이라는 변수에 넣는다

# 변수의 이름은 마음대로 지을 수 있음!
# 진짜 "마음대로" 짓는 게 좋을까? var1, var2 이렇게?
자료형
  • 숫자, 문자형
name = 'bob' # 변수에는 문자열이 들어갈 수도 있고,
num = 12 # 숫자가 들어갈 수도 있고,

is_number = True # True 또는 False -> "Boolean"형이 들어갈 수도 있습니다.

#########
# 그리고 List, Dictionary 도 들어갈 수도 있죠. 그게 뭔지는 아래에서!
  • 리스트 형(JavaScript의 배열형과 동일)
a_list = []
a_list.append(1)     # 리스트에 값을 넣는다
a_list.append([2,3]) # 리스트에 [2,3]이라는 리스트를 다시 넣는다

# a_list의 값은? [1,[2,3]]
# a_list[0]의 값은? 1
# a_list[1]의 값은? [2,3]
# a_list[1][0]의 값은? 2
  • Dictionary 형과 List형의 조합
people = [{'name':'bob','age':20},{'name':'carry','age':38}]

# people[0]['name']의 값은? 'bob'
# people[1]['name']의 값은? 'carry'

person = {'name':'john','age':7}
people.append(person)

# people의 값은? [{'name':'bob','age':20},{'name':'carry','age':38},{'name':'john','age':7}]
# people[2]['name']의 값은? 'john'
조건문
  • if/else로 구성
if age > 20:
	print('성인입니다')    # 조건이 참이면 성인입니다를 출력
else:
	print('청소년이에요')  # 조건이 거짓이면 청소년이에요를 출력

is_adult(30)
# 무엇이 출력될까요?
반복문 - 파이썬에서의 반복문은 리스트의 요소들을 하나씩 꺼내 쓰는 형태 -> 무조건 리스트와 함께 쓰임!
  • 리스트 예제
fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']

count = 0
for fruit in fruits:
	if fruit == '사과':
		count += 1

print(count)

# 사과의 갯수를 세어 보여줍니다.
  • 딕셔너리 예제
people = [{'name': 'bob', 'age': 20}, 
         {'name': 'carry', 'age': 38},
         {'name': 'john', 'age': 7},
         {'name': 'smith', 'age': 17},
         {'name': 'ben', 'age': 27}]

# 모든 사람의 이름과 나이를 출력해봅시다.
for person in people:
   print(person['name'], person['age'])


# 이번엔, 반복문과 조건문을 응용해봅시다.
# 20세 보다 많은 사람만 출력하기
for person in people:
   if person['age'] > 20:
       print(person['name'], person['age'])
그 밖의 내장 함수
  • 문자열 자르기
txt = 'sparta@gmail.com'

result = txt.split('@')[1].split('.')[0]

print(result)
  • 문자열 바꾸기
txt = 'sparta@gmail.com'

result = txt.replace('gmail','naver')

print(result)

2. 파이썬 패키지

  • 패키지: Python에서 모듈(일종의 기능들 묶음)을 모아 놓은 단위
  • 라이브러리: 패키지의 묶음
  • 가상환경(virtual environment): 프로젝트별로 패키지들을 담을 공구함

3. dload와 selenium을 이용한 이미지 저장

  • dload 라이브러리: URL로 부터 파일 다운로드를 해주는 패키지
import dload

dload.save("https://spartacodingclub.kr/static/css/images/ogimage.png", 'sparta.png')
  • selenium 패키지: 브라우저 제어 가능하게 해주는 패키지
from selenium import webdriver
driver = webdriver.Chrome('chromedriver')

driver.get("http://www.naver.com")
  • bs4 라이브러리 (BeautifulSoup): HTML 및 XML 파일에서 원하는 데이터를 손쉽게 Parsing 할 수 있는 라이브러리
from bs4 import BeautifulSoup
from selenium import webdriver
import time

driver = webdriver.Chrome('chromedriver') # 웹드라이버 파일의 경로
driver.get("https://search.daum.net/search?w=img&nil_search=btn&DA=NTB&enc=utf8&q=%EC%95%84%EC%9D%B4%EC%9C%A0")
time.sleep(5) # 5초 동안 페이지 로딩 기다리기

req = driver.page_source

soup = BeautifulSoup(req, 'html.parser')

thumbnails = soup.select("#imgList > div > a > img")

for thumbnail in thumbnails:
    src = thumbnail["src"]
    print(src)

driver.quit() # 끝나면 닫아주기
# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')

soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')

# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')
다음에서 연예인 이미지 검색해 저장해보기
import dload
from bs4 import BeautifulSoup
from selenium import webdriver
import time

driver = webdriver.Chrome('chromedriver') # 웹드라이버 파일의 경로
driver.get("https://search.daum.net/search?nil_suggest=btn&w=img&DA=SBC&q=nct+%EC%9E%AC%ED%98%84")
time.sleep(5) # 5초 동안 페이지 로딩 기다리기

req = driver.page_source

soup = BeautifulSoup(req, 'html.parser')

thumbnails = soup.select("#imgList > div > a > img")

i=1
for thumbnail in thumbnails:
   src = thumbnail["src"]
   dload.save(src, f'imgs_homework/{i}.jpg')
   i+=1

driver.quit() # 끝나면 닫아주기
  • 결과

0개의 댓글