본문 바로가기

개발일지/의뢰, 커미션, 외주

웹 정보 검색 및 크롤링 프로그램 (Python)

 

 

※ 이 글은 의뢰자의 허락을 맡고 올리는 개인 포트폴리오용 글입니다.

 

프로그램의 목적, 정보를 담지 않고, 알고리즘, 작성 방식만을 담은 글입니다.

 

 추후 심심하면 이 글의 내용을 종류별 분리해서 따로 글을 작성할 수도 있습니다.

 

 

 

Requests

 

http request를 보낼 수 있는 라이브러리.

 

requests.post(url, cookies, headers, data) 를 통해 올바르게 값을 전달할 경우

 

(기본적으로) html 형식으로 response를 받게 된다.

 

parameter로 들어가는 값들은 사이트에 맞게 넣어줘야 하는데,

 

그것은 아래의 방법을 이용해 알아낼 수 있다.

 

 

 

 

Requests에 넣을 값을 찾는 방법

 

???? : 어 이 XX 힌트도 해석 못했는데 비밀번호 맞추는 거 보니까 나무위키 보고왔네ㅔㅔㅔㅔㅔㅔㅔㅔㅔㅔ

더럽게 더럽게 보고왔네

 

위의 캡처는 F12를 눌러 오른쪽에 저거를 띄우고 구글에 '나무위키'를 친 결과다.

 

그러면 

 

10배 확대한

 

이 아이콘을 가진 파일을 뒤져보면 (여러 개 있을 수 있음), 

 

추하게 추하게 보고왔네

 

이런 식으로 html에 나오는 텍스트, 일부에 대해 우리가 원하는 정보를 가지고 있는 경우가 있다.

 

우리가 원하는 정보를 가진 파일을 오른쪽 클릭하면

 

자아기가 자아기가 모옷해놓고

 

이런 식으로 무언가를 copy할 수 있다.

 

이것은 간단하게 말하자면, 이 파일을 얻기 위해 전송된 http request를 보여준다고 생각하면 된다.

 

근데, 이걸 그대로 쓰기에는 언어에 맞지 않는 코드일 가능성이 높다.

 

그래서 이것을 언어에 맞게 사용할 수 있도록 변환해줄 것인데,

 

 

일단은 "Copy as cURL (bash)"를 눌러주자.

 

그리고 아래의 사이트를 들어가자.

 

https://curlconverter.com/

 

Convert curl commands to code

GitHub is matching all contributions to this project on GitHub Sponsors. Contribute Now

curlconverter.com

 

 

이 사이트는 curl(cURL) 이라는 url 기반 데이터 전송 유틸리티 프로그램? 명령어를

 

각 언어에 맞게 변환해주는 사이트다.

 

 

 

아까 구글에 나무위키 친거를 그대로 복사해서 넣어서 Python용으로 바꾸었다.

 

이런 식으로 사용 언어에 맞게 명령어를 변환해서 http request를 보낼 수 있다.

 

일부 잘려 있지만, cookies, headers, data에 들어가는 값들 중에 반복문 등을 통해 이용 가능한 값이 있을 수 있다.

 

이를 분석하면, 여러 페이지의 사이트를 자동으로 request를 보내서 데이터를 얻을 수 있다.

 

물론, request가 올바르게 들어가 데이터가 잘 받아지는 직접 확인해야 한다.

 

 

 

이 request는 데이터 전송 시간이 있기 때문에 자동화해도 생각보다 오래 걸린다.

 

그렇기 때문에, 수 천 번의 request는 프로그램의 동작 시간을 매우 오래 걸리게 할 수 있으니 주의가 필요하다.

 

데이터 정제는 find(), find_all() 이나 .stripped_strings, .text 등을 이용해서 해주는 것이 깔끔할 것이다. (설명 생략)

 

 

 

 

 

API 이용하기

 

만약 사이트에서, 특히 수 천 번의 request가 필요할 것으로 예상되는 사이트에서

 

API를 제공해주는 경우, 이를 이용하는 것이 훨씬 빠른 방법이 된다.

 

사이트마다 API를 제공하는 방식에 로그인이 필요하거나, 아예 승인이 필요한 경우가 발생할 수 있다.

 

하지만 프로그램 동작 시간에 유의미한 영향을 주니, 수 천 번 이상의 request가 필요한 사이트에서는

 

가급적이면 이용해주자.

 

 

사이트에 따라 정제된 값을 줄 수도 있고, xml 등의 형태로 반환이 되는 경우도 있다.

 

이 형태는 모두 다르므로, 그리고 API 이용 방법도 다르므로

 

사이트에서 제공하는 Information을, 있는 경우 reference 사이트를 열심히 이용해주자.

 

 

 

 

 

제작하면서 중요하게 느낀 것 1. 중간 저장을 잘 하자

 

특히 파일 입출력에서 많은 양의 데이터를 저장할 때

 

중간에 프로그램이 픽하고 쓰러지는 경우에 파일이 날라가는 사태가 생기지 않도록

 

중간에 저장을 할 수 있도록 코드를 짜는 것이 생각보다 중요했다.

 

 

 

 

 

제작하면서 중요하게 느낀 것 2. 에러 캐칭을 잘 하자

 

중간에 프로그램이 강제로 알 수 없는 이유로 종료가 되면

 

일반적으로 크리티컬한 에러가 발생하는 경우다.

 

이를 최대한 테스팅 과정에서 캐칭을 해주고,

 

해당 에러에 대한 대비를 경우에 맞게 잘 해주는 것이 중요했다.

 

시연 및 피드백 과정에서 예상 못한 에러로 인해 강제 종료하는 경우가 발생했고

 

이를 찾아 캐칭해주는 것이 중요하게 작용했다.

 

 

 

 

 

 

여담

 

사실 이 request를 보내는 것, API를 이용하는 것 외에

 

파일에 값을 저장하고 불러오는 것,

 

입력값에 대해 assertion을 잘 해주는 것,

 

검색이나 크롤링 조건에 부합하도록 체크하는 알고리즘 등 많기는 하지만

 

이에 대해 굳이 여기서 작성할 필요는 없기 때문에 생략한다.

 

 

이러한 것들에 대해서는 그 자체를 따로 설명하는 글을

 

심심하면 작성할지도 모른다.

 

728x90