DONE‎ > ‎

web crawling

웹페이지를 긁어서 필요한 내용을 정리할 일이 종종 있다.

이것을 처리하기 위한 방법 중 파이썬을 쓰는 방법으로는 다음과 같은 것들이 있다.
  • BeautifulSoup : 몇 년 전에 많이 썼다. (perky님이 BeautifulSoup을 써서 뭔가를 했다는 글을 보고 그런 게 있구나 싶어서 한동안 썼었다.)
  • mechanize : 직접 써본 적은 없다. urllib2 등을 통해서 한 단계 추상화된 처리를 해준다.
  • twill : mechanize를 기반으로 하여, 사람이 할법한 일련의 동작을 사용할 수 있는 환경을 제공한다. 다만 개발이 중단됐고 retwill 같은 fork도 개발이 계속되지 않는 것으로 보인다. 현재 지원하는 명령이 비교적 단순하고 단선적인 진행을 가정하고 있어서 대량으로 처리되는 곳에는 맞지 않다.
  • scrapy : 쓸만하다. 전송 요청(request)과 반환 결과(response)를 총괄해주고 페이지 안에 제시된 폼(form)을 제출할 수도 있고 그 밖에 다양한 설정을 지원한다. 데몬(daemon) 방식으로 유지할 수도 있는 등 대규모로 운영하기에 적절하다.
    • 페이지 안에서 값을 추출할 때 XPath를 사용하는데 일상적으로 쓰는 문법은 아니다 보니 필요한 형태의 선택자(selector)를 구성하는 것이 걸림돌이 될 수도 있다.


어린이집 정리


http://www.childcare.go.kr/cpis2gi/nursery/NurserySlPL.jsp 페이지에서 지역별 어린이집의 현황을 확인할 수 있다.

scrapy를 통해서 아래와 같이 어린이집 목록을 추출한다. (첨부파일 참조)
  1. 웹서버에 지나친 부하를 주지 않도록 settings.py 파일에 CONCURRENT_REQUESTS_PER_DOMAIN=1 항목을 추가한다.
  2. 최초 페이지에 표시된 시/도 단위 코드를 통해 하위 시/군/구 단위 코드를 가져온다.
  3. 시도+시군구 코드를 조합해 각 지역별 목록 페이지를 호출한다.
  4. 각 지역별 목록 페이지의 1페이지에서 시작하였으므로, (1페이지에 나온 전체 갯수를 기준으로 몇 페이지까지 있는지 계산한 후) 2페이지 이후도 모두 호출한다.
  5. 각 지역의 모든 페이지에 대해 확보된 목록에서 각 어린이집의 고유번호를 구한다.
  6. 고유번호를 통해, 미리 알아둔 어린이집 상세 페이지를 가져온다.
  7. 상세 페이지에서 정보를 확보한다.

추가로 처리될 것은 다음과 같다. (처리되면 위의 목록에 포함할 것)
  1. 각 request가 매번 호출을 발생시키는데, 일단 가져왔으면 바로 저장하고, 다음 번에 접근할 때는 지정된 url+data에 해당하는 파일이 있는지 확인하여 파일을 읽어서 쓰도록 변경한다. 파일은 일정 시간이 지났으면 파기하고 새로 읽어온다.
  1. 상세 페이지 외에 지도 페이지가 있고 호출되는 주소(URL)에는 위/경도 좌표가 없지만 지도 페이지가 열린 이후에는 다음 지도를 호출하기 위한 위/경도 좌표가 있으므로 좌표를 가져온다. (서로 다른 URL을 호출하여 정보를 취합하는 것이므로 현재의 단반향 흐름을 변경하는 방법을 먼저 확인해야 한다.)
  2. 위의 진행이 첫 단계에서 시작해야만 되는 구조이고 중간부터 시작할 수는 없도록 되어 있는데, 실행 영역을 분리하며 중간부터 수행할 수 있도록 한다.
  3. JSON 등 파일로 저장하는 것을 DjangoItem 정도로 교체하여 DB로 바로 저장될 수 있도록 한다. (먼저 Django 프로젝트를 생성해야 한다.)
  4. scrapyd 설정을 통해 지속적으로 실행될 수 있도록 한다.
ċ
club_spider.py
(6k)
Jeong-Hee Kang,
2013. 5. 26. 오후 5:40
ċ
items.py
(2k)
Jeong-Hee Kang,
2013. 5. 26. 오후 6:10
Comments