1. requests 모듈이란
requests
모듈이란 http request/response를 위한 모듈이다.
HTTP method를 메소드 명으로 사용하여 request
를 요청한다. ex) get, post
우선 requests
모듈을 불러보자.
import requests
get
요청의 경우는 requests
모델의 get
함수를 사용하면 된다. 우선 url
을 다음과 같이 정의하자. (요청할 사이트임)
url = 'https://news.v.daum.net/v/20190728165812603'
resp = requests.get(url)
resp
위 코드는 url
에 해당하는 서버에 요청하여 응답값을 가져오라는 의미이다.
이 결과값으로 Response [200]이라는 output을 받을 수 있는데, 2가 들어가면 성공이라는 의미를 갖는다. (가장 성공적인 응답이 200임)
그렇다면 응답을 받는 데에는(요청에는) 문제가 없다는 뜻이 되고, 데이터를 text
라는 속성을 사용하여 가져올 수 있다.
url = 'https://news.v.daum.net/v/20190728165812603'
resp = requests.get(url)
resp.text
그럼 결과물로 우리가 전 시간에 다뤘던 페이지 소스 보기 에서 봤던 데이터와 동일한 텍스트를 확인할 수 있다.
이런식으로 get
방식의 경우는 간단히 url
만 전달하면 된다.
다음은 post
요청이다. post
요청은 기본적인 페이지에서는 잘 쓰이지 않는다. (민감한 데이터 전달용) ex) 로그인
url = 'https://www.kangcom.com/member/member_check.asp'
data = { 'id' : 'macmath22', 'pwd' : 'T'}
resp = requests.post(url, data= data)
resp.text
위 코드의 url
주소는 해당 사이트의 로그인을 요청하는 url
이다. 그리고 requests
모듈에 post
함수를 사용하면되는데 post
함수는 url
, data parameter
를 받는데 여기서 data
는 로그인시 필요한 ID, PWD 데이터이다.
만약 data dict
의 id, pwd data가 올바른 데이터라면 로그인 성공시의 결과값, 틀린값이라면 로그인이 실패했을 때 결과값이 text
로 return
될 것이다.
다음은 HTTP header
를 이용해보자
일반적인 상황이 아닌 경우에 크롤링이 정상적으로 되지 않은 경우 header
를 사용하여 데이터 크롤링을 시도하는 방법이라고 한다.
개발자 도구의 network
에서 Request Headers
에서 User-Agent
를 찾고 복사하여 사용해보자
url = 'https://qstudy.kr/'
headers = {'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'}
resp = requests.get(url, headers = headers)
resp.text
url
은 https://qstudy.kr/ 이고, 해당 사이트의 user-agent
는 위와 같다.
위와 같이 get
함수의 headers parameter
에 headers dict
를 넣어주고 text
속성으로 결과를 받으면 크롤링이 된다.
기본적인 세팅으로 크롤링이 진행되지 않을 시 headers
를 이용하여 크롤링하는 방법을 알아보았다.
이런 방법으로 headers
를 추출할 수 있고 parameter
로 전달할 수 있다는 것 만을 알아두자.
💡 requests.get()
함수는 2개의 파라미터를 가질 수 있다.
2. HTTP response 처리하기
url = 'https://news.v.daum.net/v/20190728165812603'
resp = requests.get(url)
resp.status_code # response의 결가 코드 확인
if resp.status_code == 200:
resp.text
else:
print('error')
3. open API를 활용하여 json data 추출하기
공공데이터포털의 API를 활용하여 json type의 데이터를 추출해보자. 문화공공데이터광장이 제공하는 API를 활용해보겠다.
문화공공데이터광장의 홈 화면이다. 검색 설정에서 data type을 선택할 수 있고. 해당하는 오픈 API가 407개가 있다는 것을 확인할 수 있다.
서비스유형을 open api, 데이터타입을 json으로 설정 후 관광이라는 키워드로 검색을 해보았다.
9건의 검색결과가 나타난다. 인기순 나열에서 가장 상위에 있는 관광지정보 오픈 API로 실습을 진행해보자.
상세 페이지로 들어가보면 관광지 정보의 url이 보인다. 이 url을 그대로 복사하여 주소창에 넣어 요청해보자.
status_code 401
오류가 나타난다. 이는
즉 인증키를 활용하여 자격 증명을 받지 않았기 때문에 나타나는 것이다. 앞에서 다뤘듯이 API를 통해 요청했을 때 가장 좋은 응답은 200code
이다.
API를 통해 데이터를 제공 받으려면 우선적으로 담당 기관에 활용신청을 통해 ServiceKey를 받아야 한다. ServiceKey를 통해 인증받은 자만이 오픈 API의 데이터를 제공받을 수 있는 것이다.
우선 상세 페이지 우측에 존재하는 활용신청 버튼을 눌러서 servicekey를 받는다.
보통 servicekey 신청자정보에서 작성한 이메일로 발송되기 때문에 이메일을 확인하고 작성해야 한다.
메일로 가보면 ‘서비스 키 발급 안내’ 라는 제목으로 서비스키가 발급됐을 것이다.
서비스 키를 복사해주고 다시 상세 페이지를 확인해보자
servicekey를 입력해주고 Try it out 을 클릭하면 Responses 에서 Requests URL 을 발급받는다. 이걸 그대로 복사해서 python에 객체화하여 열 수 있다. 하지만 우리가 필요로 하는 데이터 형식은 json형식이다. 지금 열면 이렇게 된다.
Request할 URL을 culture_inf라는 변수에 객체화 하였고 requests
모듈을 불러 get
함수를 사용했다.
requests.get()
함수를 사용해서 앞서 객체화한 url을 부르고 status code를 확인해보자.
culture_imf = 'URL with servicekey'
print(culture_imf) # json이 아닌 xml 형식
import requests
data = requests.get(culture_imf)
data.status_code
data.status_code
의 결과값으로 code 200
이 나왔고 이는 성공적인 응답을 의미한다.
그럼 이제 text속성으로 데이터를 불러보자.
역시 xml 형식의 text가 나타난다.
데이터포털의 Responses에서 Curl를 자세히 보면 headers 에 accept : application/json 을 입력하라는 힌트(?)를 확인할 수 있다.
해당 api는 데이터형식을 json으로 받기위해서 headers
에 이러한 key value를 입력해줘야하는 것으로 보인다.
headers = { 'accept' = 'application/json'}
goto_jsondt = requests.get(p_data, headers = headers)
goto_jsondt.json()
headers
라는 변수에 위에 나타나 있는 key와 value값을 dict형식으로 넣어 객체화해주고 requests.get()
함수에 headers
파라미터를 포함해 불러보자.
그리고 json()
속성을 열어보면 ?
(이러한 과정없이 json을 열면 error가 발생한다.)
이런 dict구조의 json형식의 데이터가 열린다.
제공하는 사이트, 회사, 기관마다 관리하는 API를 다루는? 방법은 다양하다고 한다.
끝 !
'python > data crawling' 카테고리의 다른 글
정규표현식으로 tag 찾기 & 정규표현식 정리 (0) | 2023.02.14 |
---|---|
5. CSS selector를 이용하여 tag 찾기 (0) | 2023.02.14 |
4. beautifulsoup 모듈 (0) | 2023.02.14 |
2. http method (GET, POST) (0) | 2023.02.13 |
1. 개발자 도구, Elements, Network (0) | 2023.02.13 |