Wednesday, December 8, 2010

Python 으로 간단히 웹 스크래핑

증권거래소에서 매일 갱신되는 투자지표는 엑셀로 다운로드 받을 수 있다.
이 데이터를 매번 수작업으로 받자니 번거롭기 그지 없다. Python으로 자동으로 받아보자.

Firefox 플러그인인 HttpFox 를 이용해 트래픽을 분석해보자.

아래 페이지에서 HttpFox를 실행하고 다운로드를 클릭한다.

[다운로드] 버튼을 클릭하면 엑셀파일이 다운로드 된다.

HttpFox 에서 보면 URL을 알 수 있다. 그런데 URL만 적으면 안되고 Form Data를 함께 전송해야 정상적인 다운로드가 가능하다. 이런 건 경험적으로 밖에는 알 수 없겠다.

HttpFox로 캡처한 HTTP 요청과 응답. 함께 전송된 Form Data에 주목.

이제 데이터를 받아서 저장하는 간단한 코드를 짜보자. 예외처리가 여기저기 필요하지만, 생략하기로 한다.


# 요청 파라미터 설정

params = urllib.urlencode({ 'Market':'','CMD':'',
'cur_page':'1', 'pageSize':'300','market_gubun':'1','gubun':'1','isu_nm':'삼성전자 [005930]',
'isu_cd':'A005930','mthd':'','fr_work_dt':'20101207','to_work_dt':'20101207'})
headers = {"Content-type": "application/x-www-form-urlencoded"}

url = '/por_kor/common/COM00030.jsp?url=/common/COM00040.jsp&bld=/sto/stc_l_031_download'
 

# 접속
con = httplib.HTTPConnection('www.krx.co.kr')
con.request("POST",url,params,headers)
response = con.getresponse()
print response.status, response.getheaders()


# 데이터 다운로드 및 저장
data = response.read()
fp = open('data.xls','wb')
fp.write(data)
fp.close()
con.close()