본문 바로가기

python

30-1. 웹크롤링[텍스트]

728x90
반응형

웹스크롤링을 하기 위해서 사용할 파이썬 모듈?

 "beautiful soup 모듈"
 

웬스크롤링을 하는 이유? "데이터 수집을 위해서"

 

데이터를 수집하는 방법:

1. 웹스크롤링 기술 이용

2. 딥러닝 기술을 이용

 

html 이란?

 Hyper Text Markup Language 약자이고

 여러개의 태그(Tag) 연결해서 모아놓은 문서

 

 

문제351.

아래의 간단한 html 문서를 만들어 보시오 !

 

<html><head><title> 재혁이의 오늘 일정 </title></head>

<body>

<p class="title"> 재혁이는 오늘 결석을 하셨습니다. </p>

</body>

</html>

 

 

저장시 확장자 html

 

익스플로러 창에서 에프12 누르면 과정 보임

 


 

문제353. 위의 글씨에 밑줄을 그어보시오

 

<html><head><title> 재혁이의 오늘 일정 </title></head>

<body>

<p class="title"><u><b> 재혁이는 오늘 결석을 하셨습니다.</b></u> </p>

</body>

</html>

<p class="title"><b> 재혁이는 오늘 결석을 하셨습니다.</b> </p>

-------------------------

밑에 넣으면 나오지요~

<b> 볼드로, 굵은글씨체 !

<u> 밑줄 !

b,u 순서 바뀌어도 상관없음

 

 

 

 

문제354. 위의 글씨체를 이탤릭체로 변경하시오(기울기 주기)

 

<html><head><title> 재혁이의 오늘 일정 </title></head>

<body>

<p class="title"><u><b><i> 재혁이는 오늘 결석을 하셨습니다.</i></b></u> </p>

</body>

</html>


 

 

문제355.

위의 글씨체를 색깔을 파란색으로 변경하시오

 

<html><head><title> 재혁이의 오늘 일정 </title></head>

<body text="blue">

<p class="title"><u><b><i> 재혁이는 오늘 결석을 하셨습니다.</i></b></u> </p>

</body>

</html>

 


 

 

 

문제356.

p tag 추가해서 제목과 내용을 나누시오

 

<html><head><title> 재혁이의 오늘 일정 </title></head>

<body text="blue">

<p class="title"><u><b><i> 재혁이는 오늘 결석을 하셨습니다.</i></b></u> </p>

 

<p class="content"> 오늘 나는 강남의 더킹 미용실에 갔다. 커트는 2만원,

파마는 10만원,

                    파마를 하고 싶었지만 돈이 없었다.

                    그래서 커트로 머리를 올렸다 </p>

 

</body>

</html>

 

 

문제357.

위의 html 문서에 링크를 거시오!

 

 

<html><head><title> 재혁이의 오늘 일정 </title></head>

<body text="blue">

<p class="title"><u><b><i> 재혁이는 오늘 결석을 하셨습니다.</i></b></u> </p>

 

<p class="content"> 오늘 나는 강남의 더킹 미용실에 갔다. 커트는 2만원, 파마는 10만원,

                    파마를 하고 싶었지만 돈이 없었다.

                    그래서 커트로 머리를 올렸다

<a href="http://cafe.daum.net/oracleoracle"class="cafe1"

id="link1"> 다음카페 </a> </p>

 

</body>

</html>

 

 

에프12 눌러서 소스봐도 되고,

마우스오른쪽버튼->소스보기

 


 

 

 

문제358.

beautiful soup 모듈을 이용해서 a.html 문서의 title 검색하시오


아나콘다 프롬포트 열고

conda install bs4

 

이제 스파이더 에다가

from bs4 import BeautifulSoup

with open("d:\\jh.html") as a:

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

 

print(soup.title)   


 

안되는 사람들은

with open("d:\\jh.html",encoding="UTF-8") as a:

 

parser : 사람의 언어를 기계어로 바꿨다.

 

 


 

