본문 바로가기

python

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

728x90
반응형

162~172 웹스크롤링(텍스트, 이미지)

1. 웹스크롤링 기본 문법

2. ebs 레이디 버그 게시판

3. 한겨레

4. 중앙일보

5. 동아일보

주가에 영향을 주는 요소 빅데이터

-> 기사를 읽는 인공지능 신경망

 (미래에셋 로보 어드바이져)

 


 

■중앙일보 신문사 사이트 웹스크롤링

 

문제338.

중앙일보 신문사 사이트에서 인공지능으로 검색한 url 알아내시오

 

페이지1:

https://search.joins.com/TotalNews?page=1&Keyword=%EB%94%A5%EB%9F%AC%EB%8B%9D&SortType=New&SearchCategoryType=TotalNews

***중앙일보는 페이지넘버 1부터 !

 

페이지2:

https://search.joins.com/TotalNews?page=2&Keyword=%EB%94%A5%EB%9F%AC%EB%8B%9D&SortType=New&SearchCategoryType=TotalNews

 

 

첫번째 함수

 

import urllib.request

from bs4 import BeautifulSoup

 

def jungang_scroll():

    params=[]

   

    for i in range(1,2):

        list_url="https://search.joins.com/TotalNews?page="+str(i)+"&Keyword=%EB%94%A5%EB%9F%AC%EB%8B%9D&SortType=New&SearchCategoryType=TotalNews"

    

   

    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('strong', class_="headline mg"):  #href 가 있는 태그를 명시한다

        for i2 in i:

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

   

    print(params)  #params가 아래 함수에 url 로 돌아감.

   

jungang_scroll()

 

한겨레 함수에서 3 수정하면 중앙일보꺼 1번함수 만들어진다.

 

def jungang_scroll2():

   

    list_url=jungang_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',id="article_body")

   

        for i in result:

            print(i.get_text())    # i.get_text().strip() 해주면 정리됨  

 

jungang_scroll2()

 

2번째 함수는 읽고자 하는 기사 위치만 찾아내서 바꿔주면 된다.

※ html 코드에서 id ?

설계된 htmp 코드 문서라면은

id 값은 html 문서 내에 존재한다!!

 

 


  

 

문제389.

위에서 긁어온 데이터를 mytext9.txt 생성하시오

 

import urllib.request

from bs4 import BeautifulSoup

import re

 

def jungang_scroll():

    params=[]

   

    for i in range(1,2):

        list_url="https://search.joins.com/TotalNews?page="+str(i)+"&Keyword=%EB%94%A5%EB%9F%AC%EB%8B%9D&SortType=New&SearchCategoryType=TotalNews"

    

   

    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('strong', class_="headline mg"):  #href 가 있는 태그를 명시한다

        for i2 in i:

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

   

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

 

 

 

def jungang_scroll2():

   

    list_url=jungang_scroll()

    params2=[]

   

    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',id="article_body")

   

       

        for i in result:

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

           

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

    for j in params2:       

        f.write(j)  

    f.close()

jungang_scroll2()

 

 

 

 

문제391.

동아일보 신문사에서 딥러닝으로 검색한 기사를 mytext10.txt 담는 함수

2개를 생성하시오 !

 

1페이지 링크:

http://news.donga.com/search?p=1&query=%EB%94%A5%EB%9F%AC%EB%8B%9D&check_news=1&more=1&sorting=1&search_date=1&v1=&v2=&range=1

 

2페이지 링크:

http://news.donga.com/search?p=16&query=%EB%94%A5%EB%9F%AC%EB%8B%9D&check_news=1&more=1&sorting=1&search_date=1&v1=&v2=&range=1

 

3페이지 링크:

http://news.donga.com/search?p=31&query=%EB%94%A5%EB%9F%AC%EB%8B%9D&check_news=1&more=1&sorting=1&search_date=1&v1=&v2=&range=1

 

**15 증가

 

 

import urllib.request

from bs4 import BeautifulSoup

import re

 

def donga_scroll():

    params=[]

   

    for i in range(2):

        list_url="http://news.donga.com/search?p="+str(i*15+1)+"&query=%EB%94%A5%EB%9F%AC%EB%8B%9D&check_news=1&more=1&sorting=1&search_date=1&v1=&v2=&range=1"

 

    url = urllib.request.Request(list_url)

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

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

   

    title_url=soup.find_all('p', class_="tit")  #href 가 있는 태그를 명시한다

   

    for i in title_url:

        params.append(i.find('a').get('href'))

               

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

 

