웹 스크래핑 bs4

최대환·2022년 8월 12일
0

웹 스크래핑? 웹 크롤링?

웹 스크래핑은 우리가 정한 특정 웹 페이지에서 데이터를 추출하는 것이다.
어떤 사이트에서 특정 주제나 이미지사진, 내용만 가져오는 것 그것들을 스크래핑이라고 한다.
그렇다면 많이 들어본 크롤링은 뭘까?
크롤링은 인터넷을 돌아다니면서 여러 웹 페이지의 데이터를 가져오는 것이다.
이런거는 보통 네이버나 구글과같은 검색엔진들이 데이터를 수집해서 각기 다른 사람들의 취향에 맞는 컨텐츠를 추천해주거나 관련 자료들을 주기위해서 많이 사용한다.
웹 크롤링과 웹 스크래핑은 모두 정보를 추출한다는 공통점이 있다.
그러면 웹 스크래핑이랑 다른게 뭘까?
그건 '타겟 웹 페이지의 유무'와 '중복 제거의 실행여부'이다.
웹 스크래핑을 할때는 목표로 하는 특정 타겟 웹사이트가 있다. 그리고 추출한다. 즉, '선결정 후추출'이다. 그리고 특정 사이트에서 원하는 정보를 가져온만큼 중복된 데이터도 데이터이다.
반면에 웹 크롤링은 특정페이지를 목표로 하지 않고 먼저 탐색을하고 정보를 가져온다. 즉, '선탐색 후추출'이다. 그리고 결정적으로 데이터 중복을 막아야한다. 왜냐면 여러 웹사이트에서 정보를 가져오기 때문에 중복되거나 불필요한 정보가 생기면 이는 분류를 오히려 어렵게 하기 때문이다.

스크래핑 하기전에 알아야할 것

자신이 스크래핑 할 사이트 뒤에 /robots.txt를 입력해보자

User-agent: *
Disallow: /carts
Disallow: /orders
Disallow: /course/*/edit
Disallow: /api
Disallow: /assets
Disallow: /auth
Disallow: /oauth2_email_not_validated
Disallow: /email_validation
Disallow: /signout
Disallow: /hello
Disallow: /password
Disallow: /email
Disallow: /admin
# Sitemap: https://www.inflearn.com/sitemap.xml
Sitemap: https://cdn.inflearn.com/sitemaps/sitemap.xml

User-agent: * 은 모든 사용자를 의미한다.
Disallow 표시가 되어 있는 부부은 스크래핑을 하지 말라는 뜻이다.
내가 알기론 과도하게 스크래핑하게 되면 사이트의 과도한 트래픽을 발생시켜 서비스에 무리가 갈 수 있다.

파이썬의 Beautiful Soup을 사용해서 스크래핑해보자.

크롤링을 하기 위해서는 파이썬과 vs코드만 있으면 된다.
Beautiful Soup는 파이썬에서 크롤링이나 스크래핑할때 사용하는 라이브러리다.
이걸 이용해 원하는 사이트의 정보를 빠르게 긁어서 txt파일 또는 csv로 만들 수 있다.

아래 코드는 손해보험협회 사이트의 과실비율을 알려주는 사이트의 사고상황을 스크래핑해온 코드이다.

import sys
import requests
import time
import urllib3
from bs4 import BeautifulSoup

urllib3.disable_warnings()

data_list = [i for i in range(201,206)] # 201번 부터 205번 페이지까지 설정

for data in data_list:
    print(data)  # 현재 스크래핑 하고 있는 데이터가 몇번인지 알려준다.(확인용)

	# 스크래핑하고자하는 url
    url = f"https://accident.knia.or.kr/myaccident-content?chartNo={data}&chartType=1" 
    result = requests.get(url, verify=False)

    soup = BeautifulSoup(result.content, "html.parser")

    print(soup.select_one("#macont05").text) # 추출하고자하는 내용을 출력한다.
    time.sleep(0.075)  # 누락방지용 시간지연
201
신호기에 의해 교통정리가 이루어지고 있는 교차로에서 서로 다른 도로를 이용하여 녹색 신호에 교차로에 진입하여 직진 중인 A차량과 적색신호에 교차로에 진입하여 직진 중인 B차량이 충돌한 사고이다.
202
신호기에 의해 교통정리가 이루어지고 있는 교차로에서 서로 다른 방향을 이용하여 녹색 또는 황색신호에 교차로에 진입한 후 신호가 바뀔 때까지 아직 교차로를 벗어나지 못한 A차량과 녹색신호에교차로에 진입하여 직진 중인 B차량이 충돌한 사고이다.
203
신호기에 의해 교통정리가 이루어지고 있는 교차로에서 서로 다른 방향을 이용하여 황색신호에 교차로에 진입하여 직진 중인 A차량과 적색신호에 교차로에 진입하여 직진 중인 B차량이 충돌한 사고이다.
204
신호기에 의해 교통정리가 이루어지고 있는 교차로에서 서로 다른 방향을 이용하여 적색 신호에 교차로에 진입하여 직진 중인 A차량과 적색신호에 교차로에 진입하여 직진 중인 B차량이 충돌한 사고이다.
205
신호기에 의해 교통정리가 이루어지고 있지 않는 동일 폭의 교차로에서 오른쪽 도로에서 진입하여 직진하는 A차량과 왼쪽 도로에서 진입하여 직진하는 B차량이 충돌한 사고이다.

이와같이 잘 스크래핑 해온걸 볼 수 있다.

Beautiful Soup 한계

다만 bs4도 한계는 있다.
bs4는 주소를 통한 단발적 접근만 하기 때문에 정적인 컨텐츠만 추출해낼 수 있다. 대신 빠르다.
자바스크립트로 숨겨져 있는 것들을 추출해올 때는 셀레니움을 사용해야한다

참고자료

profile
나의 개발지식 output 공간

0개의 댓글