문제359.

위의 결과에서 html 코드는 나오지않고

텍스트만 출력되게 하시오

 

from bs4 import BeautifulSoup

with open("d:\\jh.html") as a:

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

 

print(soup.title.string)

           

 



 

 

문제360.

a.html 문서에서 p 태그에 대한 html 검색하시오

 

from bs4 import BeautifulSoup

with open("d:\\jh.html") as a:

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

print(soup.find('p'))

 


  

현재 html 내용을 보면 p 태그는 2개다

 

 

위의 p태그만 출력된다.

 

 

 

 

문제361.

a.html 문서에서 p 태그에 대한 html 모두 검색하시오

 

from bs4 import BeautifulSoup

with open("d:\\jh.html") as a:

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

print(soup.find_all('p'))

 


 

***soup 프린트 하면  htmp 모두 출력된다

 

 

문제362.

a.html 문서에서 a 태그 대한 html 모두 검색하시오 !

 

from bs4 import BeautifulSoup

with open("d:\\jh.html") as a:

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

print(soup.find_all('a'))

 




 

문제363.

jh.html 문서에서 a 태그에 href 링크의 url 긁어오시오

 

from bs4 import BeautifulSoup

with open("d:\\jh.html") as v:

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

#print(soup.find_all('a'))

 

for i in soup.find_all('a'):

    #print(i)

    print(i.get('href'))

 

 

 

 

문제364.

jh.html 문서에서 html 소스말고 text 출력하시오

 

from bs4 import BeautifulSoup

with open("d:\\jh.html") as v:

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

print(soup.get_text())

 


 

문제365. 위의 텍스트를 줄로 나오게 하시오

 

from bs4 import BeautifulSoup

with open("d:\\jh.html") as a:

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

print(soup.get_text(" ",strip=True))


 

 

문제366.

ecologicalpyramid.html 문서에서 text 출력하시오

 

from bs4 import BeautifulSoup

with open("d://ecologicalpyramid.html") as a:

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

print(soup.get_text(" ",strip=True))

   


 

 

 

 

 

문제367.

ecologicalpyramid.html 문서에서 number 클라스에 있는

모든 텍스트를 가져오시오

 

from bs4 import BeautifulSoup

with open("d://ecologicalpyramid.html") as a:

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

print(soup.find_all(class_="number"))

   

 

 

from bs4 import BeautifulSoup

with open("d://ecologicalpyramid.html") as a:

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

result=soup.find_all(class_="number")

 

for i in result:

    print(i.get_text())

 



 

문제368.

위의 결과에서 숫자 1000 가져오시오

 

 

from bs4 import BeautifulSoup

with open("d://ecologicalpyramid.html") as a:

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

result=soup.find_all(class_="number")

 

for i in result:

    if i.get_text()=='1000':

        print(i.get_text())

 

 

또는

 

from bs4 import BeautifulSoup

with open("d://ecologicalpyramid.html") as a:

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

result=soup.find_all(class_="number")

print(result)

* 프린트 해서 리스트를 보면, 1000 들어있는 클래스 위치를 확인한다

  result[2]==1000

 

정보를 이용해서

 

from bs4 import BeautifulSoup

with open("d://ecologicalpyramid.html") as a:

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

result=soup.find_all(class_="number")

print(result[2].get_text())

 

 

 

문제369.

ebs 레이디버그 시청자 게시판의 html 문서 전체를 스크롤링 하는

함수를 작성하시오!

http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&hmpMnuId=106

 

 

import urllib.request

from bs4 import BeautifulSoup

 

def ebs_scroll():

   

    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&hmpMnuId=106"

   

    url=urllib.request.Request(list_url)

    result=urllib.request.urlopen(url).read().decode("utf-8")

    return result

 

print(ebs_scroll())

 

 ※설명:

링크를 list_url 담아서,

request

Request

 

urllib.request.urlopen(url).read().decode("utf-8")