print(donga_scroll())

 

div   class_=t 해도 나오는 이유: 메인사진에도 링크가 걸려있어서.

그럼 사진없는 기사링크는 안들어가기 때문에

p class_tit 하고 , a 한번더 find 해줘서 href 찾는다.

 

 

다시 전문 함수

import urllib.request

from bs4 import BeautifulSoup

import re

 

def donga_scroll():

    params=[]

   

    for i in range(5):

        list_url="http://news.donga.com/search?p="+str(i*15+1)+"&query=%EB%94%A5%EB%9F%AC%EB%8B%9D&check_news=1&more=1&sorting=1&search_date=1&v1=&v2=&range=1"

 

    url = urllib.request.Request(list_url)

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

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

   

    title_url=soup.find_all('p', class_="tit")  #href 가 있는 태그를 명시한다

   

    for i in title_url:

        params.append(i.find('a').get('href'))

               

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

 

#print(donga_scroll())

 

 

 

def donga_scroll2():

   

    list_url=donga_scroll()

    params2=[]

   

    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")

       

        for script in soup(["script", "style"]):

            script.decompose()   #자바스크립트 제거 하려고 for 돌림

                        #li, p 넣으면 잡다한거 지워짐(p copyright 지워짐)

           

        result=soup.find_all('div',class_="article_txt")

   

       

        for i in result:

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

           

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

    for j in params2:       

        f.write(j)  

    f.close()

   

 

donga_scroll2()

 

 

 

 

문제392.(오늘의 점심문제)

동아일보 신문사에서 딥러닝으로 검색한 기사로

워드 클라우드를 그리시오( 카톡으로 그림을 올리세요)

 

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()

 



  

 

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

반장코드

#문제 391. 동아일보 신문사에서 딥러닝으로 검색한 기사를 mytext10.txt에 담는 함수 2개를 생성하시오 !

 

import urllib.request

from bs4 import BeautifulSoup

 

def donga_scroll():

    params = []

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

    for i in range(1, 100, 15):

        list_url = "http://news.donga.com/search?p="+ str(i) + "&query=%EB%94%A5%EB%9F%AC%EB%8B%9D&check_news=1&more=1&sorting=1&search_date=1&v1=&v2=&range=1"

        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('p', class_='tit'):

            result = i.find('a').get('href')

            params.append(result)

    params2 = []

    for i in params:

        url = urllib.request.Request(i)

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

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

        for i in soup.find_all('div',class_="article_txt"):

            for i2 in i(["script"]):

                i2.decompose()

            params2.append(i.get_text())

    for item in params2:

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

    print('저장되었습니다.')

 

donga_scroll()

 

 

 

웹스크롤링

1. ebs 레이디 버그 게시판

2. 한겨레

3. 중앙일보

4. 동아일보

5. 네이버 이미지 스크롤링

6. 구글 이미지 스크롤링

7. 다음 이미지 스크롤링

8. bing 이미지 스크롤링

9. 인스타그램 이미지 스크롤링

10. 서울시 응답소 게시판(Javascript 포함)

 

서울시 응답소 게시판 웹스크롤링

 

http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp

 

서울시응답소게시판은 동아일보같은 신문사와는 다르게

하단 페이지 바꿀 url 바뀌지 않는다.

 

 

 

문제397.

서울시 응답소 게시판의 글을 웹스크롤링 하기 위해

페이지 마다 html 모드를 가져올 있도록 하시오

 

import  urllib.request

from  bs4 import  BeautifulSoup

import  os

import  re

 

def  fetch_list_url():

    params = []

    for  j  in  range(1,30):

   

        list_url ="http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp"

 

        request_header = urllib.parse.urlencode({"page": j})

               #{page:1} urlencode 해서 page=1 나오게 한다.

        print (request_header)

 

fetch_list_url()

 


 

 

서울시응답소게시판은 동아일보같은 신문사와는 다르게

하단 페이지 바꿀 url 바뀌지 않는다.

 


 

commonPagingPost  <--------자바스크립트 함수

