파이썬

[장고&파이썬웹] urllib.request 모듈 예제 재작성

mcdn 2020. 9. 6. 17:38
반응형

장고와 함께하는 파이썬 웹 프로그래밍 책 pg 330 예제 참고 함 

import requests
from bs4 import BeautifulSoup

def parse_image(data):
    soup = BeautifulSoup(data, 'html.parser')
    imgTagList = soup.find_all('img')
    dataSet = set(x.attrs['src'] for x in imgTagList)
    return dataSet

def main():
    url = "http://www.google.co.kr"

    res = requests.get(url)
    charset = res.encoding
    data = res.content.decode(charset)
    dataSet = parse_image(data)
    print("\n>>> Fetch images from", url)
    print('\n'.join(sorted(dataSet)))

if __name__ == '__main__':
    main()

결과

>>> Fetch images from http://www.google.co.kr
/images/branding/googlelogo/1x/googlelogo_white_background_color_272x92dp.png
/textinputassistant/tia.png

 

다른 쉬운 코드로 먼저 참고하면 

import re
from urllib import urlopen

from bs4 import BeautifulSoup

soup = BeautifulSoup(urlopen("https://en.wikipedia.org/wiki/Kevin_Bacon"), "html.parser")

for link in soup.findAll("a"):
    print link

soup = BeautifulSoup( urlopen(url), "html.parser") 은 requests(re) 라이브러리에서 웹 요청을 받은 데이터의 html을 스크롤 해준다. 

 

아까 적용한 변수 soup에 함수 findall를 사용하여 <a>라는 태그를 모두 가져와서 리스트를 구성하고 for문을 돌려 하나하나 프린트하게 한다. 

 

 

def parse_image(data):
    soup = BeautifulSoup(data, 'html.parser')
    imgTagList = soup.find_all('img')
    dataSet = set(x.attrs['src'] for x in imgTagList)
    return dataSet

처음 코드의 첫번째 부분인 parse_image(data)에서는 data라는 url을 메인 함수에서 받아오기때문에 아까와 같은 구조인 soup 변수가 만들어진다. 

더보기

soup = BeautifulSoup(data, "html.parser")

다음으로 imgTagList에는 리스트를 저장한다. 아까는 <a>태그 였다면 여기는 img태그를 찾는다. 

더보기

imgTagList = soup.find_all('img')

 

import re
from urllib import urlopen

from bs4 import BeautifulSoup

soup = BeautifulSoup(urlopen("https://en.wikipedia.org/wiki/Kevin_Bacon"), "html.parser")

for link in soup.findAll("a"):
    if 'href' in link.attrs: # 내부에 있는 항목들을 리스트로 가져옵니다 ex) {u'href': u'//www.wikimediafoundation.org/'}
        print (link.attrs['href'])

또 다른 코드를 참고해서 attrs기능에 대해 알아보자.

attrs는 <

<a href="/wiki/Edmund_Bacon_(architect)" title="Edmund Bacon (architect)">Edmund Bacon</a>

<a href="/wiki/Michael_Bacon_(musician)" title="Michael Bacon (musician)">Michael Bacon</a>

...

같이 <a>태그 안에 있는 href와 title, text를 리스트로 만들고 href만 골라오는 기능을 한다. 

 

def parse_image(data):
    soup = BeautifulSoup(data, 'html.parser')
    imgTagList = soup.find_all('img')
    dataSet = set(x.attrs['src'] for x in imgTagList)
    return dataSet

따라서 세번째 변수 dataSet을 만들때 x.attrs는 imgTaglist의 요소인 x에서 src가 있는 애를 또 따로 가져와 set자료형으로 만든 것이다. 

더보기

for x in imgTaglist : 

    dataSet = set(x.attrs['src'])

이나 마찬가지이다. 

 

