최근 청년전세자금 대출을 이용하여 독립을 해보려고 원룸을 알아보고 있었는데, 대출로 계약할 수 있는 방이 한정적이었다. 검색이라도 할 수 있으면 괜찮은데 검색도 할 수 없어서 직접 대출이 가능한 방을 크롤링하여 수집하기로 하였다. 지난 [크롤링] 무작정시작하기 포스트에서는 html 태그를 분석하고 태그에서 원하는 데이터를 추출하는 방법으로 크롤링을 하였는데, 이번에는 API서버에 데이터를 요청하는 URL을 이용하여 데이터를 크롤링하는 방법을 알아보도록 하겠다.
이번 크롤러는 코딩보다는 수집할 데이터를 어디서 어떻게 가져올 것인가 분석하는데 더 많은 노력이 필요하다. 크롤러를 만들면서 데이터를 수집할 이런 저런 방법들을 찾아봤는데 지하철역을 기준으로 검색하는 것이 가장 편했기 때문에 이를 기준으로 포스트를 작성하도록 하겠다.
1. 수집 대상 분석.
1-1. Chrome 브라우저에서 직방 사이트 접속.
1-2. '원룸' 선택 후 '수유역(4호선)' 클릭.
1-3. 조회화면 확인.
- 검색하면 위와같이 지도에 수유역을 중심으로 주변의 매물들이 조회됨.
- 간략한 정보들이 오른쪽에 목록으로 출력됨.
- 지도를 움직일 때마다 새로운 화면에 노출되는 데이터를 조회함.
- AJAX를 통해 데이터를 조회해오는 것으로 유추해볼 수 있음.
1-4. F12를 눌러 개발도구(DevTools)를 실행하고 [ Network ] 탭으로 이동.
- Network탭에서는 웹페이지를 사용하면서 Server와 Client가 어떤 데이터를 주고 받는지, 속도가 얼마나 걸리는지 등을 확인할 수 있음.
- AJAX로 서버에서 데이터를 받는다면 이곳에 Type이 XHR인 로그가 남음.
* XHR(XMLHttpRequest)은 Server와 Client간데 데이터를 주고받는 API.
- 따라서, Filter 조건으로 [ XHR ]을 선택하고 다음으로 진행.
1-5. [ 1-3 ] 화면에서 F5를 눌러 화면을 새로고침(Refresh) 해줌.
- 그럼 위와 같이 Server와 통신한 내용들을 확인할 수 있는데, 우리가 필요한 것은 저 표시된 로그임.
- 어떤 데이터가 있고, 어떤게 필요한 정보를 담고 있는지 하나 하나 확인해보면서 분석하는 것을 추천.
1-6. [ 1-5 ]에서 찾은 XHR로그 확인.
- [ Headers ]에서 [ RequestURL ]을 알 수 있음.
* 이 RequestURL을 가지고 크롤링할 것이므로 잘 기록해두길 바람.
- [ Preview ]에서 'list_items'와 'total_count: 795'를 확인.
* total_count: 795는 [ 1-3 ]에서 조회된 매물 건수와 일치함.
- RequestURL에서 살펴보면 '96?subway_id=96'이 있는데, 수유역의 ID가 96인 것을 알 수 있음.
1-7. 지하철역 정보.
- 다른 XHR 로그들을 살펴보면 지하철역 정보들도 API 서버에서 가져오는 것을 확인할 수 있음.
- 이것으로 지하철역을 입력받아 크롤링하도록 만들 수 있음.
* 지하철역의 전체 정보를 조회하는 [ all ]에 대한 [ RequestURL ]도 기록해두길 바람.
1-8. [ 1-3 ]에서 조회된 방을 선택하여 상세정보 확인하기.
- 상세정보를 클릭하면 매물의 ID를 이용하여 상세 정보를 가져오는 [ RequestURL ]을 확인.
1-9. 정리.
- 지하철역으로 검색하면 AJAX를 통해 API서버에서 지하철역 정보, 매물목록, 매물정보를 받아옴.
- API서버에서 데이터를 받아오는 URL을 이용하여 매물정보를 크롤링을 할 수 있음.
2. 마치며.
- 크롤러를 만드는 것은 언제나 데이터를 분석하는게 가장 어렵고 인내를 요하는 일인것 같다. 하지만, 잘 분석해두면 실제 코딩하는것은 어렵지 않으므로 꼼꼼하게 잘 분석해보길 바란다.
- 다음 다음포스트에서는 이번 포스트에서 수집한 URL들을 가지고 크롤러를 만들어보도록 하겠다.
'Back-end > Python' 카테고리의 다른 글
[Celery] 무작정 시작하기 (5) - Monitoring (0) | 2020.01.28 |
---|---|
[크롤링] 직방에서 방찾기 (2) - Crawler (0) | 2020.01.21 |
[Celery] 무장적 시장하기 (4) - Group과 Chord (0) | 2020.01.20 |
[Celery] 무작정 시작하기 (3) - Chain (0) | 2020.01.20 |
[Celery] 무작정 시작하기 (2) - Task (1) | 2020.01.17 |
댓글