commonPagingPost('4', '10', 'Shr01_lis.jsp')

 

 

     javascript:commonPagingPost('2',  '10',  'Shr01_lis.jsp');

 

   function commonPagingPost (Page, Block, Action) {

            var Frm = document.mainForm;

            Frm.RCEPT_NO.value = "";

            Frm.page.value = Page;

            Frm.action = Action;

            Frm.submit ();

         }

      -->

      </script>

 

 

 

https://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp

자바 스크립트 함수 :

   page=1, page=2, page=3 ....,page=29 페이지번호를 자바함수에 제공!

                

commonPagingPost--->html 코드를 보내준다.

 

게시글을 클릭했을 바뀌는 url

 

https://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_vie.jsp

 

lis.jsp vie.jsp 바뀌었다.

 

 

 

 

문제398.

아래의 서울시 응답소 게시판 url 페이지번호를 commonPagingPost 자바스크립트 함수에

제공을 해야 해당 페이지의 html 코드를 내려받을 있다.

해당 페이지의 html 코드를 출력하시오!

 

"http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp"

 

 

page=1

page=2

page=3

page=4

 

:

 

import  urllib.request

from  bs4 import  BeautifulSoup

import  os

import  re

 

def  fetch_list_url():

    params = []

    for  j  in  range(1,30):

   

        list_url ="http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp"

 

        request_header = urllib.parse.urlencode({"page": j})

        # print(request_header) page = 1, page=2 ... 가 출력됨

 

        request_header = request_header.encode("utf-8")

        # page=1 을 컴퓨터가 이해할수 있는 이진 코드로 변환

        print (request_header)  #   b'page=1'  출력

 

        url = urllib.request.Request( list_url, request_header )

   

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

 

        print (res) 

 

 

fetch_list_url()

 


 

 

설명:

 

https://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp

자바 스크립트 함수 :

   page=1, page=2, page=3 ....,page=29 페이지번호를 자바함수에 제공!

                

commonPagingPost--->html 코드를 보내준다.

 

게시글을 클릭했을 바뀌는 url

 

https://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_vie.jsp

 

lis.jsp vie.jsp 바뀌었다.

 

 

 

 

 

 

문제399.

문재인 대통령 기사를 이름은 최재혁으로 사진도 최재혁으로 바꾸시오!

 

소스열고 해당글자, 사진링크 바꾸면 바뀜

 


 

 

 

문제400.

게시글의 상세 게시판글을 스크롤링하기 위해서 필요한 상세 url

해당하는 코드(자바스크립트 함수에 제공해야 하는 코드)

스크롤링 하시오 !

 

 자바스크립트 함수:

JavaScript: onView ('20180801905041')

                                        

                            부분을 스크롤링 해야한다.

게시글 누를 뜨는 링크가

on view

 

 


 

번호를 스크롤링해서 갖고와서 append 해야 한다 .

 

 

import  urllib.request

from  bs4 import  BeautifulSoup

import  os

import  re

 

def  fetch_list_url():

 #   params = []

    for  j  in  range(1,3):

   

        list_url ="http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp"

 

        request_header = urllib.parse.urlencode({"page": j })

        # print(request_header) page = 1, page=2 ... 가 출력됨

 

        request_header = request_header.encode("utf-8")

        # page=1 을 컴퓨터가 이해할수 있는 이진 코드로 변환

        #print (request_header)  #   b'page=1'  출력

 

        url = urllib.request.Request( list_url, request_header )

   

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

       

       

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

        #print(soup)

       

        soup2=soup.find_all("li",class_="pclist_list_tit42")

       

        for i in soup2:

            print(i.find("a")["href"])

       

 

        #print (res) 

 

 

fetch_list_url()

 


 

 

 

문제401.

위의 코드에서 20180823902658 <-- 부분만 추출하시오!

결과:

 


 

 

import  urllib.request

from  bs4 import  BeautifulSoup

import  os

import  re

 

def  fetch_list_url():

 #   params = []

    for  j  in  range(1,3):

   

        list_url ="http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp"

 

        request_header = urllib.parse.urlencode({"page": j})

        # print(request_header) page = 1, page=2 ... 가 출력됨

 

        request_header = request_header.encode("utf-8")

        # page=1 을 컴퓨터가 이해할수 있는 이진 코드로 변환

        #print (request_header)  #   b'page=1'  출력

 

        url = urllib.request.Request( list_url, request_header )

   

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

       

       

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

        #print(soup)

       

        soup2=soup.find_all("li",class_="pclist_list_tit42")

       

        for i in soup2:

            print(re.sub('[^0-9]','',i.find("a")["href"]))

       

 

        #print (res) 

 

 