-> ebs url html 문서를 utf-8 decode(컴퓨터언어화)해주세요(요청!)

 

 

 

 

문제370(점심시간문제)

위의 html 문서를 BeautifulSoup 모듈로 파싱을 하고

html 문서중에서 텍스트만 가져와서 출력하시오

 

import urllib.request

  #print(url)

from bs4 import BeautifulSoup

 

def ebs_scroll():

   

    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&hmpMnuId=106"

   

    url=urllib.request.Request(list_url)

    result=urllib.request.urlopen(url).read().decode("utf-8")

   

    soup=BeautifulSoup(result,'html.parser')

    print(soup.get_text())

   

ebs_scroll()

   


 

 

 

con 써서 텍스트만 뽑기

import urllib.request

  #print(url)

from bs4 import BeautifulSoup

 

def ebs_scroll():

   

    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&hmpMnuId=106"

   

    url=urllib.request.Request(list_url)

    result=urllib.request.urlopen(url).read().decode("utf-8")

   

    soup=BeautifulSoup(result,'html.parser')

    txt=soup.find_all(class_="con")

    return txt

 

a=ebs_scroll()

for i in a:

    print(i.get_text(" ",strip=True))

 

 


 

 

 

문제371.

ebs html 문서 중에서 p 태그에 대한 부분만 프린트 하시오 !

 

import urllib.request

  #print(url)

from bs4 import BeautifulSoup

 

def ebs_scroll():

   

    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&hmpMnuId=106"

   

    url=urllib.request.Request(list_url)

    result=urllib.request.urlopen(url).read().decode("utf-8")

   

    soup=BeautifulSoup(result,'html.parser')

    txt=soup.find_all("p")

    print(txt)

ebs_scroll()

 

 


 

문제372.

위의 p태그 중에 class con 해당하는 부분만 출력하시오

 

import urllib.request

  #print(url)

from bs4 import BeautifulSoup

 

def ebs_scroll():

   

    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&hmpMnuId=106"

   

    url=urllib.request.Request(list_url)

    result=urllib.request.urlopen(url).read().decode("utf-8")

   

    soup=BeautifulSoup(result,'html.parser')

    txt=soup.find_all(class_="con")

    print(txt)

ebs_scroll()

 

***con 텍스트 부분이다

 

 

문제373.

위에서 결과에서 html 말고 텍스트만 가져오시오 !

 

레이디버그 url 크롬에서 열고 에프12 누르면 개발자도구 열림

 


 

상단 왼쪽 화살표 누름.(파란색으로 변함)

 

그리고 원하는 텍스트에 커서 갖다대고

누르면

오른쪽 소스창에 코드위치 찾아줌

 

import urllib.request

  #print(url)

from bs4 import BeautifulSoup

 

 

def ebs_scroll():

   

    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&hmpMnuId=106"

   

    url=urllib.request.Request(list_url)

    result=urllib.request.urlopen(url).read().decode("utf-8")

   

    soup=BeautifulSoup(result,'html.parser')

    result2=soup.find_all(class_="con")

   

    for i in result2:

        print(i.get_text())

   

    #print(txt)

ebs_scroll()

 



 

문제374. 위의 텍스트를 깔끔하고 예쁘게 출력되게 하시오

 

import urllib.request

  #print(url)

from bs4 import BeautifulSoup

 

 

def ebs_scroll():

   

    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&hmpMnuId=106"

   

    url=urllib.request.Request(list_url)

    result=urllib.request.urlopen(url).read().decode("utf-8")

   

    soup=BeautifulSoup(result,'html.parser')

    result2=soup.find_all(class_="con")

   

    for i in result2:

        print(i.get_text().strip())

   

    #print(txt)

ebs_scroll()

 


 

 

문제375.

위의 게시판의 글들을 하나의 리스트에 하나 하나의 요소로 담으시오

import urllib.request

  #print(url)

from bs4 import BeautifulSoup

 

 

