티스토리 뷰

      





※ 주의 : 불법적인 크롤링에 대한 책임은 전적으로 본인에게 있습니다.

해당 포스팅 공유에 문제가 있다면 연락 부탁드립니다.



지난글([Scrapy] 스크래피 설치 및 셋팅(Windows 환경))에서 크롤링을 하기 위한 준비 작업을

모두 마쳤습니다.

이번 포스팅은 웹사이트 정보를 가져와서 필요한 부분만 추출하고 원하는 형식으로 가공하여 

파일에 저장하는 방법에 대한 글입니다.

파이썬 언어에 대한 기초적인 이해가 필요하긴 하지만 타프로그래밍 언어를 어느 정도 사용하실 줄 아신다면 느낌적인 느낌(?)으로 동작 원리절차를 이해하실 수 있으실 겁니다

코드별 설명은 주석으로 달아놓았으므로 참고하시기 바라며, 추가적인 함수나 설명은 

Scrapy 공식문서(영문)를 참고 부탁 드립니다.


그럼 시작해 보겠습니다.




[작업 과정 요약]

  1.크롤링 목적 및 대상 확인 : 필요한 정보와 정보를 보유하고 있는 웹사이트 확인

  2.Scrapy 프로젝트 생성 

  3.Item 파일 작성 : 수집할 데이터 구조 정의

  4.Spider 파일 작성 : 데이터 수집을 위한 수행 코드를 정의

  5.Pipelines 파일 작성 : 수집된 데이터 처리 방식 정의(파일저장/DB저장/이메일발송 등)

  6.Settings 파일 작성 : 프로젝트 모듈간 연결 및 기본 설정 정의

  7.프로젝트 실행 : 작성된 소스코드 컴파일 및 실행

  8.추출결과 확인 : 프로젝트 최상위 폴더 내 신규 생성된 데이터 파일 확인







1.크롤링 목적 및 대상 확인 

    - 크롤링 목적 : 분양 정보를 수집하고 관심있는 분양 정보 확인

    - 크롤링 대상 : 공공/민영 분양 정보를 보유하고 있는 아파트투유(apt2you.com) 홈페이지

    - 필요 데이터 : 주택명, 건설업체명, 청약기간, 당첨자발표일, 상제분양정보가 담긴 Link주소



2.Scrapy 프로젝트 생성 

    - 생성 명령어 : scrapy startproject 프로젝트명

    - 실행 결과 :  프로젝트명으로 폴더가 생성되고 하위 폴더내 기본 파일들이 생성됨




3.Item 파일 작성 

    - 파일목적 : 수집할 데이터 구조를 정의하며, 적절한 변수명으로 구분한다.

    - 소스코드 : items.py 파일 내용

# -*- coding: utf-8 -*-
import scrapy
from scrapy.item import Item, Field

class APT2UItem(scrapy.Item):
	aptname = scrapy.Field()		#주택명
	link = scrapy.Field()			#링크주소
	company = scrapy.Field()		#건설업체
	receiptdate = scrapy.Field()	#청약기간
	result_date = scrapy.Field()	#당첨자발표일



4.Spider 파일 작성 

    - 파일목적 : 데이터 수집 절차에 대한 수행 코드를 정의

    - 파일위치 : spider 폴더 내 신규 파일로 생성

    - 작업절차 : 

        1).해당 웹페이지에서 추출하고자 하는 정보들의 위치를 파악                    


        2).추출하고자 하는 정보 구조 파악


        3).정규표현식을 이용하여 확보한 전체 웹페이지 정보 중 필요 데이터만 추출

            - 소스코드 : APT2U_spiders.py 파일 내용

# -*- coding: utf-8 -*-
import scrapy
import sys
from scrapy.spiders import Spider
from scrapy.selector import HtmlXPathSelector
from APT2U.items import APT2UItem
from scrapy.http import Request
from scrapy.selector import Selector
reload(sys)
sys.setdefaultencoding('utf-8')

