인공지능/파이썬

파이썬(Python) - 스크래핑 ② 웹 스크래핑/크롤링 연습, wordcloud사용

해피밀세트 2020. 3. 25. 20:23
반응형

 

 

 

기본 용어

 

http(hyper text transfer protocol)

  • hyper text 마우스로 클릭하면 다른페이지로 이동하는 기능
  • http 다음에 나올 html 작성되어 있는 hyper text 전송하기 위한 프로토콜(규약, 약속)

URL(Uniform Resource Locator)

  • 인터넷 주소

HTML(Hyper Text Markup Language)

  • 웹페이지를 작성하는 문법 언어
  • F12(개발자 도구)눌러서 볼수 있다.

웹 브라우저(web browser)

  • html 보기 좋게 출력하는 응용 소프트웨어

웹 스크래핑 연습

 

BeautifulSoup

  • 데이터를 추출하는데 필요한 기능이 들어 있는 라이브러리, 파싱(parsing)라이브러리 라고도 한다.
  • 파싱은 받아온 데이터에서 필요한 내용만 추출하는 것을 의미한다.
  • from bs4 import BeautifulSoup

happymeal.html
0.00MB

# html 파일 읽어들이고 BeautifulSoup객체출력

with open("C:/data/happymeal.html",encoding='UTF8') as html:
    soup = BeautifulSoup(html, "html.parser")
soup

# title 태그의 문자열 뽑아내기

soup.find('title').string
soup.find('title').get_text()
soup.find('title').text

# body 태그 안에 있는 문자열 뽑아내기
# body 안에는 여러개의 태그가 모여있으므로 get_text()를 써야한다.

soup.find('body').string
soup.find('body').get_text()
soup.find('body').get_text(strip=True)

# 중간에 안나오는 문자열도 있음

for i in soup.find('body'):
    print(i.string)

# get_text()를 사용하려면 find_all()을 같이 써주자
# find_all()은 리스트 형태로 가지고 온다.

for i in soup.find_all('body'):
    print(i.get_text())

 

for i in soup.findAll('body'):
    print(i.get_text())

 

for i in soup.find_all('body'):
    print(i.text)

# p태그의 내용 출력

soup.find('p')

# p태그를 가진 모든 내용 출력

soup.find_all('p')
soup.findAll('p')

# a태그의 내용 출력

soup.find('a')
x = soup.find('a')
x

# 속성값  'href'값 출력

x.attrs['href']
x.string

# a태그의 모든 내용 출력

soup.find_all('a')
soup.findAll('a')

# a태그의 속성값  'href'값 출력

soup.findAll('a')[0].attrs['href']
soup.findAll('a')[1].attrs['href']

url=[]
cnt = 0
for i in soup.findAll('a'):
    cnt += 1
    if cnt < 3 :
        url.append(i.attrs['href'])
url

# 특정한 태그를 찾을때 그 태그의 class나 id를 기준을 찾는게 좋다.
# 두번째 인수는 딕셔너리 모양으로 만들자

soup.find('a',{'class':'happy'}).attrs['href']
soup.find('a',{'class':'google'}).attrs['href']

soup.find('a',{'class':'happy'}).string

soup.find('a',{'class':'google'})

# 특정한 태그를 찾을때 그 태그의 class나 id를 기준을 찾는게 좋다. 

soup.find('a',{'id':'meal'}).attrs['href']
soup.find('a',{'id':'link'}).attrs['href']

 


웹 크롤링 연습

 

urllib

  • 파이썬에서 인터넷 데이터를 받아 오는 기능들이 들어있는 라이브러리
  • 데이터를 받아오는 것을 크롤링(crawling)
  • from urllib.request import urlopen
    import urllib.request as req

 

1. 이미지 저장하기

 

1) 이미지의 주소를 복사한다.

 

2) req.urlretrieve(이미지주소, 저장경로)로 이미지를 저장한다.

   img_url = "https://t1.daumcdn.net/cfile/tistory/9977D14D5DB7FF3D0B"
   req.urlretrieve(img_url, "C:/data/shrimp.jpg") 

 

3) 저장 확인

 

 

 

2. 블로그에서 글 제목 뽑아내기

 

1) 블로그에 url에 접속BeautifulSoup객체 만들기

html = urlopen("https://truman.tistory.com/")
soup = BeautifulSoup(html, "html.parser")
soup

 

2) 태그를 따라서 들어가기

ul = soup.find("ul",{"class":"list_category"})
ulli = ul.findAll('li')
li

 

 

3) 글 제목 태그('strong')에서 문자만 출력하기

for i in li:
    a_tag = i.find('strong').text
    print(a_tag)

 

 

 

3. 글 내용 WorldCloud로 만들기

 

1) 페이지 url 오픈BeautifulSoup 객체 생성
html = urlopen("https://truman.tistory.com/74?category=833561")
soup = BeautifulSoup(html,"html.parser")
soup

 

 

2) 페이지에서 글 내용만 뽑기

content = []
for i in soup.findAll('div',{'class':'tt_article_useless_p_margin'}):
    content.append(i.get_text(strip = True))
content

 

 

3) 문자열 정제 작업

txt = ''
delete = '[/.|:|-|\d|(|)|①|②|③|-|,|a-zA-Z|{|}|\n|=|;|·]'
for i in content:
    txt = txt+ ' ' +re.sub(delete,'',i)
txt

 

 

4) txt내용을 WordCloud로 만들기
from wordcloud import WordCloud, STOPWORDS

wordcloud = WordCloud(font_path = 'C:/windows/fonts/malgun.ttf',
                                 stopwords = STOPWORDS,
                                 background_color = 'black',
                                 width = 1500, height = 1200).generate(txt)
plt.figure(figsize=(10,10))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

반응형