fetch_list_url()

 

 

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

선생님답:

import  urllib.request

from  bs4 import  BeautifulSoup

import  os

import  re

 

def  fetch_list_url():

 #   params = []

    for  j  in  range(1,3):

   

        list_url ="http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp"

 

        request_header = urllib.parse.urlencode({"page": j})

        # print(request_header) page = 1, page=2 ... 가 출력됨

 

        request_header = request_header.encode("utf-8")

        # page=1 을 컴퓨터가 이해할수 있는 이진 코드로 변환

        #print (request_header)  #   b'page=1'  출력

 

        url = urllib.request.Request( list_url, request_header )

   

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

       

       

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

        #print(soup)

       

        soup2=soup.find_all("li",class_="pclist_list_tit42")

       

        for i in soup2:

            soup3=i.find("a")["href"]

            print(re.search('[0-9]{14}',soup3).group())

# re.search group 사용에 집중

       

 

        #print (res) 

 

fetch_list_url()

 

 

 

 

문제402.

params 라는 비어있는 리스트 변수에 위의 data 들을 append 시키시오 !

 

import  urllib.request

from  bs4 import  BeautifulSoup

import  os

import  re

 

def  fetch_list_url():

    params = []

    for  j  in  range(1,3):

   

        list_url ="http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp"

 

        request_header = urllib.parse.urlencode({"page": j})

        # print(request_header) page = 1, page=2 ... 가 출력됨

 

        request_header = request_header.encode("utf-8")

        # page=1 을 컴퓨터가 이해할수 있는 이진 코드로 변환

        #print (request_header)  #   b'page=1'  출력

 

        url = urllib.request.Request( list_url, request_header )

   

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

       

       

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

        #print(soup)

       

        soup2=soup.find_all("li",class_="pclist_list_tit42")

       

        for i in soup2:

            soup3=i.find("a")["href"]

            params.append(re.search('[0-9]{14}',soup3).group())

       

        print(params)

       

 

        #print (res) 

 

fetch_list_url()

 

설명:

append , 해당 페이지의 게시글수의 onview 끼리 중복리스트화해서 담긴다.

[ [ ],[ ],[ ],...,[ ] ]

 

onview:

    deep list 페이지1, 페이지2, 페이지3....... 이렇게 들어간다.

 


**상세 게시판 글을 필요하다.

 

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

re.sub 뽑은

import  urllib.request

from  bs4 import  BeautifulSoup

import  os

import  re

 

def  fetch_list_url():

    params = []

    for  j  in  range(1,3):

   

        list_url ="http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp"

 

        request_header = urllib.parse.urlencode({"page": j})

        # print(request_header) page = 1, page=2 ... 가 출력됨

 

        request_header = request_header.encode("utf-8")

        # page=1 을 컴퓨터가 이해할수 있는 이진 코드로 변환

        #print (request_header)  #   b'page=1'  출력

 

        url = urllib.request.Request( list_url, request_header )

   

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

       

       

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

        #print(soup)

       

        soup2=soup.find_all("li",class_="pclist_list_tit42")

       

        for i in soup2:

            soup3=i.find("a")["href"]

            params.append(re.sub('[^0-9]','',soup3))

            #params.append(re.search('[0-9]{14}',soup3).group())

       

        print(params)

       

 

        #print (res) 

 

fetch_list_url()

 

 

 

 

문제403.

자바 스크립트 onview 함수에 위의 번호들이 어떻게 제공이 되어야 하는지

확인하시오!

 

 

자바스크립트 onview 함수('20180820907144', '상세 게시판 url')

  

상세 게시판 글이 있는 html 문서를 리턴해준다.

 

 

   function onView (Seq) {

            var Frm = document.mainForm;

            Frm.RCEPT_NO.value = Seq;

            Frm.action = "/Shr/Shr01/Shr01_vie.jsp";

            Frm.submit ();

         }

 

 

 

RCEPT_NO: 20180820907144

 

 

----------위에꺼랑 비교해서 이해해보기

 

 


 

 

 

 

문제404.

RCEPT_NO: 20180820907144  형태로 onview 함수에

/Shr/Shr01/Shr01_vie.jsp 같이 제공을 해서

상세 게시판 글의 html 코드를 가져오는