def ebs_scroll():

   

    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&hmpMnuId=106"

   

    url=urllib.request.Request(list_url)

    result=urllib.request.urlopen(url).read().decode("utf-8")

   

    soup=BeautifulSoup(result,'html.parser')

    result2=soup.find_all(class_="con")

   

    x=[]

    for i in result2:

        x.append(i.get_text().strip())

    print(x)

    #print(txt)

ebs_scroll()

 


 

 

 

문제376.

위의 결과에서 \r \n 삭제하고

params2 리스트에 담기게 하시오 !

 

import urllib.request

  #print(url)

from bs4 import BeautifulSoup

import re

 

def ebs_scroll():

   

    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&hmpMnuId=106"

   

    url=urllib.request.Request(list_url)

    result=urllib.request.urlopen(url).read().decode("utf-8")

   

    soup=BeautifulSoup(result,'html.parser')

    result2=soup.find_all(class_="con")

   

    params=[]

    for i in result2:

        params.append(i.get_text().strip())

    print(x)

   

    params2=[]    # params 리스트에 여러내용 있어서 바로 re.sub 못해줌

    for j in params:    # for문으로 하나씩 쪼개서 re.sub 해줘야 .

        params2.append(re.sub("[\r\n]",'',j))

       

    print(params2)

   

ebs_scroll()

 

 

 

문제377.

위의 게시판에 앞에 게시날짜를 앞에 출력되게 하기 위해

게시판의 올린 날짜 가져오는 코드를 작성하시오

 

import urllib.request

  #print(url)

from bs4 import BeautifulSoup

 

 

def ebs_scroll():

   

    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&hmpMnuId=106"

   

    url=urllib.request.Request(list_url)

    result=urllib.request.urlopen(url).read().decode("utf-8")

   

    soup=BeautifulSoup(result,'html.parser')

    result2=soup.find_all('span', class_="date")

    print(result2)

   

    params=[]

    for i in result2:

        params.append(i.get_text().strip())

   

    print(params)

     

   

ebs_scroll()

 


 

 

 

문제378.

위의 코드를 수정해서 아래와 같이 출력되게 하시오

 

import urllib.request 

from bs4 import BeautifulSoup

import re

 

def ebs_scroll():

   

    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&hmpMnuId=106"

   

    url=urllib.request.Request(list_url)

    result=urllib.request.urlopen(url).read().decode("utf-8")

   

    soup=BeautifulSoup(result,'html.parser')

    result1=soup.find_all('span', class_="date")

    result2=soup.find_all('p', class_="con")      #span, p 써서 맞춰줘야 .

 

    params1=[]

    params2=[]

    for i,j in zip(result1,result2):

        params1.append(i.get_text().strip())

        params2.append(j.get_text().strip())

   

   

    for i1,i2 in zip(params1,params2):

       print(i1,' ',i2)  

       

ebs_scroll()

 



 

re.sub 안썼는데도 \r\n 없는건

없어진거 아님.

 

re.sub 처리해서 코딩 깔끔하게

 

import  urllib.request

from  bs4  import  BeautifulSoup

import  re

 

def  ebs_scroll():

 

   

    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&hmpMnuId=106"

 

    url = urllib.request.Request(list_url)

    print (url)

    result = urllib.request.urlopen(url).read().decode("utf-8")

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

   

    params1 = []

    params2 = []

 

    for  link1, link2  in  zip( soup.find_all('span', class_="date"),

                                soup.find_all('p', class_="con") ):

       

        params1.append( link1.get_text() )

        params2.append( re.sub('[\r\n]','',link2.get_text()) )

 

    for i1, i2  in  zip( params1, params2 ):

        print ( i1.strip(), end=' ')

        print ( i2.strip() )

 

 

ebs_scroll()

 


 

 

 

문제379.

ebs 레이디버그 게시판 전체의 글들을 전부 스크롤링 하시오 !

 

레이디버그 홈페이지 들어가서

코멘트의 1 페이지 링크