더보기
<img class="gb_La gbii" src="https://lh3.googleusercontent.com/ogw/ADGmqu_9a0jGzL_nQ8X4OqI8X17RQaKz2gedxxjnq_Q0=s32-c-mo" srcset="https://lh3.googleusercontent.com/ogw/ADGmqu_9a0jGzL_nQ8X4OqI8X17RQaKz2gedxxjnq_Q0=s32-c-mo 1x, https://lh3.googleusercontent.com/ogw/ADGmqu_9a0jGzL_nQ8X4OqI8X17RQaKz2gedxxjnq_Q0=s64-c-mo 2x " alt="" aria-hidden="true" data-noaft="" data-iml="1599380160979" data-atf="1">

img 태그 안에 있는 src = 을 가져와서 set으로 만든다. 

 

 

 

def main():
    url = "http://www.google.co.kr"

    res = requests.get(url)
    charset = res.encoding
    data = res.content.decode(charset)
    dataSet = parse_image(data)
    print("\n>>> Fetch images from", url)
    print('\n'.join(sorted(dataSet)))

 다음 코드는 main()함수다. 

url 을 설정하고 

res = requests.get(url)로 서버에 요청한다. 

res.status_code 를 치면 200이라고 정상 작동 신호를, res.text를 확인하면 html문서파일 전체가 나온다. 

더보기

res = requests.get(url)

웹브라우져에서 티스토리를 접속한 것과 똑같은 이야기이다. www.tistory.com 이라는 주소로 GET 요청(request)를 보냈고 서버에서는 그 요청을 받아 뭔가를 처리한 후 요청자인 나에게 응답(response)를 줬다. 우선 그 응답은 200 상태코드와 함께 왔다. 이는 티스토리 서버에서 잘 처리되어서 정상적인 응답을 보내줬다는 OK 싸인을 의미한다. 그리고 응답의 내용은? 보시다시피 HTML 코드.

출처: https://dgkim5360.tistory.com/entry/python-requests [개발새발로그]

 

Python requests 모듈 간단 정리

Python에서 HTTP 요청을 보내는 모듈인 requests를 간단하게 정리하고자 한다. 0. 기본적인 사용 방법 import requests URL = 'http://www.tistory.com' response = requests.get(URL) response.status_code respo..

dgkim5360.tistory.com

다음 코드인 charset = res.encoding을 확인하면 

더보기

Response Content
>>> r = requests.get('https://api.github.com/events')
>>> r.text # 텍스트 형식으로 내용 출력
>>> r.encoding # 인코딩 확인
'utf-8'
>>> r.encoding = 'ISO-8859-1' # 인코딩

즉 utf -8 인지 등 인코딩을 확인해준다. 

문자 인코딩영어: character encoding), 줄여서 인코딩은 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것을 말한다. 위키백과

 

 

def main():
    url = "http://www.google.co.kr"

    res = requests.get(url)
    charset = res.encoding
    print(res)
    print(charset)
    print(res.content)
    #data = res.content.decode(charset)
    #dataSet = parse_image(res)
    print("\n>>> Fetch images from", url)
    #print('\n'.join(sorted(dataSet)))

res

charset

res.content

내용 확인하려고 print()구문 썼더니 

 

res = Response[200]

charset = EUC-KR

res.content = html 전체 

 

디코딩 왜 하는거지?

해서 

더보기

dataSet = parse_image(res.content)

로 바꿔봤는데 엥 디코딩 안해도 잘 나온다. 

 

import requests
from bs4 import BeautifulSoup

def parse_image(data):
    soup = BeautifulSoup(data, 'html.parser')
    imgTagList = soup.find_all('img')
    dataSet = set(x.attrs['src'] for x in imgTagList)
    return dataSet

def main():
    url = "http://www.google.co.kr"

    res = requests.get(url)
    charset = res.encoding
    data = res.content.decode(charset)
    dataSet = parse_image(data)
    print("\n>>> Fetch images from", url)
    print('\n'.join(sorted(dataSet)))

if __name__ == '__main__':
    main()

 

반응형