fetch_list_url2() 함수를 생성하시오 !

 

import  urllib.request

from  bs4 import  BeautifulSoup

import  os

import  re

 

def  fetch_list_url():

    params = []

    for  j  in  range(1,3):

   

        list_url ="http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp"

 

        request_header = urllib.parse.urlencode({"page": j})

        # print(request_header) page = 1, page=2 ... 가 출력됨

 

        request_header = request_header.encode("utf-8")

        # page=1 을 컴퓨터가 이해할수 있는 이진 코드로 변환

        #print (request_header)  #   b'page=1'  출력

 

        url = urllib.request.Request( list_url, request_header )

   

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

       

       

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

        #print(soup)

       

        soup2=soup.find_all("li",class_="pclist_list_tit42")

       

        for i in soup2:

            soup3=i.find("a")["href"]

            params.append(re.sub('[^0-9]','',soup3))

            #params.append(re.search('[0-9]{14}',soup3).group())

       

        return params

        #print (res) 

 

#fetch_list_url()

 

 

 

def  fetch_list_url2():

    params2 = fetch_list_url()   #onview 에서 숫자뽑아낸것을 params2에 담고있다.

 

    for  i  in   params2:

   

        detail_url = "http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_vie.jsp"

   

        request_header = urllib.parse.urlencode({"RECP_NO": str(i) } )

        request_header = request_header.encode("utf-8")  #컴퓨터이해를 위해 utf-8

 

        url = urllib.request.Request( detail_url, request_header)

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

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

        print (soup) 

 

fetch_list_url2()

 

 


 

 

 

문제405.(점심시간문제)

위의 코드를 이용해서 상세 게시판 글들을 스크롤링하는

코드를 완성하시오

 

import  urllib.request

from  bs4 import  BeautifulSoup

import  os

import  re

 

def  fetch_list_url():

    params = []

    for  j  in  range(1,3):

   

        list_url ="http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp"

 

        request_header = urllib.parse.urlencode({"page": j})

        # print(request_header) page = 1, page=2 ... 가 출력됨

 

        request_header = request_header.encode("utf-8")

        # page=1 을 컴퓨터가 이해할수 있는 이진 코드로 변환

        #print (request_header)  #   b'page=1'  출력

 

        url = urllib.request.Request( list_url, request_header )

   

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

       

       

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

        #print(soup)

       

        soup2=soup.find_all("li",class_="pclist_list_tit42")

       

        for i in soup2:

            soup3=i.find("a")["href"]

            params.append(re.sub('[^0-9]','',soup3))

            #params.append(re.search('[0-9]{14}',soup3).group())

       

        return params

        #print (res) 

 

#fetch_list_url()

 

 

 

def  fetch_list_url2():

    params2 = fetch_list_url()   #onview 에서 숫자뽑아낸것을 params2에 담고있다.

 

    for  i  in   params2:

   

        detail_url = "http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_vie.jsp"

   

        request_header = urllib.parse.urlencode({"RECP_NO": str(i) } )

        request_header = request_header.encode("utf-8")  #컴퓨터이해를 위해 utf-8

 

        url = urllib.request.Request( detail_url, request_header)

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

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

       

        print (soup) 

       

        for j in soup.find_all("div", class_="table_inner_desc"):

            print(j.get_text().strip())

       

fetch_list_url2()

 

 

******결과가 안나와욥 !!!!!!!!

점심시간 후에 코드 주심

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

 

#최종 코드 :

코드 하단을 보면서 정리된거 참고 !!!

import urllib.request  # 웹브라우저에서 html 문서를 얻어오기위해 통신하는 모듈

from  bs4 import BeautifulSoup  # html 문서 검색 모듈

import os

import re

 

 

def get_save_path():

    save_path = input("Enter the file name and file location :" )

    save_path = save_path.replace("\\", "/")

    if not os.path.isdir(os.path.split(save_path)[0]):

        os.mkdir(os.path.split(save_path)[0])

    return save_path

 

def fetch_list_url():

    params = []

    for j in range(1, 3):

 

        list_url = "http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp"

 

        request_header = urllib.parse.urlencode({"page": j})

        # print (request_header) # 결과 page=1, page=2 ..

 

        request_header = request_header.encode("utf-8")

        # print (request_header) # b'page=29'

 

        url = urllib.request.Request(list_url, request_header)

        # print (url) # <urllib.request.Request object at 0x00000000021FA2E8>

 

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

 

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

        soup2 = soup.find_all("li", class_="pclist_list_tit42")

        for soup3 in soup2:

            soup4 = soup3.find("a")["href"]

            params.append(re.search("[0-9]{14}", soup4).group())

 

 

    return params

 

 