http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&boardType=13&searchKeywordValue=0&bbsId=10059819&userId=ohsehee5542&searchKeyword=&searchCondition=&searchConditionValue=0&

 

 

코멘트 2 페이지 링크

http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=2&boardType=13&searchKeywordValue=0&bbsId=10059819&userId=ohsehee5542&searchKeyword=&searchCondition=&searchConditionValue=0&

 

 

모든 페이지 코멘트를 출력해봅시다

 

import  urllib.request

from  bs4  import  BeautifulSoup

import  re

 

def  ebs_scroll():

   

    for i in range(1,17):  #페이지수

        list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=%s&boardType=13&searchKeywordValue=0&bbsId=10059819&userId=ohsehee5542&searchKeyword=&searchCondition=&searchConditionValue=0&"%(i)

 

# url 자체에 % 들어갈 있으니까, +str(i)+ 라고 해주는 것도 좋다 !!

   

    url = urllib.request.Request(list_url)

    print (url)

    result = urllib.request.urlopen(url).read().decode("utf-8")

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

   

    params1 = []

    params2 = []

 

    for  link1, link2  in  zip( soup.find_all('span', class_="date"),

                                soup.find_all('p', class_="con") ):

       

        params1.append( link1.get_text() )

        params2.append( re.sub('[\r\n]','',link2.get_text()) )

 

    for i1, i2  in  zip( params1, params2 ):

        print ( i1.strip(), end=' ')

        print ( i2.strip() )

 

 

ebs_scroll()

 

 

문제380.

변수의 내용과 리스트의 내용을 파일로 저장되게 하는 방법은??

 

*변수의 내용을 파일로 저장되게 하는 방법

text='abcdedaefefdfsefsefsefsefe'

f=open("d:\\mydata.txt",'w',encoding='UTF-8')

f.write(text)

f.close()

 

 

*리스트의 내용을 파일에 저장하는 방법

text=['ab','gdg','dgryr']

f=open("d:\\mydata.txt",'w',encoding='UTF-8')

for i in text:

    f.write('%s\n'%i)

f.close()

 

 

문제381.

레이디 버그 게시판의 날짜와 글을 mydata7.txt. 저장하시오

 

import urllib.request

from bs4 import BeautifulSoup

 

def ebs_scroll():

    params=[]

   

    for i in range(1,17):

        list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page="+str(i)+"&hmpMnuId=106"

        url = urllib.request.Request(list_url)

        result = urllib.request.urlopen(url).read().decode("UTF-8")

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

       

        date1=soup.find_all('span',class_='date')

        con1=soup.find_all('p',class_='con')

       

        for i,j in zip(date1,con1):

            params.append([i.get_text(),j.get_text().strip()]) #이렇게 묶어줘야 같이 들어감

   

    f=open("d:/mytext7.txt",'w',encoding="UTF-8")

    for k in params:

        f.write("%s %s\n" %(k[0],k[1]))

    f.close()

 

print(ebs_scroll())

 

 

 

