파이썬으로 웹 스크래핑 하기 (Beautiful Soup)

파이썬으로 웹 스크래핑 하기 (Beautiful Soup)

웹의 구성요소 3가지

1. HTML :

웹페이지를 만들기 위한 언어로 웹브라우저 위에서 동작하는 언어다.(뼈대)

- 태그(Tag) : 정보를 정의하는 형식을 말한다.

기본 형식 : <태그명 속성명="속성값">컨첸츠

예시 : 티스토리

2. CSS : 웹을 예쁘게 꾸며주며 웹스크래핑에선 중요하진 않다.

3. JAVA : 웹을 살아있게, 동작하게 해주며 웹스크래핑에선 중요하진 않다.

XPath :

Xpath란 ? (XML Path Language)

XPath는 XML 문서의 특정 요소나 속성에 접근하기 위한 경로를 지정하는 언어이다.

예시) //*[@id="search_btn"]

Xpath 노드의 형식 :

1. 루트 노드

2. 요소 노드

3. 텍스트 노드

4. 속성 노드

5. 주석 노드

6. 네임스페이스(namespace) 노드

7. 처리 명령(processing instruction) 노드

Element간의 관계 (자식들은 서로 형제관계이다.)

<부모>

<자식/>

<자식/>

<자식/>

Chrome :

크롬은 개발자모드가 있어 사용하게 유용하며 웹스크래핑에서 사용하기 좋다. Xpath 등을 쉽게 가져올 수 있는 장점이 있다.

정규식 :

규칙을 가진 문자열을 표현하는 식이며 자세한 공부는

https://wikidocs.net/4308

점프 투 파이썬을 보고 하면된다.

웹스크래핑에서는 자주 사용되는 정규식이 있다.

. (ca.e) : 하나의 문자

^(^de) : 문자열의 시작

$(se$) : 문자열의 끝

match( ) : 처음부터 일치하는지

search( ) : 일치하는 게 있는지

findall( ) : 일치하는 것 모두 리스트로

User-Agent :

내가 접속하려는 서버는 접속자에게 어떤 페이지를 보여줄지 결정을 하는데, 이 때 사람이 맞는지를 판별에 사용

Requests : 웹페이지(HTML)을 읽어오는 기능, 빠르다, 동적 웹페이지에서 사용 불가능

주어진 url을 통해 받아온 HTML에 원하는 정보가 있을 때 사용하면 좋음

res.raise_for_status( )를 통해 문제 있는지 확인

Selenium : 웹페이지 자동화 ,느리다, 동적 웹페이지 사용가능

로그인, 어떤 결과에 대한 필터링 등 어떤 동작을 해야하는 경우 사용하기 좋다.

크롬 버젼에 맞는 chromedriver.exe가 반드시 필요

※ element 뒤에 s를 넣으면 여러 요소에서 찾기가능

find_element(s)_by_id : id로 찾기

find_element(s)_by_class_name : class name으로 찾기

find_element(s)_by_link_text : 링크 text로 찾기

find_element(s)_by_xpath : xpath로 찾기

click( ) : 클릭

send_keys( ) clear( ) : 글자입력

selenium 사용 시 로딩을 기다려야 하는경우 WebDriverWait( ).until을 사용한다.

elem = WebDriverWait ( browser , 30 )

. until ( EC . presence_of_element_located (( By . XPATH , '//*[@id="__next"]/div/div[1]/div[5]/div/div[2]/div[2]' )))

스크롤 내리기

import time

interval = 1 # 1초에 한번씩 스크롤 내림

# 현재 문서 높이를 가져와서 저장.

prev_height = browser . execute_script ( "return document.body.scrollHeight" )

# 스크롤이 더이상 안내려갈 때 까지 반복수행

while True :

# 스크롤을 가장 아래로 내림

browser . execute_script ( "window.scrollTo(0,document.body.scrollHeight)" )

# 로딩대기

time . sleep ( interval )

# 현재 높이 문서 높이 저장

curr_height = browser . execute_script ( "return document.body.scrollHeight" )

if curr_height == prev_height :

break

prev_height = curr_height

print ( "스크롤 완료" )

-> 결국 둘의 사용은 Beautiful Soup의 사용을 위한 것(HTML문서를 가져오는 방법의 차이)

Beautiful Soup을 사용해 위에서 가져온 HTML문서의 데이터를 추출한다.

Beautiful Soup :

find : 조건에 맞는 첫번째 element

find_all : 조건에 맞는 모든 element를 리스트로 반환

find_next_sibling(s) : 다음 형제 찾기

find_previous_sibling(s) : 이전 형제 찾기

soup["href"] : 대괄호에 넣은 속성 값 가져오기

soup.get_text( ) : 텍스트 가져오기

이미지 다운로드

with open ( "파일명" , "wb" ) as f :

f . write (res.content)

CSV

: 테이블 형태의 데이터를 웹에서 가져와서 CSV, 엑셀로 볼 수있음

# utf-8-sig를 사용해야 한글로보인다.

# newline="" 을 해주어야 쓸모없는 줄이 안보인다.

f = open (filename, "w" , encoding = "utf-8-sig" , newline = "" )

더 좋은 풀이방법이 있거나 틀린 문제풀이인경우 혹은 질문있으시면 댓글달아주시면 감사하겠습니다.

Headless Chrome :

브라우저를 띄우지않고 동작, 때로는 User-Agent를 정의 해줘야함, 크롬 59버젼부터 가능(대부분 가능)

※웹 스크래핑 주의사항

- 무분별하게 웹 크롤링/스크래핑하여 대상 서버에 부하를 주면 계정/IP 차단 당할수 있다.

- 저작권이 있는 데이터를 무단 활용시 법적 제재를 당할 수 있다.

- 페이지 마다 제공되는 robot.txt(법적효력 X,회사의 권고사항)는 가급적 따라주자

from http://20210916start.tistory.com/98 by ccl(A) rewrite - 2021-10-14 13:26:46