마케팅/데이터분석(파이썬)

(파이썬/python) 모두를 위한 프로그래밍 : 파이썬 챕터 12 / HTTP

마케터 조쉬 2021. 11. 24. 01:56

파이썬에서 소켓 만들기

파이썬에서는 다음과 같은 방법으로 소켓을 굉장히 쉽게 만들 수 있습니다.

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org', 80))

먼저 socket 모듈을 import하고,

인터넷에 연결되는 소켓을 연속된 문자의 흐름인 스트림 방식으로 만들어줍니다.

그리고 그 소켓에 data.pr4e.org라는 호스트에 80이라는 포트로 연결을 했습니다.

 

간단한 코드 3줄로 말이죠.

 

간단한 웹 브라우저

import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org', 80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0₩r₩n₩r₩n'.encode()
mysock.send(cmd)

while True:
    data = mysock.recv(512)
    if (len(data) < 1):
        break
    print(data.decode(),end=")
mysock.close()

 

ASCII

아스키 코드는 1byte로 영문자와 숫자, 그리고 일부 특수문자를 표현할 수 있습니다.

ord() 함수를 사용하면 다음과 같이 각각의 문자에 대한 아스키 코드 값을 확인할 수 있습니다.

print(ord('H'))
#72
print(ord('e'))
#101
print(ord('₩n'))
#10

 

유니코드(Unicode)

유니코드 체계는 이미 몇 십억개의 문자를 포함하고 있으며, 새로운 문자 몇 십억개를 더 저장할 여력이 있습니다.

유니코드를 압축하는 UTF-8, UTF-16, UTF-32 등 다양한 방법이 있지만 가장 실용적인 방법은 UTF-8을 사용하는 것입니다.

예전 파이썬 2.X 버전에서는 유니코드로 나타내고 싶으면 별도의 문자열 앞에 'u'라는 문자를 넣어주어야 했습니다.

 

그런데 파이썬 3.X 버전부터는 기본적으로 문자열이 유니코드로 저장됩니다.

#Python 2.7.10
x = '이광춘'
print(type(x))
#<type 'str'>
x = u'이광춘'
print(type(x))
#<type 'unicode'>

#Python 3.5.1
x = '이광춘'
print(type(x))
#<type 'str'>
x = u'이광춘'
print(type(x))
#<type 'str'>

 

하지만, 파이썬 내부에서 데이터를 사용하는 것이 아니라 네트워크를 통해 데이터를 주고 받을 때는 다른 형태로 데이터를 변환해야하는 경우도 있습니다.

다음 코드에서 'GET http://data.pr4e.org/romeo.txt HTTP/1.0₩r₩n₩r₩n' 문자열은 유니코드입니다. 따라서 데이터를 전송하기 전에 UTF-8 byte 방식으로 인코딩을 해주어야 하는데, 그럴 때 사용하는 메소드가 encode() 입니다.

 

서버에서 받은 데이터를 data라는 변수에 저장합니다. 그리고 현재 이 데이터는 디코딩이 안되어 있기 때문에 decode() 메소드를 사용해 디코딩하여 출력하면 유니코드 형태로 우리에게 보여지게 됩니다.

 

urllib 라이브러리

urllib을 활용하면 아주 간단하게 웹 브라우저를 만들 수 있습니다.

이전에 여러 줄에 걸쳐 만들었던 웹 브라우저가 urllib 라이브러리를 활용하면 이렇게 4줄 만에 완성이 됩니다.

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

fhand = urllib.request.urlopen('http://data.pr4e.org/romeo.txt')
for line in fhand:
    print(line.decode().strip())

이것을 응용하면 이전에 파일에서 데이터를 읽어왔던 방식으로 인터넷에서 데이터를 읽어올 수 있습니다.

 

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

fhand = urllib.request.urlopen('http://data.pr4e.org/romeo.txt')

counts = dict()
for line in fhand:
    words = line.decode().split()
    for word in words:
        counts[word] = counts.get(word, 0) + 1
print(counts)

 

BeautifulSoup을 활용한 웹 스크래핑

urllib과 더불어 사용하면 다음과 같이 원하는 웹 페이지에 존재하는 모든 링크의 URL을 출력할 수 있습니다.

import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup

url = input('Enter - ')
html = urlib.request.urlopen(url).read()
soup = BeautifulSoup(html, 'html.parser')

#Retrieve all of the anchor tags
tags = soup('a')
for tag in tags:
    print(tag.get('href', None))