def fetch_list_url2():

 

    params2 = fetch_list_url()

 

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

 

    for i in params2:

 

        detail_url = "http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_vie.jsp"

 

        request_header = urllib.parse.urlencode({"RCEPT_NO": str(i) })

        request_header = request_header.encode("utf-8")

 

        url = urllib.request.Request(detail_url, request_header)

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

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

        soup2 = soup.find("div", class_="form_table")

 

        tables = soup2.find_all("table")

        table0   = tables[0].find_all("td")

        table1   = tables[1].find("div",class_="table_inner_desc")

        table2   = tables[2].find("div",class_="table_inner_desc")

 

        date  = table0[1].get_text()

        title = table0[0].get_text()

        question = table1.get_text(strip=True)

        answer   = table2.get_text(strip=True)

 

        f.write("==" * 30 + "\n")

        f.write(title + "\n")

        f.write(date + "\n")

        f.write(question + "\n")

        f.write(answer + "\n")

        f.write("==" * 30 + "\n")

 

    f.close()

 

fetch_list_url2()

 

 

 

 

 

 

문제 406.

서울시 응답소 게시판 상세 내용을 추출해서 워드크라우드로 생성하시오

 

#최종 코드 :

import urllib.request  # 웹브라우저에서 html 문서를 얻어오기위해 통신하는 모듈

from  bs4 import BeautifulSoup  # html 문서 검색 모듈

import os

import re

 

 

def get_save_path():

    save_path = input("Enter the file name and file location :" )

    save_path = save_path.replace("\\", "/")

    if not os.path.isdir(os.path.split(save_path)[0]):

        os.mkdir(os.path.split(save_path)[0])

    return save_path

 

def fetch_list_url():

    params = []

    for j in range(1, 3):

 

        list_url = "http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp"

 

        request_header = urllib.parse.urlencode({"page": j})

        # print (request_header) # 결과 page=1, page=2 ..

 

        request_header = request_header.encode("utf-8")

        # print (request_header) # b'page=29'

 

        url = urllib.request.Request(list_url, request_header)

        # print (url) # <urllib.request.Request object at 0x00000000021FA2E8>

 

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

 

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

        soup2 = soup.find_all("li", class_="pclist_list_tit42")

        for soup3 in soup2:

            soup4 = soup3.find("a")["href"]

            params.append(re.search("[0-9]{14}", soup4).group())

 

 

    return params

 

 

def fetch_list_url2():

 

    params2 = fetch_list_url()

 

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

 

    for i in params2:

 

        detail_url = "http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_vie.jsp"

 

        request_header = urllib.parse.urlencode({"RCEPT_NO": str(i) })

        request_header = request_header.encode("utf-8")

 

        url = urllib.request.Request(detail_url, request_header)

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

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

        soup2 = soup.find("div", class_="form_table")

 

        tables = soup2.find_all("table")

        table0   = tables[0].find_all("td")

        table1   = tables[1].find("div",class_="table_inner_desc")

        table2   = tables[2].find("div",class_="table_inner_desc")

 

        date  = table0[1].get_text()

        title = table0[0].get_text()

        question = table1.get_text(strip=True)

        answer   = table2.get_text(strip=True)

 

        f.write("==" * 30 + "\n")

        f.write(title + "\n")

        f.write(date + "\n")

        f.write(question + "\n")

        f.write(answer + "\n")

        f.write("==" * 30 + "\n")

 

    f.close()

 

fetch_list_url2()

 

 

 

웹스크롤링 이렇게 해보았습니다 !

 

 1. ebs 레이디 버그 게시판

          

 2. 한겨례 신문사

          

 3. 중앙일보 신문사

          

 4. 동아일보 신문사

          

 5. 네이버 이미지 스크롤링

          

 6. 구글 이미지 스크롤링

          

 7. 다음 이미지 스크롤링

          

 8. Bing 이미지 스크롤링

          

9. 인스타그램 스크롤링

      

10. 서울시 응답소 게시판 (javascript 포함)

 

 

 


728x90
반응형