class APT2U_Spider(scrapy.Spider):
	name = "APT2U"	#spider 이름
	allowed_domains = ["www.apt2you.com"]	#크롤링할 최상위 도메인
	start_urls = ["http://www.apt2you.com/houseSaleSimpleInfo.do"]	#실제 크롤링할 주소
	
	def parse(self, response):
		hxs = Selector(response)	#지정된 주소에서 전체 소스코드를 가져옴
		selects =[]	#전체 소스코드 중에서 필요한 영역만 잘라내서 담을 리스트
		selects = hxs.xpath('//tbody[@class="line"]/tr')	#필요한 영역을 잘라서 리스트에 저장
		items = [] #데이터를 Item별로 구별해서 담을 리스트	
		for sel in selects:
			item = APT2UItem() #item 객체 선언	
			item['aptname'] = sel.xpath('th[@scope="row"]/a[@href="#none"]/text()').extract() #주택명 추출
			item['link'] = sel.xpath('th[@scope="row"]/a/@onclick').re('\d+') #링크 추출
			item['link'][0] = "http://www.apt2you.com/houseSaleDetailInfo.do?manageNo="+item['link'][0] #전체링크주소구성
			item['company'] = sel.xpath('td[1]/text()').extract() #건설업체 추출
			item['receiptdate'] = sel.xpath('normalize-space(td[2]/text())').extract() #청약기간 추출
			item['result_date'] = sel.xpath('td[@class="end"]/text()').extract() #당첨자발표일 추출
			items.append(item) #Item 1개 세트를 리스트에 담음
		return items


5.Pipelines 파일 작성 

    - 파일목적 : 수집된 데이터 처리 방식 정의(파일저장/DB저장/이메일발송 등)

    - 주의사항 : 한글 처리를 위해 저장할 파일에 대한 utf-8 설정 필요

    - 소스코드 : 

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import json
import codecs

class Apt2UPipeline(object):
	def __init__(self):
		self.file = codecs.open('Apt2U.json', 'w', encoding='utf-8') #크롤링 데이터를 저장할 파일 OPEN
		
	def process_item(self, item, spider):
		line = json.dumps(dict(item), ensure_ascii=False) + "\n" #Item을 한줄씩 구성
		self.file.write(line) #파일에 기록
		return item
		
	def spider_closed(self, spider):
		self.file.close()	#파일 CLOSE


6.Settings 파일 작성 

    - 파일목적 : 프로젝트 모듈간 연결 및 기본 설정 정의

    - 소스코드 : settings.py 파일 내용

BOT_NAME = 'APT2U'
SPIDER_MODULES = ['APT2U.spiders']
NEWSPIDER_MODULE = 'APT2U.spiders'
LOG_LEVEL='ERROR'  
ITEM_PIPELINES = { 'APT2U.pipelines.Apt2UPipeline' }



7.프로젝트 실행 

    1)프로젝트 폴더로 이동 : cd 프로젝트명

    2)프로젝트 실행 명령어 입력 : scrapy crawl 프로젝트명



8.추출결과 확인 

    1)파일 위치 : 프로젝트 최상위 폴더 내 위치


    2)파일 내용 확인 : 원하는 결과가 정상적으로 저장되었는지 확인

결과 자료를 게시하는 것은 저작권 등 문제가 있을 수 있으므로 모자이크 처리하였습니다.


파이썬(Python) 자체가 생산성이 높기로 유명하긴 하지만 

웹사이트 크롤링 코딩을 하면서 새삼 놀랐네요.

웹페이지를 가져와서 데이터를 가공하고 파일로 저장하는 

전체 단계를 프로그램으로 작성하는데 56라인으로 

끝났네요. 제가 직접 작성하느 코드는 더 적다는거...



DB 저장은 다음글을 참조 부탁 드립니다.

 

 



※ 이번 포스팅에 대한 전체 코드는 아래 첨부파일을 참조하시기 바랍니다.

APT2U.zip


 

 



 



홍보배너링크
댓글
최근에 올라온 글
최근에 달린 댓글