TechTogetWorld


인공지능의 실전입문에 관한 글입니다.

알고리즘을 만드는것이 아니고, 만들어진 알로리즘을 활용하는 방법에 관한 글입니다.

자동차 운전을 위해 자동차를 만드는방법을 알필요는 없습니다. 물론 알면 좋기는 하겠지만, 서로 별도의 분야라고 할수있습니다.


본글은 인공지능에 입력할 학습data를 구하는 방법에 관한 글입니다 ( 인터넷에 흩어져 있는 자료수집 )

글의 순서는 아래와 같습니다.


=========================================================================================

[ 웹상의 데이타 가져오기 ]

1.개발환경 구성

  - 아나콘다 기준으로 설명합니다.  

  - Docker를 설치하고, 우분투를 설치하고, 우분투에서 각종 패키지(apt-get install)를 설치해도 무방합니다.
  - 아나콘다는 파이선 패키지를 쉽게 설치할수있도록 도와줍니다.
    . conda install ~
    . pip ~ 등으로 설치한다

2.웹사이트에 자료요청하는 방식 ==> get 요청

3.웹사이트에서 사진한장 가져오기 ==> download-png1

4.쇼핑몰에서 가격정보 가져오기 ==>bs-usd

5.포털에서 뉴스자료 가져오기 ==> download-bs-news2

6.웹 사이트에 파이선으로 프로그램 안에서 로그인 하기 ==> 170813 6 selenium-login

7.자바스크립트를 이용해서 자료 가져오기 selenium-js

8.날씨정보 가져오기 ==>170813 8 api-weather

9.네이버에서 이메일 가져오기 ==> 170813 10 selenium-login

   - 네이버 메일을 가져오는 코드입니다.

   - 네이버에 처음 로그인시에는

      . 1)로그인 ,2)새로운 기기 등록 , 3)로그인상태 유지 3단계의 단계를 통과해야 합니다. 각각 단계에 버튼입력코드가 필요합니다

      . 두번째 부터는 새로운 기기등록 , 로그인상태 유지  2단계의 코드는 필요없습니다, 주석처리를 해야합니다. 주석 처리 않하면 error 발생

10  날씨 가져오기 ==>170814 1 xml-forecast] 
11. 깃 허브에서 자료가져오기 ==>170814 2 json-github

