욱이의 냉철한 공부

[데이터 크롤링] requests, BeautifulSoup 본문

데이터분석/Python : Crawling

[데이터 크롤링] requests, BeautifulSoup

냉철한 욱 2020. 4. 20. 19:34

* 목차

1. request

2. request : get 방식

3. request : post 방식

4. header값을 수정하는 방법. 

5. Session

6. BeautifulSoup


* http의 응답 상태코드

=> 서버에서 처리결과를 응답메시지의 상태코드를 통해 확인 가능

=> 상태코드의 종류

상태코드

의미

200 - OK

서버가 요청을 성공적으로 처리

301 - Moved Permanenlty

요청한 리소스가 새로운 URI로 이동

400 - Bad Request

클라이언트의 요청이 잘못 되었음

401 - Unauthorized

인증되지 않아 지정한 리소스에 대한 권한 없음

403 - Forbidden

요청에 대한 허가가 금지되었음

404 - Not Found

지정한 리소스가 존재하지 않음

500 - Internal Server Error

서버 내부 문제 발생


 

1. request

- requests 개요

1) urlib 패키지

파이썬의 표준 라이브러리에는 웹 클라이언트를 작성하는데 사용되는 urlib 패키지 있음

이를 사용해서 웹 데이터를 수집 가능

 

2) requests 패키지

1. 'HTTP for Humans'라는 표어를 사용, 매우 직관적

2. requests 패키지는 자바스크립트로 둘러쌓인 데이터는 가져올 수 없음

     하지만 그렇지 않은 경우에는 빠른 속도로 데이터를 가져올 수 있음.

3. requests 패키지는 Thrid Party Library이라 표준 패키지가 아님. 그렇기 때문에 추가로 설치 필요

4. GET 방식과 POST 방식에 대응하는 2가지 방법이 있음.

 

- requests 메소드

1) 메소드 설명

requests의 GET 메소드를 사용해서 전달 받은 객체는 Response 객체

이 객체의 메소드를 사용해서 해당 페이지의 텍스트를 가져올 수도 있다.

또한 상태 코드값을 출력하고, 본문을 JSON 포맷으로 해석하고 변환하여 반환도 가능.

 

2) 메소드 종류

속성

종류

Response.request

요청 정보를 가지고 있는 객체

Response.url

요청한 URL 문자열

Response.cookie

응답에 포함되어 있는 cookie 정보를 가지고 있는 객체

Response.headers

dict 형식의 응답 헤더

Response.status_code

응답의 http 상태 코드

Response.ok

상태 코드가 정상이면 True, 아니면 False

Response.text

응답 본문의 값을 문자열로 출력

Response.json()

응답 분몬을 JSON 방식으로 출력하여 dict 형식으로 반환

 

 

 

 

 

2. requests : GET 방식

- requests : GET 방식

GET 방식은 URL의 정보를 가져오는 방법으로 가장 많이 사용.

웹 브라우저를 사용하여 서버에서 데이터(웹 페이지, 이미지, 동영상 등)를 가져올 때 GET 방식의 많은 요청을 하는 것을 네트워크 탭에서 확인 할 수 있음.

 

예시)

=> 'https://httpbin.org/get?key1=value1&key2=value2' URL로 접근하는 것과 동일

 

- requests : GET 예시

1) 기존 URL 방식

네이버에 퀀트라는 단어를 검색했을 때 URL 주소

=> 쿼리스트링에 있는 값들은 파라미터 값

 

2) requests 패키지를 이용한 URL 방식

 

 

 

 

 

3. requests : post 방식

- requests : post 방식

웹 서버로 데이터를 전송할 때 요청하는 메시지를 get방식처럼 URL에 담아서 전송하는 것이 아니라

BODY에 데이터를 key-value 형식으로 넣어서 전송.

그래서 get 방식처럼 주소창만 보고 전송하는 데이터를 추측할 수 없음.

그리하여 웹 페이지의 입력 폼이나 로그인 정보(중요한 보안이 필요한 정보)들은 post 방식으로 전달.

 

예시)

=> data 인수에 dict 형식의 데이터를 전달하면 application/x-www-form-urlencoded 형식의 인수로 변환

 

 

 

 

 

4. header 값을 수정하는 방법

(목표 : python으로 접근 불가능하게 보안설정되어 있는 부분도 접근 가능하게 만들자)

 

- 문제 상황

클라이언트(지금 사용중인 컴퓨터)에서 서버에 접속할 때, 요청 헤더라는 정보도 같이 전송

웹브라우저로 접속하여 네트워크 탭을 확인하면 User-Agent 부분에서 Firefox로 접속한 사실 알 수 있음.

하지만 우리는 python으로 접속하면, python-requests/2.21.0으로 표시

그렇기 때문에 특정 사이트에선 python으로 접속을 하면 제대로 된 정보를 제공하지 않음.

 

- 문제 상황 해결

requests의 get 메소드에는 headers 매개변수가 존재