[382.

text_mining 클래스의 워드 클라우드 그리는 메소드를 실행해서 mytext7.txt

워드클라우드로 그리시오

 

class Text_mining:

   

    def __init__(self):

        self.a=input('워드 클라우드를 그릴 텍스트를 입력하세요~')

   

    def word_paint(self):

        from wordcloud import WordCloud, STOPWORDS      # 워드 클라우딩 모듈

        import matplotlib.pyplot as plt                 # 시각화 모듈

        from os import path                             # 텍스트 파일을 불러오기 위한 open, path 하기 위해 os 임포트

        import re

       

       

       

        d = path.dirname("d://")                        # 텍스트 파일이 있는 상위 디렉토리를 path로 지정

        text = open(path.join(d, "%s"%self.a), mode="r", encoding="UTF-8").read()     # 텍스트파일을 open 하는데 reading만 되게 (mode="r"), UTF-8 방식으로 불러옴(UTF-8)

       

        text = re.sub("있다",'',text)

        text = re.sub("있는",'',text)

        text = re.sub("하지만",'',text)

        text = re.sub("것이다",'',text)

        text = re.sub("대한",'',text)

        text = re.sub("통해",'',text)

        text = re.sub("함께",'',text)

        text = re.sub("인공지능",'',text)

       

        text = re.sub("hani",'',text)

        text = re.sub("한다",'',text)

        text = re.sub("하는",'',text)

        text = re.sub("위해",'',text)

        text = re.sub("co",'',text)

        text = re.sub("kr",'',text)

        text = re.sub("위한",'',text)

        text = re.sub("했다",'',text)

        text = re.sub("같은",'',text)

        text = re.sub("것은",'',text)

       

        text = re.sub("레이디버그",'',text)

        text = re.sub("정말",'',text)

        text = re.sub("빨리",'',text)

        text = re.sub("블랙캣",'',text)

        text = re.sub("너무",'',text)

        text = re.sub("시즌",'',text)

        text = re.sub("좋아",'',text)

        text = re.sub("재밌어요",'',text)

        text = re.sub("진짜",'',text)

        text = re.sub("언제",'',text)

        text = re.sub("그리고",'',text)

        text = re.sub("완전",'',text)

       

       

       

        wordcloud = WordCloud(font_path='C://Windows//Fonts//BMHANNA_11yrs_ttf',           # 폰트 위치(거의 기본적으로 C://Windows//Fonts 안에 들어있습니다)

                              stopwords=STOPWORDS, background_color='white',        # STOPWORDS 옵션은 공백/줄바꾸기 기준으로 단어를 추출해 냅니다

                              width=1000,                                           # background_color는 워드클라우드 배경색을 나타냅니다. 'black'으로하면 검은색이 됩니다.

                              height=800,                                           # width와 height는 워드클라우드의 크기를 지정해 줍니다.

                              colormap='jet').generate(text)                       # colormap은 워드 색깔을 지정해주는데 첨부한 색감표를 사용하시면 됩니다. generate() 메소드는

       

       

        plt.figure(figsize=(13,13))                                                 # matplotlib의 pyplot을 figsize로 생성합니다

        plt.imshow(wordcloud)                                                       # 워드 클라우드 이미지를 pyplot에 띄웁니다

        plt.axis("off")                                                             # pyplot에 x, y축 표시를 없앱니다.

        plt.show()

 

tm=Text_mining()

tm.word_paint()

 

 

 

입력!  mytext7.txt

 

 

저축해야 웹스크롤링 함수

 1. ebs 레이디 버그 게시판 :  ebs_scroll()

 2. 한겨레 신문사: hani_scroll()

 

 

 

문제383.

한겨레 신문사 홈페이지로 들어가서 인공지능으로 기사검색을

url 가져오시오 !

 

검색란에 "인공지능"  -> 뉴스더보기 클릭-> 페이지1,2 링크 아래 첨부

 

1페이지:

http://search.hani.co.kr/Search?command=query&keyword=%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&media=news&sort=d&period=all&datefrom=2000.01.01&dateto=2018.12.11&pageseq=0

***1페이가 0부터 시작인거 주의 !!!!

 

2페이지:

http://search.hani.co.kr/Search?command=query&keyword=%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&media=news&sort=d&period=all&datefrom=2000.01.01&dateto=2018.12.11&pageseq=1

 

 

 

문제384.

한겨레 신문사에서 인공지능으로 기사검색을 했을

나오는 html 문서에서 상세기사 제목을 클릭했을

잡히는 url 검색하시오

 


a 갖고와도 되긴한데, 너무 잡스러운게 많으니

dt 갖고온다.

 

import urllib.request

from bs4 import BeautifulSoup

 

def hani_scroll():

    params=[]

   

    for i in range(0,5):

        list_url="http://search.hani.co.kr/Search?command=query&keyword=%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&media=news&sort=d&period=all&datefrom=2000.01.01&dateto=2018.12.11&pageseq="+str(i)

   

       

    url = urllib.request.Request(list_url)

    result = urllib.request.urlopen(url).read().decode("UTF-8")

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

   

    for i in soup.find_all('dt'):  #href 가 있는 태그를 명시한다

        print(i)

 

hani_scroll()

 

 



여기서 for 문을 한번 돌리면

<a~~~>태그에 대한 것만 빼온다

 

for i in soup.find_all('dt'):  #href 가 있는 태그를 명시한다

        for i2 in i:

            print(i2)

 

df태그 안에 있는 요소가 a태그다

 

 


 

이제 여기서 url 뽑겠다

  for i in soup.find_all('dt'):  #href 가 있는 태그를 명시한다

        for i2 in i:

            print(i2.get('href'))

 


 

 

 

문제385.

위의 상세기사 url 들을 params 라는 리스트에 담으시오

 

import urllib.request

from bs4 import BeautifulSoup

 

def hani_scroll():

    params=[]

   

    for i in range(0,10):

        list_url="http://search.hani.co.kr/Search?command=query&keyword=%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&media=news&sort=d&period=all&datefrom=2000.01.01&dateto=2018.12.11&pageseq="+str(i)

   

       

    url = urllib.request.Request(list_url)

    result = urllib.request.urlopen(url).read().decode("UTF-8")

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

   

    for i in soup.find_all('dt'):  #href 가 있는 태그를 명시한다

        for i2 in i:

            params.append(i2.get('href'))

   

    print(params)

 

hani_scroll()

 



 

 

문제386.

아래의 상세 url 기사 내용의 텍스트를 스크롤링 하시오

 

http://www.hani.co.kr/arti/economy/economy_general/868178.html

 


 

 

import urllib.request

from bs4 import BeautifulSoup

 

def hani_scroll2():

   

    list_url="http://www.hani.co.kr/arti/economy/economy_general/868178.html"

       

    url = urllib.request.Request(list_url)

    result = urllib.request.urlopen(url).read().decode("UTF-8")

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

    result=soup.find_all('div',class_='text')

    print(result)

hani_scroll2()

 

근데, 지저분한것들 정리하고 뽑고싶다 !

      

 result=soup.find_all('div',class_='text')

   

    for i in result:

        print(i.get_text())

   

 


 

 

 

문제387.

hani_scroll() 함수와 hani_scroll2() 함수를 가지고

인공지능으로 검색한 전체 기사를 스크롤링하는 함수를 완성 시키시오.

 

import urllib.request

from bs4 import BeautifulSoup

 

def hani_scroll():

    params=[]

   

    for i in range(0,10):

        list_url="http://search.hani.co.kr/Search?command=query&keyword=%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&media=news&sort=d&period=all&datefrom=2000.01.01&dateto=2018.12.11&pageseq="+str(i)

    

   

    url = urllib.request.Request(list_url)

    result = urllib.request.urlopen(url).read().decode("UTF-8")

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

   

    for i in soup.find_all('dt'):  #href 있는 태그를 명시한다

        for i2 in i:

            params.append(i2.get('href'))

   

    return params  #params 아래 함수에 url 로 돌아감.

 

 

 

def hani_scroll2():

   

    list_url=hani_scroll()

   

    for i in range(len(list_url)):               

        url = urllib.request.Request(list_url[i])

        result = urllib.request.urlopen(url).read().decode("UTF-8")

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

        result=soup.find_all('div',class_='text')

   

        for i in result:

            print(i.get_text())     

 

hani_scroll2()

 

 

 

 

문제388.(오늘의 마지막 문제)

위의 함수를 가지고 인공지능 기사로 검색한 기사들이

전부 mytext8 이라는 텍스트에 생성되게 하시오

(워드 클라우드 그림을 카톡에 올리고 검사받으세요~)

 

import urllib.request

from bs4 import BeautifulSoup

import re

 

def hani_scroll():

    params=[]

   

    for i in range(0,10):

        list_url="http://search.hani.co.kr/Search?command=query&keyword=%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&media=news&sort=d&period=all&datefrom=2000.01.01&dateto=2018.12.11&pageseq="+str(i)

    

   

    url = urllib.request.Request(list_url)

    result = urllib.request.urlopen(url).read().decode("UTF-8")

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

   

    for i in soup.find_all('dt'):  #href 있는 태그를 명시한다

        for i2 in i:

            params.append(i2.get('href'))

   

    return params  #params 아래 함수에 url 로 돌아감.

 

 

 

def hani_scroll2():

    param2=[]

    list_url=hani_scroll()

   

    for i in range(len(list_url)):               

        url = urllib.request.Request(list_url[i])

        result = urllib.request.urlopen(url).read().decode("UTF-8")

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

        result=soup.find_all('div',class_='text')

   

        for i in result:

            param2.append(re.sub('[\n\r]','',i.get_text().strip()))

   

   

    #return param2

   

   

    f=open('d:\\mytext8.txt','w',encoding='UTF-8')

   

    for j in param2:

        f.write('%s\n' %(j))

    f.close()

 

       

 

hani_scroll2()

 

######################################################

 

class Text_mining:

   

    def __init__(self):

        self.a=input('워드 클라우드를 그릴 텍스트를 입력하세요~')

   

    def word_paint(self):

        from wordcloud import WordCloud, STOPWORDS      # 워드 클라우딩 모듈

        import matplotlib.pyplot as plt                 # 시각화 모듈

        from os import path                             # 텍스트 파일을 불러오기 위한 open, path 하기 위해 os 임포트

        import re

       

       

       

        d = path.dirname("d://")                        # 텍스트 파일이 있는 상위 디렉토리를 path로 지정

        text = open(path.join(d, "%s"%self.a), mode="r", encoding="UTF-8").read()     # 텍스트파일을 open 하는데 reading만 되게 (mode="r"), UTF-8 방식으로 불러옴(UTF-8)

       

        text = re.sub("있다",'',text)

        text = re.sub("있는",'',text)

        text = re.sub("하지만",'',text)

        text = re.sub("것이다",'',text)

        text = re.sub("대한",'',text)

        text = re.sub("통해",'',text)

        text = re.sub("함께",'',text)

        text = re.sub("인공지능",'',text)

       

        text = re.sub("hani",'',text)

        text = re.sub("한다",'',text)

        text = re.sub("하는",'',text)

        text = re.sub("위해",'',text)

        text = re.sub("co",'',text)

        text = re.sub("kr",'',text)

        text = re.sub("위한",'',text)

        text = re.sub("했다",'',text)

        text = re.sub("같은",'',text)

        text = re.sub("것은",'',text)

       

           

       

        wordcloud = WordCloud(font_path='C://Windows//Fonts//BMHANNA_11yrs_ttf',           # 폰트 위치(거의 기본적으로 C://Windows//Fonts 안에 들어있습니다)

                              stopwords=STOPWORDS, background_color='white',        # STOPWORDS 옵션은 공백/줄바꾸기 기준으로 단어를 추출해 냅니다

                              width=1000,                                           # background_color 워드클라우드 배경색을 나타냅니다. 'black'으로하면 검은색이 됩니다.

                              height=800,                                           # width height는 워드클라우드의 크기를 지정해 줍니다.

                              colormap='jet').generate(text)                       # colormap 워드 색깔을 지정해주는데 첨부한 색감표를 사용하시면 됩니다. generate() 메소드는

       

       

        plt.figure(figsize=(13,13))                                                 # matplotlib pyplot figsize로 생성합니다

        plt.imshow(wordcloud)                                                       # 워드 클라우드 이미지를 pyplot에 띄웁니다

        plt.axis("off")                                                             # pyplot x, y축 표시를 없앱니다.

        plt.show()

 

tm=Text_mining()

tm.word_paint()

 

 

 



728x90
반응형