일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- CNN
- 데이터처리
- NLP
- 빅데이터처리
- 머신러닝
- r
- 딥러닝
- AI
- 데이터
- 하둡
- lstm
- SQL
- 주가예측
- pandas
- word2vec
- Hadoop
- R시각화
- 데이터시각화
- 그래프
- 기계학습
- Deeplearning
- 그래프시각화
- ggplot
- Python
- R프로그래밍
- 빅데이터
- R그래프
- 데이터분석
- 자연어처리
- HIVE
- Today
- Total
욱이의 냉철한 공부
[데이터 크롤링] requests, BeautifulSoup 본문
* 목차
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 객체의 리스트 |
'데이터분석 > Python : Crawling' 카테고리의 다른 글
[데이터 크롤링] 정규표현식 (0) | 2020.04.20 |
---|---|
[데이터 크롤링] 개요 (0) | 2020.04.20 |
[데이터 크롤링] OPEN API 네이버 검색 데이터 크롤링하기_실행하기 (0) | 2020.04.20 |
[데이터 크롤링] OPEN API 네이버 검색 데이터 crawling 하기_이해하기 (0) | 2020.04.20 |