이번 글에서 소개할 모듈은 requests 모듈이다. 간단한 웹 크롤러를 만들기 전에 requests 모듈과 몇가지 함수를 설명할 것이다.

 

1. requests 모듈 설치

다음 명령어를 통해서 requests 모듈을 설치한다.

  • pip install requests

 

2. import requests

모듈을 설치 했으면 아래처럼 import requests 를 추가하게 되면 사용이 가능하다.
dir 함수를 통해 requests 모듈에서 지원하는 함수들의 목록을 볼 수 있다.
많은 함수들이 보이는데, 필자가 많이 쓰는 get, post, status_codes 함수를 소개할 것이다

import requests
print(dir(requests))
# Result
#['ConnectTimeout', 'ConnectionError', 'DependencyWarning', 'FileModeWarning', 'HTTPError', 'NullHandler',
# 'PreparedRequest', 'ReadTimeout', 'Request', 'RequestException', 'Response', 'Session', 'Timeout', 'TooManyRedirects',
# 'URLRequired', '__author__', '__build__', '__builtins__', '__copyright__', '__doc__', '__file__', '__license__', '__name__',
# '__package__', '__path__', '__title__', '__version__', '_internal_utils', 'adapters', 'api', 'auth', 'certs', 'codes',
# 'compat', 'cookies', 'delete', 'exceptions', 'get', 'head', 'hooks', 'logging', 'models', 'options', 'packages', 'patch',
# 'post', 'put', 'pyopenssl', 'request', 'session', 'sessions', 'status_codes', 'structures', 'utils', 'warnings']

 

 

 

2-1. requests.get() – get 방식으로 요청

다음은 get() 함수의 사용법이다.

get()은 웹에서 GET 방식으로 보낼때 사용하는 함수이다.

괄호 안에는 임의의 웹 주소를 넣어, 해당 주소로 GET 방식으로 요청한다.

get(url) 함수로 요청한 결과 값을 변수(req) 로 저장한다.

import requests
 
req = requests.get('https://univ-blog.xyz')

 

 

 

req 변수에는 해당 url로 요청한 결과 값이 들어가 있는 상태이다.

req 변수에 html 코드를 보고 싶다면 req.text 라고 작성하면 html 코드를 볼 수 있다.

import requests
 
req = requests.get('https://univ-blog.xyz')
print(req.text)

 

 

 

req.text 값에 어떠한 문자열이 있는지 확인하는(찾는) 방법은 find() 함수를 사용하는 것이다.

예를들어 req.text 값에는 “hello admin!” 이라는 값이 들어 있다고 가정하고, admin이라는 문자열이 있는지 확인하기 위해서는
req.text.find(‘admin’) 이런식으로 작성한다.

만약 admin이라는 문자열이 있으면 해당 문자열의 위치(index) 값을 리턴한다. “hello admin!” 인 경우 req.text.find(‘admin’) = 6 이라는 값을 리턴한다.
만약 admin이라는 문자열이 없다면 -1 값을 리턴한다.

import requests
 
req = requests.get('https://univ-blog.xyz')
 
if req.text.find('admin') != -1:
	print("admin 이라는 문자열 존재함")
	print(req.text[req.text.find('admin') : ]) # find() 함수를 통해 admin 부터 그 이후의 문자열 출력이 가능하다.
 
else:
	print("admin 찾을 수 없음")

 

 

 

 

마지막으로 웹 요청의 상태 코드(status_codes)를 보는 방법이다.

상태 코드는 간단하게 예를들어, 서버가 정상적으로 사용자에게 웹을 띄어주게 되면 200 이라는 숫자 코드를 보낸다.
200 코드는 쉽게 말해 문제 없이 요청을 주고 받았다고 생각하면된다.

404 코드는 어떤 url 로 요청을 했는데 해당 주소나 페이지가 없다는 것을 알리기 위한 코드이다.
이 외에도 수많은 상태 코드가 있으니 궁금하다면 아래 링크를 통해 보도록 하자.

https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C

 

