파이썬 웹 크롤링(기본 편) 1 - requests
크롤러를 만들기에 앞서 필요한 HTTP 통신을 위한 라이브러리인 requests 라이브러리를 설치하여야 한다. 아래의 명령어를 터미널에 입력하여 라이브러리를 설치하자.
pip install requests
requests 라이브러 설치가 완료되었다면 간단하게 requests 라이브러리의 사용법을 한 번 살펴보자.
import requests
response = requests.get("https://www.naver.com")
html = response.text
print(html)
설치한 requests 라이브러리를 소스 파일로 가져오기 위해 import requests를 해준다. 그 후, requests 라이브러리의 get 함수를 사용하여 "네이버의 서버로 get 요청을 보내라"라는 동작을 수행한다.
그럼 response 변수에 요청에 대한 결과 값이 반영이 되는데 이를 html 변수에 text로 변환하여 저장한다. 아래에서 실행 결과를 확인해 보도록 하자.
l,"materials":null,"excludeInPaging":false,"positionForPaging":0,"realtime":false,"pid":"047","name":"오마이뉴스","logoLight":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/light/0604/047.png"},"logoDark":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/dark/0604/047.png"},"showThumbnailView":true,"showListView":true,"regDate":"20231119 15:48:48","_id":null,"@type":"PC-NEWSSTAND-PRESS-BLOCK","@code":null,"@template":"NONE","@flowId":null,"@flowExecutionId":null,"@provider":null,"@lastModifiedAt":null},{"@type":"PC-NEWSSTAND-PRESS-BLOCK","blocks":null,"materials":null,"excludeInPaging":false,"positionForPaging":0,"realtime":false,"pid":"960","name":"대한경제","logoLight":{"url":"https://s.pstatic.net/static/newsstand/up/2022/1115/nsd153942530.png"},"logoDark":{"url":"https://s.pstatic.net/static/newsstand/up/2022/1115/nsd153934427.png"},"showThumbnailView":true,"showListView":true,"regDate":"20231119 16:30:21","_id":null,"@type":"PC-NEWSSTAND-PRESS-BLOCK","@code":null,"@template":"NONE","@flowId":null,"@flowExecutionId":null,"@provider":null,"@lastModifiedAt":null},{"@type":"PC-NEWSSTAND-PRESS-BLOCK","blocks":null,"materials":null,"excludeInPaging":false,"positionForPaging":0,"realtime":false,"pid":"961","name":"메트로신문","logoLight":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/light/0604/961.png"},"logoDark":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/dark/0604/961.png"},"showThumbnailView":true,"showListView":true,"regDate":"20231119 16:33:45","_id":null,"@type":"PC-NEWSSTAND-PRESS-BLOCK","@code":null,"@template":"NONE","@flowId":null,"@flowExecutionId":null,"@provider":null,"@lastModifiedAt":null},{"@type":"PC-NEWSSTAND-PRESS-BLOCK","blocks":null,"materials":null,"excludeInPaging":false,"positionForPaging":0,"realtime":false,"pid":"962","name":"스
포츠한국","logoLight":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/light/0604/962.png"},"logoDark":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/dark/0604/962.png"},"showThumbnailView":true,"showListView":true,"regDate":"20231119 16:30:25","_id":null,"@type":"PC-NEWSSTAND-PRESS-BLOCK","@code":null,"@template":"NONE","@flowId":null,"@flowExecutionId":null,"@provider":null,"@lastModifiedAt":null},{"@type":"PC-NEWSSTAND-PRESS-BLOCK","blocks":null,"materials":null,"excludeInPaging":false,"positionForPaging":0,"realtime":false,"pid":"963","name":"에너
지경제","logoLight":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/light/0604/963.png"},"logoDark":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/dark/0604/963.png"},"showThumbnailView":true,"showListView":true,"regDate":"20231119 16:30:01","_id":null,"@type":"PC-NEWSSTAND-PRESS-BLOCK","@code":null,"@template":"NONE","@flowId":null,"@flowExecutionId":null,"@provider":null,"@lastModifiedAt":null},{"@type":"PC-NEWSSTAND-PRESS-BLOCK","blocks":null,"materials":null,"excludeInPaging":false,"positionForPaging":0,"realtime":false,"pid":"964","name":"이뉴스
투데이","logoLight":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/light/0604/964.png"},"logoDark":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/dark/0604/964.png"},"showThumbnailView":true,"showListView":true,"regDate":"20231119 15:41:31","_id":null,"@type":"PC-NEWSSTAND-PRESS-BLOCK","@code":null,"@template":"NONE","@flowId":null,"@flowExecutionId":null,"@provider":null,"@lastModifiedAt":null},{"@type":"PC-NEWSSTAND-PRESS-BLOCK","blocks":null,"materials":null,"excludeInPaging":false,"positionForPaging":0,"realtime":false,"pid":"965","name":"전기신
문","logoLight":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/light/0604/965.png"},"logoDark":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/dark/0604/965.png"},"showThumbnailView":true,"showListView":true,"regDate":"20231119 16:30:22","_id":null,"@type":"PC-NEWSSTAND-PRESS-BLOCK","@code":null,"@template":"NONE","@flowId":null,"@flowExecutionId":null,"@provider":null,"@lastModifiedAt":null},{"@type":"PC-NEWSSTAND-PRESS-BLOCK","blocks":null,"materials":null,"excludeInPaging":false,"positionForPaging":0,"realtime":false,"pid":"966","name":"정신의학신
문","logoLight":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/light/0604/966.png"},"logoDark":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/dark/0604/966.png"},"showThumbnailView":true,"showListView":true,"regDate":"20231119 16:30:19","_id":null,"@type":"PC-NEWSSTAND-PRESS-BLOCK","@code":null,"@template":"NONE","@flowId":null,"@flowExecutionId":null,"@provider":null,"@lastModifiedAt":null},{"@type":"PC-NEWSSTAND-PRESS-BLOCK","blocks":null,"materials":null,"excludeInPaging":false,"positionForPaging":0,"realtime":false,"pid":"967","name":"코리아쉬핑
가제트","logoLight":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/light/0604/967.png"},"logoDark":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/dark/0604/967.png"},"showThumbnailView":true,"showListView":true,"regDate":"20231119 16:30:01","_id":null,"@type":"PC-NEWSSTAND-PRESS-BLOCK","@code":null,"@template":"NONE","@flowId":null,"@flowExecutionId":null,"@provider":null,"@lastModifiedAt":null},{"@type":"PC-NEWSSTAND-PRESS-BLOCK","blocks":null,"materials":null,"excludeInPaging":false,"positionForPaging":0,"realtime":false,"pid":"968","name":"한국금
융신문","logoLight":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/light/0604/968.png"},"logoDark":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/dark/0604/968.png"},"showThumbnailView":true,"showListView":true,"regDate":"20231119 15:00:07","_id":null,"@type":"PC-NEWSSTAND-PRESS-BLOCK","@code":null,"@template":"NONE","@flowId":null,"@flowExecutionId":null,"@provider":null,"@lastModifiedAt":null},{"@type":"PC-NEWSSTAND-PRESS-BLOCK","blocks":null,"materials":null,"excludeInPaging":false,"positionForPaging":0,"realtime":false,"pid":"969","name":"매일노
동뉴스","logoLight":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/light/0604/969.png"},"logoDark":{"url":"https://s.pstatic.net/static/newsstand/2020/logo/dark/0604/969.png"},"showThumbnailView":true,"showListView":true,"regDate":"20231119 07:40:02","_id":null,"@type":"PC-NEWSSTAND-PRESS-BLOCK","@code":null,"@template":"NONE","@flowId":null,"@flowExecutionId":null,"@provider":null,"@lastModifiedAt":null},{"@type":"PC-NEWSSTAND-PRESS-BLOCK","blocks":null,"materials":null,"excludeInPaging":false,"positionForPaging":0,"realtime":false,"pid":"050","name":"한경비
즈니스","logoLight":{"url":"https://s.pstatic.net/static/newsstand/up/2020/0928/nsd125033437.png"},"logoDark":{"url":"https://s.pstatic.net/static/newsstand/up/2020/0928/nsd125026855.png"},"showThumbnailView":true,"showListView":true,"regDate":"20231117 14:32:51","_id":null,"@type":"PC-NEWSSTAND-PRESS-BLOCK","@code":null,"@template":"NONE","@flowId":null,"@flowExecutionId":null,"@provider":null,"@lastModifiedAt":null},{"@type":"PC-NEWSSTAND-PRESS-BLOCK","blocks":null,"materials":null,"excludeInPaging":false,"positionForPaging":0,"realtime":false,"pid":"293","name":"블로
...(이하 생략)
html 코드를 그대로 text로 가져와서 결과 값이 엄청 많아 대부분은 위에서 생략하였다. 지금은 text로만 가져왔지만 데이터를 가져와 전처리 과정을 거치면 유용한 데이터로 사용할 수 있다.
간단하게 requests 라이브러리 사용법을 알아보았는데 이제는 requests 라이브러리의 주요 함수들에 대해 한 번 살펴보자.
requests.get(url, params = None, args)
- GET 요청을 보낸다.
- url - 요청을 보낼 URL
- params - 쿼리 문자열 매개변수로 전달할 데이터(딕셔너리 형태)
- args - 다양한 매개변수를 설정할 수 있다.
import requests
response = requests.get('https://example.com', params={'key1': 'value1', 'key2': 'value2'})
requests.post(url, data = None, json = None, args)
- POST 요청을 보낸다.
- url - 요청을 보낼 URL
- data - POST 요청 데이터(딕셔너리 형태)
- json - JSON 형태의 데이터를 POST 요청으로 전송할 때 사용한다.
- args - 다양한 매개변수를 설정할 수 있다.
import requests
response = requests.post('https://example.com', data={'key1': 'value1', 'key2': 'value2'})
requests.put(url, data = None, agrs)
- PUT 요청을 보낸다.
- url - 요청을 보낼 URL
- data - PUT 요청 데이터(딕셔너리 형태)
- args - 다양한 매개변수를 설정할 수 있다.
import requests
response = requests.put('https://example.com', data={'key1': 'value1', 'key2': 'value2'})
requests.delete(url, args)
- DELETE 요청을 보낸다.
- url - 요청을 보낼 URL
- args - 다양한 매개변수를 설정할 수 있다.
import requests
response = requests.delete('https://example.com')
requests.requests(method, url, args)
- 다양한 HTTP 메서드로 요청을 보낼 수 있는 범용 함수
- method - HTTP 메서드(GET, POST, PUT, DELETE 등)
- url - 요청을 보낼 URL
- args - 다양한 매개변수를 설정할 수 있다.
import requests
response = requests.request('GET', 'https://example.com')
다음은 requests 라이브러리의 주요 속성에 대해 한 번 살펴보자.
text
- 서버 응답의 텍스트 내용을 가져온다.
- 예를 들어, response = requests.get('https://example.com')로 요청을 보냈다면, response.text는 서버 응답의 본문을 포함한다.
import requests
response = requests.get('https://example.com')
print(response.text)
status_code
- 서버 응답의 상태 코드를 가져온다. HTTP 상태 코드를 나타낸다.
- 예를 들어, 200은 성공, 404는 찾을 수 없음, 500은 서버 오류를 나타낸다.
import requests
response = requests.get('https://example.com')
print(response.status_code)
headers
- 서버 응답의 헤더를 가져온다. 딕셔너리 형태로 헤더 정보를 제공한다.
import requests
response = requests.get('https://example.com')
print(response.headers)
json
- JSON 형태의 응답을 디코딩한 객체를 반환한다.
- 만약 서버가 JSON 형태의 응답을 보내면, response.json()을 사용하여 파이썬 객체로 디코딩할 수 있다.
import requests
response = requests.get('https://jsonplaceholder.typicode.com/todos/1')
data = response.json()
print(data)
url
import requests
response = requests.get('https://example.com')
print(response.url)
raise_for_status()
- 서버 응답이 에러 코드를 포함하면 예외를 발생시킨다. 이를 사용하여 요청이 성공적으로 이루어졌는지 확인할 수 있다.
import requests
response = requests.get('https://example.com')
response.raise_for_status() # 에러가 발생하면 예외가 발생