12  csv 화일 읽기 ==> [# EUC_KR로 저장된 CSV 파일 읽기]

13. 엑셀화일 읽기==>[# 170814 4 excel-read]

  - 다운받은 엑셀은  다름이름으로 저장 " 엑셀통합문서" 로 저장해야 파이선에서 불러올수 있음

14. 엑셀에 자료 입력하기[ # 170814 5 write excel ]



[ Next Step ]

  ==> 가져온 데이터를 머신러닝으로 학습 시키기


[ 참고자료 ]

===================================================================================================



[ 개발환경 구성 ] 

1. 아나콘다 기준으로 설명합니다.  
  - Docker를 설치하고, 우분투를 설치하고, 우분투에서 각종 패키지(apt-get install)를 설치해도 무방합니다.
  - 아나콘다는 파이선 패키지를 쉽게 설치할수있도록 도와줍니다.


아나콘다에서 설치

phantomjs

conda install -c trent phantomjs 

conda install -c javascript phantomjs 

conda install -c javascript/label/dev phantomjs

conda install -c mutirri phantomjs 

conda install -c mutirri/label/bokeh-deps phantomjs 

conda install -c mutirri/label/all phantomjs 

conda install -c mutirri/label/selenium phantomjs

selenium

conda install -c metaperl selenium  ==> python 2.xx

conda install -c conda-forge selenium  ==> python 3.xx

beautifulsoup4

conda install -c anaconda beautifulsoup4 ==>python 4.xx

fontconfig

conda install -c anaconda fontconfig python 2.xx




[ Get 요청 ] 

# https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EC%B4%88%EC%BD%9C%EB%A6%BF

import urllib.request
import urllib.parse
API = "https://search.naver.com/search.naver"
# 매개변수를 URL 인코딩합니다. --- (※1)
values = {
"where" : "nexearch" ,
"sm" : "top_hty" ,
"where" : "nexearch" ,
"fbm" : "1" ,
"ie" : "utf8" ,
"query" : "초콜릿"
}
params = urllib.parse.urlencode(values)
# 요청 전용 URL을 생성합니다. --- (※2)
url = API + "?" + params
print("url=", url)
# 다운로드합니다. --- (※3)
data = urllib.request.urlopen(url).read()
text = data.decode("utf-8")  #euc-kr"
print(text)


[ download-png1 ] 

# 170813 2 download-png1

import urllib.request

# data를 불러올 사이트/화일
url="http://uta.pw/shodou/img/28/214.png"

# 불러운 화일을 저장할 이름
savename="test.png"

# 다운로드 (1)
mem=urllib.request.urlopen(url).read()

#파일로 저장하기 (2)
#"wb" 는 binary file(인간이 읽을수 없음)을 의미함
with open(savename,mode="wb") as f:
    f.write(mem)

print("저장되었습니다")


[ bs-usd ] 

#170813 3 bs-usd

from bs4 import BeautifulSoup
import urllib.request as req
# HTML 가져오기
url = "http://info.finance.naver.com/marketindex/"
res = req.urlopen(url)
# HTML 분석하기
soup = BeautifulSoup(res, "html.parser")
# 원하는 데이터 추출하기 --- (※1)
price = soup.select_one("div.head_info > span.value").string
print("usd/krw =", price)


[ download-bs-news2 ]

# bs-news2

from bs4 import BeautifulSoup
# 분석 대상 HTML --- (※1)
html = """
<html><body>
<div id="meigen">
  <h1>위키북스 도서</h1>
  <ul class="items">
    <li>유니티 게임 이펙트 입문</li>
    <li>스위프트로 시작하는 아이폰 앱 개발 교과서</li>
    <li>모던 웹사이트 디자인의 정석</li>
  </ul>
</div>
</body></html>
"""
# HTML 분석하기 --- (※2)
soup = BeautifulSoup(html, 'html.parser')
# 필요한 부분을 CSS 쿼리로 추출하기
# 타이틀 부분 추출하기 --- (※3)
h1 = soup.select_one("div#meigen > h1").string
print("h1 =", h1)
# 목록 부분 추출하기 --- (※4)
li_list = soup.select("div#meigen > ul.items > li")
for li in li_list:
  print("li =", li.string)



170813 6 selenium-login ]

#"로그인 버튼을 클릭합니다.") 이후 부터 정상실행 않됨

# 170813 6 selenium-login
from selenium import webdriver
USER = "**********"
PASS = "*************^"
# PhantomJS 드라이버 추출하기 --- (※1)
browser = webdriver.PhantomJS()
browser.implicitly_wait(3)
# 로그인 페이지에 접근하기 --- (※2)
url_login = "https://nid.naver.com/nidlogin.login"
browser.get(url_login)
print("로그인 페이지에 접근합니다.")
# 텍스트 박스에 아이디와 비밀번호 입력하기 --- (※3)
e = browser.find_element_by_id("id")
e.clear()
e.send_keys(USER)
e = browser.find_element_by_id("pw")
e.clear()
e.send_keys(PASS)
# 입력 양식 전송해서 로그인하기 --- (※4)
form = browser.find_element_by_css_selector("input.btn_global[type=submit]")
form.submit()
print("로그인 버튼을 클릭합니다.")
# 여기까지만 정상실행됨
# 쇼핑 페이지의 데이터 가져오기 --- (※5)
browser.get("https://order.pay.naver.com/home?tabMenu=SHOPPING")
# 쇼핑 목록 출력하기 --- (※6)
products = browser.find_elements_by_css_selector(".sub_sc h4")
print(products)
for product in products:
    print("-", product.text)


[  170813 67selenium-js ]

# 170813 67selenium-js

from selenium import webdriver
# PhantomJS 드라이버 추출하기
browser = webdriver.PhantomJS()
browser.implicitly_wait(3)
# 적당한 웹 페이지 열기
browser.get("https://google.com")
# 자바스크립트 실행하기
r = browser.execute_script("return 100 + 50")
print(r)

[# 170813 8 api-weather]
mport requests
import json
# API 키를 지정합니다. 자신의 키로 변경해서 사용해주세요. --- (※1)
apikey = "474d59dd890c4108f62f192e0c6fce01"
# 날씨를 확인할 도시 지정하기 --- (※2)
cities = ["Seoul,KR", "Tokyo,JP", "New York,US"]
# API 지정 --- (※3)
api = "http://api.openweathermap.org/data/2.5/weather?q={city}&APPID={key}"
# 켈빈 온도를 섭씨 온도로 변환하는 함수 --- (※4)
k2c = lambda k: k - 273.15
# 각 도시의 정보 추출하기 --- (※5)
for name in cities:
    # API의 URL 구성하기 --- (※6)
    url = api.format(city=name, key=apikey)
    # API에 요청을 보내 데이터 추출하기
    r = requests.get(url)
    # 결과를 JSON 형식으로 변환하기 --- (※7)
    data = json.loads(r.text)    
    # 결과 출력하기 --- (※8)
    print("+ 도시 =", data["name"])
    print("| 날씨 =", data["weather"][0]["description"])
    print("| 최저 기온 =", k2c(data["main"]["temp_min"]))
    print("| 최고 기온 =", k2c(data["main"]["temp_max"]))
    print("| 습도 =", data["main"]["humidity"])
    print("| 기압 =", data["main"]["pressure"])
    print("| 풍향 =", data["wind"]["deg"])
    print("| 풍속 =", data["wind"]["speed"])
    print("")




[# 170813 10 selenium-login]

이메일 제목읽어오기

# 170813 10 selenium-login

from selenium import webdriver
# PhantomJS 드라이버 추출하기 --- (※1)
browser = webdriver.PhantomJS()
# 3초 대기하기 --- (※2) phantumjs의 버그로 무조건 3초를 대기하고 , 이후 진행해야함
browser.implicitly_wait(3)
# 로그인 --- (※3)
browser.get("https://nid.naver.com/nidlogin.login")
# 화면을 캡처해서 저장하기 --- (※4)
element_id=browser.find_element_by_id("id") # 아이디 텍스트 입력
element_id.clear()
element_id.send_keys("****")

element_pw=browser.find_element_by_id("pw") # 비번 텍스트 입력
element_pw.clear()
element_pw.send_keys("****^")
browser.save_screenshot("website_c.png")
# 브라우저 종료하기 --- (※5)

button=browser.find_element_by_css_selector("input.btn_global[type=submit]")
button.submit()

# 메일 페이지 열기
browser.get("https://mail.naver.com/")
browser.save_screenshot("website_D.png")

#브라우져 종료
browser.quit()




[ #170814 1 xml-forecast] 
 -. 날씨 가져오기

from bs4 import BeautifulSoup 
import urllib.request #as req
import os.path
url = "http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108"
request = urllib.request.urlopen(url)
xml = request.read()
soup=BeautifulSoup(xml,"html.parser")
seoul=soup.find_all("location")[0]
datas=seoul.find_all("data")
for item in datas :
   print(item.find("wf").text)


[ # 170814 2 json-github ]


# 170814 2 json-github

import urllib.request as request
import os.path, random
import json

# JSON 데이터 내려받기 --- (※1)
url = "https://api.github.com/repositories"
savename = "repo.json"
if not os.path.exists(url):
    request.urlretrieve(url, savename)
# JSON 파일 분석하기 --- (※2)
items = json.load(open(savename, "r", encoding="utf-8"))
# 또는
# s = open(savename, "r", encoding="utf-8").read()
# items = json.loads(s)
# 출력하기 --- (※3)
for item in items:
    print(item["name"] + " - " + item["owner"]["login"])

print("--------------------------------------")

json_str=request.urlopen("https://api.github.com/repositories").read()
output=json.loads(json_str)

for item in output :
    print(item["name"])
    print(item["full_name"])
    print(item["owner"]["login"])
print()


[# EUC_KR로 저장된 CSV 파일 읽기]

import codecs
# EUC_KR로 저장된 CSV 파일 읽기
filename = "list-euckr.csv"
csv = codecs.open(filename, "r", "euc_kr").read()
# CSV을 파이썬 리스트로 변환하기
data = []
rows = csv.split("\r\n")
for row in rows:
    if row == "": continue
    cells = row.split(",")
    data.append(cells)
# 결과 출력하기
for c in data:
    print(c[1], c[2])


[# 170814 4 excel-read]

import openpyxl
book=openpyxl.load_workbook("stats_104102.xlsx")
#print(book.get_sheet_names())
#print(book.get_sheet_by_name("stats_104102")

sheet = book.worksheets[0]
for row in sheet.rows:
    for data in row:
     print(data.value,end=" ")
    print("",end="\n")

http://www.index.go.kr/potal/main/EachDtlPageDetail.do?idx_cd=1041


[ # 170814 5 write excel ]

import openpyxl

workbook=openpyxl.Workbook()
sheet=workbook.active

sheet["A1"] = "테스트 화일"
sheet["A2"] = "안녕"

sheet.merge_cells("A1:C1")
sheet["A1"].font=openpyxl.styles.Font(size=20,color="FF0000")

workbook.save("newFile.xlsx")


[ 참고자료 ]

https://www.docker.com/products/docker-toolbox  ==> docker 설치방법

https://www.data.go.kr/main.do