HTML에 존재하는 모든 내용을 가져오는 방법이다.
이 방식은 웹 표준을 준수하는 사이트에서만 사용이 가능하다.
============================ Python ============================
### 재귀적으로 HTML 페이지를 처리하기
'''
1. HTML을 분석한다.
2. 링크를 추출한다.
3. 각 링크 대상에 '다음'처리를 한다.
4. 파일을 다운받는다.
5. 파일이 HTML이라면 재귀적으로 1.로 돌아가서 순서를 처음부터 실행한다.
'''
# 파이썬 매뉴얼을 재귀적으로 다운받는 프로그램
# 라이브러리 적용
from bs4 import BeautifulSoup
from urllib.request import *
from urllib.parse import *
from os import makedirs
import os.path, time, re
# 이미 처리한 파일인지 확인하기 위한 변수
proc_files = {}
# HTML 내부에 있는 링크를 추출하는 함수
def enum_links(html, base):
soup = BeautifulSoup(html, "html.parser")
links = soup.select("link[rel='stylesheet']") # CSS. <link> 태그 내에 rel="stylesheet"인 것들을 모으기.
links += soup.select("a[href]") # 링크. <a> 태그 내에 href 가 들어간 것을 다 잡아낸다.
result = []
# href 속성을 추출하고, 링크를 절대 경로로 변환
for a in links:
href = a.attrs['href']
url = urljoin(base, href)
result.append(url)
return result
# 파일을 다운받고 저장하는 함수
def download_file(url):
o = urlparse(url)
savepath = "./" + o.netloc + o.path # netloc: Network location part
if re.search(r"/$", savepath): # 폴더라면 index.html
savepath += "index.html"
savedir = os.path.dirname(savepath)
# 모두 다운됐는지 확인
if os.path.exists(savepath):
return savepath
# 다운받을 폴더 생성
if not os.path.exists(savedir):
print("mkdir=", savedir)
makedirs(savedir)
# 파일 다운받기
try:
print("download=", url)
urlretrieve(url, savepath)
time.sleep(1) # 1초 휴식
return savepath
except:
print("다운 실패: ", url)
return None
# HTML을 분석하고 다운받는 함수
def analyze_html(url, root_url):
savepath = download_file(url)
if savepath is None:
return
if savepath in proc_files:
return # 이미 처리됐다면 실행하지 않음
proc_files[savepath] = True
print("analyze_html=", url)
# 링크 추출
html = open(savepath, "r", encoding='utf-8').read()
links = enum_links(html, url)
for link_url in links:
# 링크가 루트 이외의 경로를 나타낸다면 무시
if link_url.find(root_url) != 0:
if not re.search(r".css$", link_url):
continue
# HTML 이라면
if re.search(r".(html!htm)$", link_url):
# 재귀적으로 HTML 파일 분석하기
analyze_html(link_url, root_url)
continue
# 기타 파일
download_file(link_url)
if __name__ == "__main__":
# URL에 있는 모든 것 다운받기
url = "https://docs.python.org/3.5/library/"
analyze_html(url, url)
============================ Python ============================
'데이터 분석 > 데이터 분석 기초 자료' 카테고리의 다른 글
[알고리즘]랜덤포레스트(RandomForest) (0) | 2018.07.21 |
---|---|
[데이터 수집] 파이썬으로 API를 이용하여 JSON 형태의 영화 데이터 수집하기 (0) | 2018.07.04 |
[Tensorflow] AVX 미지원으로 인한 "DLL 초기화 루틴을 실행할 수 없습니다." 에러 해결방법 (1) | 2018.06.29 |
[Hadoop] 가상환경을 이용하여 하둡(Hadoop) 설치하기 - 2 (우분투 서버(ubuntu server)설치) (0) | 2018.06.28 |
[Hadoop] 가상환경을 이용하여 하둡(Hadoop) 설치하기 - 1 (가상환경 만들기) (0) | 2018.06.26 |