HTTP 상태 코드 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 아래는 HTTP(하이퍼텍스트 전송 프로토콜) 응답 상태 코드의 목록이다. IANA가 현재 공식 HTTP 상태 코드 레지스트리를 관리하고 있다. 1xx (조건부 응답)[편집] 요청을 받았으며 작업을 계속한다.[1] 이 상태의 상태 코드는 상태-라인과 선택적 헤더(컴퓨터에서 출력될 때 각 페이지 맨 윗부분에 자동으로 붙는 부분)만을 포함하는 임시의 응답을 나타내고 빈 라인에 의해서 종결된다. H

ko.wikipedia.org

아래 코드는 상태코드를 보는 방법을 나타낸 것이다. 보는 방법은 status_codes를 사용하면 된다.

import requests
 
req = requests.get('https://univ-blog.xyz')
 
if req.status_codes == 200:
	print("현재 서버는 문제가 없습니다.")
 
else:
	print("찾고자 하는 서버에 문제가 있거나 url이 잘못되었습니다.")

 

 

 

2-2. requests.get() – header에 cookie 값 포함 후 요청하기

이 방법을 소개하는 이유는 예를들어 네이버 같은 경우, 자신의 네이버 메일에 접근하고 싶으면 로그인 상태가 되어야 한다.

하지만 로그인이 되어있지 않은 상태라면 본인의 네이버 메일에 접근 할 수 없고 ‘로그인 화면’ 으로 이동하게 된다.

 

실제 주소로 예를 들어 실습을 해보겠다.

아래 주소는 wordpress에서 관리자로 로그인 해야만 접근이 가능한 페이지이다.

cookie 값을 header에 포함 시키지 않고 해당 주소로 접근을 하게 되면 어떻게 될까?

import requests
 
req = requests.get('https://univ-blog.xyz/wp-admin')
 
print(req.text)

 

위 코드를 실행 해보면 아래 사진처럼 ‘암호를 분실하셨나요?’ 라는 문구가 보이는 것을 확인할 수 있다.

즉, 로그인이 필요한 페이지에 접근을 하기 위해서는 무언가가 필요하다.

 

따라서 개발자가 로그인을 해야한 상태여야만 하고, 또한 로그인을 했다라는 것을 증명하는 cookie 값이 필요하다.

아래 사진처럼 admin 페이지에 접근하기 전에 로그인을 시도한다.

 

 

크롬 확장프로그램인 EditCookie를 이용해서 로그인후 생기는 cookie 값을 가져온다.
(세션을 확인하는 쿠키가 어느것인지 몰라 아무거나 가져왔음)

 

 

 

위 사진에서 __cfduid 가 cookie 이름이고,  ‘ㅁㅁㅁㅁㅁ’ 가 cookie 값이다. 이것들을 이용해 header에 cookie를 추가하여 요청을 보내겠다.

아래 코드를 보면 header 라는 변수에 cookie 값을 넣고 get() 함수에 headers 에 header 를 추가하는 것을 볼 수 있다.

 

import requests
 
header = {'cookie' : '__cfduid = ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ'}
 
req = requests.get('https://univ-blog.xyz/wp-admin', headers = header)
 
print(req.text)

 

이렇게 하면 로그인 페이지가 뜨지 않고 admin 페이지를 볼 수 있을 것이다.

만약 로그아웃을 한뒤 다시 로그인을 하게 되면 __cfduid 값은 바뀌기 때문에 cookie 값을 다시 수정해야 할 것이다.

 

 

 

2-3. 데이터를 포함하여 get, post 요청하기

get() 함수 사용시 GET 방식으로 data를 보내는 경우가 있다.

이럴경우 아래 코드 처럼 GET 방식으로 해당 주소의 서버에게 data를 보낼 수 있다.

import requests
 
getData = {'params1' : 'data1', 'params2' : 'data2'}
 
req = requests.get('https://univ-blog.xyz', params = getData)

 

 

 

post() 함수 사용지 POST 방식으로 data를 보내게 되는데 아래 코드 처럼 POST 방식으로 data를 보낼 수 있다.

import requests
 
postData = {'params1' : 'data1', 'params2' : 'data2'}
 
req = requests.post('https://univ-blog.xyz', data = postData)

 

 

 

여기까지가 필자가 자주 사용하는 requests 기능을 소개했다.

다음 포스터에는 requests를 이용하여 간단한 웹 크롤러를 만들어 보겠다.