이 값은 필수 값은 아니며, 만약 변경을 하고 싶다면 아래 예제처럼 변경할 수 있음.

=> http://www.useragentstring.com에서 지금 접속하는 브라우저의 header정보를 복사하여 python으로 가져옴

header 매게변수에 복사한 정보를 붙여놓음

 

 

 

 

5. Session

- Session 개요

Session이란 쉽게 이야기하면 웹 브라우저안에서 일정 시간동안에 서버가 해당 사용자를 식별하고 그에 따라 상태를 일정하게 유지시켜주는데 이 때 서버-클라이언트 간의 정보 교환이 일어나고, 이 정보를 세션이라고 함.

requests 에서는 Session 객체를 사용하면 서버-클라이언트의 연결을 유지 가능.

s = requests.Session()

 

예시)

즉 쉽게 말하면, 로그인을 하고 다른 메뉴를 클릭하면 로그아웃되고 다시 로그인을 해야되는가? 아니다.

세션이 있기 때문에 로그인 된 상태를 유지시켜주는 것이다.

 

- Session 목적

여러 페이지를 연속으로 크롤링할 때 효과적

Session 객체를 사용하면 http 헤더 또는 인증 등의 설정을 한 번만 수행하고 그 상태 값 그대로 여러번 사용 가능.

서버하고 나하고 계속 연결되어 있기 때문에 한 번 헤더가 변경한 것 계속 유지 가능하다.

(매번 같은 코드에서 헤더를 업데이트 하는 것 귀찮다.)

 

- Session 예시

=> Session 객체의 header의 값을 한 번 변경하면 계속 사용 가능.

     추 후 변경할 필요 없음.

 

- Session() 메소드 with과 함께 사용

with 구문을 사용하면 context manager를 사용하여 효과적 처리 가능.

 

 

 

 

 

 

6. BeautifulSoup

- BeautifulSoup 개요

html 파일을 쉽게 파싱 가능

BeautifulSoup는 웹 크롤러에서 가장 중요한 요소 중 하나인 라이브러리.

번거로운 작업들을 아주 간단하게 해결

BeautifulSoup는 표준 라이브러리가 아니기 때문에 따로 설치 필요 -) pip install bs4

사실 BeautifulSoup라는 패키지는 2012년에 개발이 종료, 현재 명칭은 BeautifulSoup4.

 

- BeautifulSoup 파서 종류

BeautifulSoup(html_doc, "html.parser")는

html_doc 웹 문서를 html.parser 파서를 사용하여 파싱하겠다는 의미

파서

지정 매개변수

설명

표준 라이브러리의 html.parser

html.parser

기본 설치되어 있는 파서

lxml의 html 파서

lxml

빠른 처리 가능

html5lib

html5lib

html5 문서에 맞게 파싱

 

- BeautifulSoup 클래스

형식

self, markup='', features=None, builder=None, parse_only=None, from_encoding=None, exclude_encodings=None, **kwargs

설명

html을 해석한다

인수

markup : 해석 대상 html

features : parser 를 지정한다

반환값

BeautifulSoup 객체

=> BeautifulSoup 객체는 태그 정보를 바탕으로 정보를 탐색 가능

 

- BeautifulSoup 메소드 사용 예시

 

- BeautifulSoup.find() 메소드

id 속성값으로 요소를 찾는 경우 find(id='ID이름')과 같이 지정

class 속성은 find(class_='class 이름')과 같이 하면 해당 클래스 탐색

(class_에서 _는 Python 예약어의 class와 충돌을 피하기 위해서 붙음)

find('요소이름', attr={'속성이름':'값'}과 같이 지정하면 조건을 세밀히 설정 가능

형식

name=None, attrs={}, recursive=True, text=None, **kwargs

설명

요소를 탐색하여 맨 처음 발견된 하나를 얻음.

인수

name : 요소 이름을 검색 조건으로 한다 .

attrs : 요소의 속성 이름과 값을 검색 조건으로 한다 . 사전형으로 작성한다

recursive : False 를 지정하면 바로 아래 자식 요소만 대상이 된다 .

text : 요소의 내용 시작 태그와 종료 태그 사이의 텍스트 를 검색 조건으로 한다 .

반환값

Tag 객체

 

- BeautifulSoup.find_all() 메소드

조건에 일치하는 Tag 객체의 리스트를 반환

형식

name=None, attrs={}, recursive=True, text=None, **kwargs

설명

요소를 탐색하여 조건에 일치하는 모두를 구한다 .

인수

name : 요소 이름을 검색 조건으로 한다 .

attrs : 요소의 속성 이름과 값을 검색 조건으로 한다 . 사전형으로 작성한다

recursive : False 를 지정하면 바로 아래 자식 요소만 대상이 된다 .

text : 요소의 내용 시작 태그와 종료 태그 사이의 텍스트를 검색 조건으로 한다

limit : 지정한 수만큼 요소가 발견되면 검색을 종료한다 .

반환값

Tag 객체의 리스트