티스토리 뷰

 

이정인 기술사님의 파이썬 핵심함수 특강 2강의 내용이다. 

이번 2강의 내용은 html의 기본적인 구조에 대해서 알고 있으면 유리하다.  

import urllib.request
d = urllib.request.urlopen("http://www.naver.com/")

 

naver를 호출했다. 이제 본문에 해당하는 html을 data라는 키워드로 호출할 수 있게 해보자.

이때 이 html의 인코딩 방식이 무엇인지 알려주어야 한다. 보편적으로는 utf-8. 

data = d.read()
data = data.decode("utf-8")

for문으로 header에 있는 정보들을 반복해서 출력한다. 

status=d.getheaders()
for s in status:
	print(s)

네이버 헤더에는 이런 정보들이 있나보다 

다음으로 우리가 서버에 요청해서 받은 것이 정상적인 응답인지 확인해보자. 200이 아닌 다른 숫자가 나오면 모두 오류이므로, if문을 사용해서 검증한다. 

print(d.status)
if d.status == 200:
	print(d.read().decode("utf-8")

 

더보기

※참고 

앞에서 data = d.read()로 끝까지 다 읽었기 때문에 다시 data=d.read()를 호출하면 더 읽을 수 없다는 뜻의 메시지가 출력된다. 

 


웹페이지 html 데이터를 그대로 가져와봄으로써 크롤링의 가장 기초적인 부분을 살펴보았다.

그런데 만약 로그인 등 별도 권한이 있어야 접속할 수 있는 페이지를 크롤링하려면 어떻게 해야 할까? 

몇 가지 방법이 있는데 일단 Beautiful Soup에 대해서 알아보고 넘어가도록 한다.  

from bs4 import Beautifulsoup
bs = Beautifulsoup(html)

물론 bs를 이렇게 가져오기 전에 html이 정의되어 있어야 하긴 함(예제에서는 임의의 html 태그가 html=""로 연결되어 있지만 생략하겠다).

 

Beautiful Soup는 html을 파싱할 수 있게 하는 라이브러리이므로, html 속에 있는 p 태그를 전부 찾아볼 수도 있다.

print(bs.find("p"))

모든 p 태그를 찾아서 list 형태로 반환하려면 이렇게 하자. 

print(bs.find_all("p"))

이렇게 작성하면 정렬이 center로 되어 있는 p태그만 찾아 줄 것이다. 

print(bs.find("p", align="center"))

 

align 자리에 width, class_를 넣어서 이것저것 골라내볼 수 있다. 

 

더보기

※참고 

class는 파이썬에서 예약어로 지정된 식별자이므로 html 태그에서 class를 골라내기 위해서는 class_와 같이 언더바를 붙여주어야 한다. 

 

예약어와 식별자 개념 복습하기☞ ehpub.co.kr/3-python%EC%9D%98-%EC%98%88%EC%95%BD%EC%96%B4keyword%EC%99%80-%EC%8B%9D%EB%B3%84%EC%9E%90identifiers/

 

body 안에서 img 태그가 쓰인 곳을 모두 골라내 보자. 

bodytag = bs.find("body")
list1 = bodytag.find_all(["p", "img"])

범위를 지정한 다음에 list1 안에서 for문으로 돌면서 tag를 모두 골라내오면 된다. 

for tag in list1:
	print(tag)

마지막으로 body tag 안에 있는 text만 꺼내오는 method인 get_text를 알아보자. 

print(bodytag.get_text())

결과물은 너무 기니까 대충 잘랐다.