html을 재귀적으로 처리하는 방법, request 요청에 따른 스크래핑 기법을 공부하였다.
request에 대한 내용이 나오니까 웹 프로그래밍에 대해서 공부를 했다면 쉽게 이해하고 적용할 수 있을 것이다.
여기 나오는 내용은 "파이썬을 이용한 머신러닝, 딥러닝, 실전 개발 입문"에 나오는 내용이다.
============================ Python ============================
import re
# DOTALL(S) => 줄바꿈 문자가 포함되어도 매치할 수 있도록 한다.
# IGNORECASE(I) => 대소문자와 관계없이 매치하겠다.
# MULTILINE(M)
# VERBOSE(X) => 정규식을 잘 볼 수 있도록
p = re.compile('[a-z]', re.I)
m = p.match("PY")
print(m)
import re
from urllib.parse import urljoin
from bs4 import BeautifulSoup
import os.path as pt
print(pt.getsize('D:/deep/tmp/test.txt'))
print(pt.isabs('/deep/tmp/test.txt'))
print(pt.join('D:/deep/tmp', '/test.txt'))
print(pt.normcase('D:/deep/tmp'))
print(pt.split('D:/deep/../tmp/test.txt'))
print(pt.splitdrive('D:/deep/../tmp/test.txt'))
print(pt.splitext('D:/deep/../tmp/test.txt'))
print(pt.normpath('D:/deep/../tmp/test.txt'))
### 재귀적으로 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)
# 로그인을 위한 모듈 추출하기
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
# 아이디와 비밀번호 지정하기
USER = "아이디"
PASS = "비밀번호"
# 세션 시작하기
session = requests.session()
# 로그인하기
login_info = {
"m_id": USER, # 아이디 지정
"m_passwd": PASS # 패스워드 지정
}
url_login = "http://www.hanbit.co.kr/member/login_proc.php"
res = session.post(url_login, data=login_info)
print(res.status_code) # 정상처리시 200이 출력된다.
# 자세한 내용은 https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C 참조.
res.raise_for_status() # 오류가 발생하면 예외가 발생한다.
# 마이페이지에 접근하기
url_mypage = "http://www.hanbit.co.kr/myhanbit/myhanbit.html"
res = session.get(url_mypage)
res.raise_for_status()
# 마일리지와 이코인 가져오기
soup = BeautifulSoup(res.text, "html.parser")
mileage = soup.select_one(".mileage_section1 span").get_text()
ecoin = soup.select_one(".mileage_section2 span").get_text()
print("마일리지: " + mileage)
print("이코인:", ecoin)
import requests
res = requests.get("http://wikibook.co.kr/wikibook.png")
text = res.content
print(text)
import requests
res = requests.get("http://wikibook.co.kr/wikibook.png")
with open("test.png", mode="wb") as f:
f.write(res.content)
import requests
urlt = "http://www.tistory.com"
params = {
"param1": "value1",
"param2": "value2"
}
res = requests.get(urlt, params=params) # 파라미터를 뒤에 ?param2=param2¶m1=param1 을 붙여준다. get방식
print(res.url)
# GET 요청
r = requests.get("http://google.com")
# POST 요청
formdata = { "key1": "value1", "key2": "value2"}
r = requests.post("http://example.com", data=formdata)
# PUT/DELETE/HEAD 요청
r = requests.put("http://httpbin.org/put")
r = requests.delete("http://httpbin.org/delete")
r = requests.head("http://httpbin.org/get")
### 현재 시간에 대한 데이터를 추출하고, 추출한 데이터를 텍스트 형식과 바이너리 형식으로 출력하는 예제
# 데이터 가져오기
import requests
r = requests.get("http://api.aoikujira.com/time/get.php")
# 텍스트 형식으로 데이터 추출하기
text = r.text
print(text)
# 바이너리 형식으로 데이터 추출하기
bin b") as f:
f.write(r.content)
print("saved")
============================ Python ============================
'프로그래밍 > Python, R 프로그래밍' 카테고리의 다른 글
[Python] Python 25일차(파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문) (0) | 2018.07.09 |
---|---|
[Python] Python 24일차(파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문) (0) | 2018.07.04 |
[Python] Python 22일차(파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문) (0) | 2018.07.02 |
[Python] Python 21일차(예제로 배우는 파이썬 데이터 시각화) (0) | 2018.06.20 |
[Python] Python 20일차(예제로 배우는 파이썬 데이터 시각화) (0) | 2018.06.19 |