public bigdata

파이썬을 이용한 웹 스크래핑(edwith 강의) chapter3 웹서비스 본문

Python programming/웹 크롤링

파이썬을 이용한 웹 스크래핑(edwith 강의) chapter3 웹서비스

public bigdata 2019. 12. 2. 23:34
1강, 2강
## 1강
# 그냥 개념만 있어서 ... 

## 2강 xml
# XML, JSON 등의 마크업 언어가 있다.
# XML은 "<>"가 있다는 점에서 HTML과 매우 유사하지만
# 다른 점은 A, P, H1 등의 태그 같은 형식이 아니여도 된다
# 원하는 대로 정할 수 있다.

# XML은 부모 자식 관계를 가진 트리 구조이다.

# XML은 eXtensible Markup Language의 약자로, 
# 다음과 같은 계층 구조로 이루어져있습니다. 
# HTML과 비슷하지만 원하는 이름의 태그를 만들 수 있다는 
# 특징이 있고, HTML보다 문법 오류를 더 엄격하게 다룹니다.

import xml.etree.ElementTree as ET

input = '''
<stuff>
    <users>
        <user x="2">
            <id>001</id>
            <name>Chuck</name>
        </user>
        <user x="7">
            <id>009</id>
            <name>Brent</name>
        </user>
    </users>
</stuff>'''

stuff = ET.fromstring(input) # xml 스트링을 불러오라는 뜻 같다.
lst = stuff.findall('users/user') # 해당 스트링에서 users/user에 해당하는 태그 검색
print('User count:', len(lst)) # 2개가 검색될 것이고

for item in lst: # stuff 객체로 부터 검색된 2개의 Element를 반환 받아 loop 한다.
    print('Name', item.find('name').text)
    print('Id', item.find('id').text) # <> </> 사이에 있는 건 text로 받환 받고
    print('Attribute', item.get("x")) # <불라불라 x='dsds> 이런식으로 된건 get으로 반환 받는듯 하다.
3강
## 3강 xml 스키마
import xml.etree.ElementTree as ET
data = '''<person>
  <name>Chuck</name>
  <phone type="intl">
     +1 734 303 4456
   </phone>
   <email hide="yes"/>
</person>'''


tree = ET.fromstring(data) # data에 들어있는 xml에 문법오류가 있다면 에러가 발생한다.
print('Name:',tree.find('name').text)
print('Attr:',tree.find('email').get('hide'))

# Name: Chuck
# Attr: yes

import xml.etree.ElementTree as ET
input = '''<stuff>
    <users>
        <user x="2">
            <id>001</id>
            <name>Chuck</name>
        </user>
        <user x="7">
            <id>009</id>
            <name>Brent</name>
        </user>
    </users>
</stuff>'''

stuff = ET.fromstring(input)
lst = stuff.findall('users/user')
print('User count:', len(lst))
for item in lst:
    print('Name', item.find('name').text)
    print('Id', item.find('id').text)
    print('Attribute', item.get("x"))

#User count: 2
#Name Chuck
#Id 001
#Attribute 2
#Name Brent
#Id 009
#Attribute 7
4강
## 4강 json
## 또 다른 직렬화 형식인 json
## json은 javascript로 부터 만들어졌다.


# JSON은 XML보다 더 자주 사용되는 데이터 포맷입니다. 
# 이 코드는 이전 시간에 XML로 실행했던 것과 정확히 같은 내용의 코드입니다. 
# 데이터가 XML 형식에서 JSON 형식으로 바뀐 것을 제외하면 말입니다.
# JSON은 파이썬에서의 딕셔너리와 굉장히 비슷하기 때문에 데이터를 읽어온 후 
# 딕셔너리로 접근할 수 있습니다.
import json
data = '''{
  "name" : "Chuck",
  "phone" : {
    "type" : "intl",
    "number" : "+1 734 303 4456"
   },
   "email" : {
     "hide" : "yes"
   }
}'''

# 이와 같이 여러 개의 데이터를 읽어올 경우 리스트에 딕셔너리가 포함된 형태로 읽어집니다.
info = json.loads(data) # json을 읽어와 딕셔너리 구조로 저장한다.
print('Name:',info["name"])
print('Hide:',info["email"]["hide"])

#Name: Chuck
#Hide: yes


import json
input = '''[
  { "id" : "001",
    "x" : "2",
    "name" : "Chuck"
  } ,
  { "id" : "009",
    "x" : "7",
    "name" : "Chuck"
  }
]'''

info = json.loads(input)
print(info)
print('User count:', len(info))
for item in info: # 리스트에 2개의 요소들로 나뉘어져 저장되어 있으므로 for문으로 출력한다.
    print('Name', item['name'])
    print('Id', item['id'])
    print('Attribute', item['x'])

# [{'id': '001', 'x': '2', 'name': 'Chuck'}, {'id': '009', 'x': '7', 'name': 'Chuck'}]
# User count: 2
# Name Chuck
# Id 001
# Attribute 2
# Name Chuck
# Id 009
# Attribute 7
5강
## 5강 SOA : 서비스 지향 접근 방법(Service Oriented Approach)
# Service Oriented Approach

# 서비스 지향 아키텍처(Service Oriented Architecture, 
# 약칭 SOA 「에스오에이」혹은 「소아」로 발음)란 대규모 컴퓨터 시스템을 
# 구축할 때의 개념으로 업무상에 일 처리에 해당하는 소프트웨어 기능을 
# 서비스로 판단하여 그 서비스를 네트워크상에 연동하여 시스템 전체를 구축해 나가는 방법론이다. 

# * 출처 : 위키백과, '서비스 지향 아키텍처'
6강
## 지금은 무료 api가 막혀서 실행이 안된다. ##
## 요번 강의의 코드들은 urlib 그리고 네트워크 관련 이해가 없어서 그런지
## 이해가 안된다. 그냥 이런게 있다. 수준으로 이해하고 넘어가자
## 6강 GeoJSON API

import urllib.request, urllib.parse, urllib.error
import json

serviceurl = 'http://maps.googleapis.com/maps/api/geocode/json?'

while True:
    address = "seoul"
    if len(address) < 1: break

    url = serviceurl + urllib.parse.urlencode({'address': address})

    print('Retrieving', url)
    uh = urllib.request.urlopen(url)
    data = uh.read().decode()
    print('Retrieved', len(data), 'characters')

    try:
        js = json.loads(data)
    except:
        js = None

    if not js or 'status' not in js or js['status'] != 'OK':
        print('==== Failure To Retrieve ====')
        print(data)
        continue

    lat = js["results"][0]["geometry"]["location"]["lat"]
    lng = js["results"][0]["geometry"]["location"]["lng"]
    print('lat', lat, 'lng', lng)
    location = js['results'][0]['formatted_address']
    print(location)