본문 바로가기

Study/class note

python / 네이버 블로그 웹스크롤링

from selenium.webdriver.common.keys import Keys # 키보드를 컴퓨터가 알아서 조정할 수 있도록 키 제공
from  selenium  import  webdriver # 컴퓨터가 알아서 웹페이지를 움직일 수 있도록 하는 모듈
from  bs4  import  BeautifulSoup  # html 코드에서 우리가 원하는 텍스트를 가져오게 하는 모듈
import  urllib # url주소를 파이썬이 인식할 수 있도록 하는 모듈
import   re # 데이터 정제 전문 모듈
import time # 중간중간 sleep을 걸어서 서버에 부하를 주지 않게 함
 # 스크롤바를 내렸을때 바로 화면이 뜨지 않고 딜레이가 생김 > 그걸 기다리기 위한 시간이기도 함

# 인공지능으로 중앙일보에서 검색했을때 나오는 페이지의 html 코드를 가져옵니다.
list_url ="https://www.joongang.co.kr/search/news?keyword=%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5"

driver = webdriver.Chrome("C:\\data\\chromedriver_win32\\chromedriver.exe") # 크롬드라이버 불러옴
driver.implicitly_wait(10) # 10초 기다림
driver.get(list_url) # 위의 url을 가져옴

for i in range(1,5): # 4번만 반복하겠음. 무한반복하고 싶은 경우 while문 쓰면 됨.
    더보기 = driver.find_element_by_css_selector('a.btn.btn_outline_gray')
    더보기.send_keys('\n')  # 더보기 엔터를 쳐서 클릭하게 함
    time.sleep(3) # 기사로딩을 위해 3초 기다림
    driver.find_element_by_xpath("//body").send_keys(Keys.PAGE_DOWN)  # 페이지 다운

    
    
html = driver.page_source   # 크롬브라우져에서 현재 불러온 html소스를 가져옴
soup = BeautifulSoup(  html, "html.parser") # html코드를 BeautifulSoup으로 파싱함

base = soup.select("h2.headline > a")  # html코드에서 h2 태그의 headline 클래스의 자식 테그인
                                        # a 태그의 html 문서들을 가져와라 
params=[] # 상세기사 url담을 리스트
for  i  in  base[5:-5]:  #  중앙일보의 경우는 많이 본 뉴스가 상위 5개, 하위 5개를 제외
    params.append(i.get("href"))  #   a 태그 안에 있는 href 의 상세 url 을 가져옵니다. 

print(len(params))  
print(len(set(params))) # 중복확인

예제9. params에 담긴 상세기사 url들을 다 긁어와서 모든 상세기사 본문을 c:\\data\\joongang.txt로 저장되게 하시오. 기사 본문 태그 : <div class="article_body fs3" id="article_body">

from selenium.webdriver.common.keys import Keys # 키보드를 컴퓨터가 알아서 조정할 수 있도록 키 제공
from  selenium  import  webdriver # 컴퓨터가 알아서 웹페이지를 움직일 수 있도록 하는 모듈
from  bs4  import  BeautifulSoup  # html 코드에서 우리가 원하는 텍스트를 가져오게 하는 모듈
import  urllib # url주소를 파이썬이 인식할 수 있도록 하는 모듈
import   re # 데이터 정제 전문 모듈
import time # 중간중간 sleep을 걸어서 서버에 부하를 주지 않게 함
 # 스크롤바를 내렸을때 바로 화면이 뜨지 않고 딜레이가 생김 > 그걸 기다리기 위한 시간이기도 함

# 인공지능으로 중앙일보에서 검색했을때 나오는 페이지의 html 코드를 가져옵니다.
list_url ="https://www.joongang.co.kr/search/news?keyword=%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5"

driver = webdriver.Chrome("C:\\data\\chromedriver_win32\\chromedriver.exe") # 크롬드라이버 불러옴
driver.implicitly_wait(10) # 10초 기다림
driver.get(list_url) # 위의 url을 가져옴

for i in range(1,5): # 4번만 반복하겠음. 무한반복하고 싶은 경우 while문 쓰면 됨.
    더보기 = driver.find_element_by_css_selector('a.btn.btn_outline_gray')
    더보기.send_keys('\n')  # 더보기 엔터를 쳐서 클릭하게 함
    time.sleep(3) # 기사로딩을 위해 3초 기다림
    driver.find_element_by_xpath("//body").send_keys(Keys.PAGE_DOWN)  # 페이지 다운

    
    
html = driver.page_source   # 크롬브라우져에서 현재 불러온 html소스를 가져옴
soup = BeautifulSoup(  html, "html.parser") # html코드를 BeautifulSoup으로 파싱함

base = soup.select("h2.headline > a")  # html코드에서 h2 태그의 headline 클래스의 자식 테그인
                                        # a 태그의 html 문서들을 가져와라 
params=[] # 상세기사 url담을 리스트
for  i  in  base[5:-5]:  #  중앙일보의 경우는 많이 본 뉴스가 상위 5개, 하위 5개를 제외
    params.append(i.get("href"))  #   a 태그 안에 있는 href 의 상세 url 을 가져옵니다. 

print(len(params))  
print(len(set(params))) # 중복확인

# 기사 본문 가져와서 저장
f2 = open("c:\\data\\joongang.txt","w",encoding = 'utf8')
cnt = 0
for i in params:  # # 상세 url for문으로 돌리기
    url = urllib.request.Request(i) 
    f = urllib.request.urlopen(url).read().decode("utf-8")
 
    soup2 = BeautifulSoup(f, "html.parser")
 
    for k in soup2.find_all("div", class_ = "article_body fs3"):
        cnt+=1
        f2.write(str(cnt)+'. ' + re.sub('[\n\r\t]','',k.text)+'\n\n') 
        
f2.close()


문제437. 위의 코드를 가지고 함수를 생성하는데 아래와 같이 키워드만 넣고 실행하면 joongang.txt가 생성되게 하시오.

예) choongang('인공지능')

def joongang(keyword):
    from selenium.webdriver.common.keys import Keys # 키보드를 컴퓨터가 알아서 조정할 수 있도록 키 제공
    from  selenium  import  webdriver # 컴퓨터가 알아서 웹페이지를 움직일 수 있도록 하는 모듈
    from  bs4  import  BeautifulSoup  # html 코드에서 우리가 원하는 텍스트를 가져오게 하는 모듈
    import  urllib # url주소를 파이썬이 인식할 수 있도록 하는 모듈
    import   re # 데이터 정제 전문 모듈
    import time # 중간중간 sleep을 걸어서 서버에 부하를 주지 않게 함
     # 스크롤바를 내렸을때 바로 화면이 뜨지 않고 딜레이가 생김 > 그걸 기다리기 위한 시간이기도 함

    # 인공지능으로 중앙일보에서 검색했을때 나오는 페이지의 html 코드를 가져옵니다.
    list_url ="https://www.joongang.co.kr/search/news?keyword="+ keyword

    driver = webdriver.Chrome("C:\\data\\chromedriver_win32\\chromedriver.exe") # 크롬드라이버 불러옴
    driver.implicitly_wait(10) # 10초 기다림
    driver.get(list_url) # 위의 url을 가져옴

    for i in range(1,5): # 4번만 반복하겠음. 무한반복하고 싶은 경우 while문 쓰면 됨.
        더보기 = driver.find_element_by_css_selector('a.btn.btn_outline_gray')
        더보기.send_keys('\n')  # 더보기 엔터를 쳐서 클릭하게 함
        time.sleep(3) # 기사로딩을 위해 3초 기다림
        driver.find_element_by_xpath("//body").send_keys(Keys.PAGE_DOWN)  # 페이지 다운



    html = driver.page_source   # 크롬브라우져에서 현재 불러온 html소스를 가져옴
    soup = BeautifulSoup(  html, "html.parser") # html코드를 BeautifulSoup으로 파싱함

    base = soup.select("h2.headline > a")  # html코드에서 h2 태그의 headline 클래스의 자식 테그인
                                            # a 태그의 html 문서들을 가져와라 
    params=[] # 상세기사 url담을 리스트
    for  i  in  base[5:-5]:  #  중앙일보의 경우는 많이 본 뉴스가 상위 5개, 하위 5개를 제외
        params.append(i.get("href"))  #   a 태그 안에 있는 href 의 상세 url 을 가져옵니다. 

    print(len(params))  
    print(len(set(params))) # 중복확인

    # 기사 본문 가져와서 저장
    f2 = open("c:\\data\\joongang_"+keyword+".txt","w",encoding = 'utf8')
    cnt = 0
    for i in params:  # # 상세 url for문으로 돌리기
        url = urllib.request.Request(i) 
        f = urllib.request.urlopen(url).read().decode("utf-8")

        soup2 = BeautifulSoup(f, "html.parser")

        for k in soup2.find_all("div", class_ = "article_body fs3"):
            cnt+=1
            f2.write(str(cnt)+'. ' + re.sub('[\n\r\t]','',k.text)+'\n\n') 

    f2.close()
    
joongang('빅데이터')

문제438. 위의 함수를 수정해서 더보기를 몇 번 누를것인지도 입력되게 하세요.

joongang('인공지능',7)

def joongang(keyword, num):
    from selenium.webdriver.common.keys import Keys # 키보드를 컴퓨터가 알아서 조정할 수 있도록 키 제공
    from  selenium  import  webdriver # 컴퓨터가 알아서 웹페이지를 움직일 수 있도록 하는 모듈
    from  bs4  import  BeautifulSoup  # html 코드에서 우리가 원하는 텍스트를 가져오게 하는 모듈
    import  urllib # url주소를 파이썬이 인식할 수 있도록 하는 모듈
    import   re # 데이터 정제 전문 모듈
    import time # 중간중간 sleep을 걸어서 서버에 부하를 주지 않게 함
     # 스크롤바를 내렸을때 바로 화면이 뜨지 않고 딜레이가 생김 > 그걸 기다리기 위한 시간이기도 함

    # 인공지능으로 중앙일보에서 검색했을때 나오는 페이지의 html 코드를 가져옵니다.
    list_url ="https://www.joongang.co.kr/search/news?keyword="+ keyword

    driver = webdriver.Chrome("C:\\data\\chromedriver_win32\\chromedriver.exe") # 크롬드라이버 불러옴
    driver.implicitly_wait(10) # 10초 기다림
    driver.get(list_url) # 위의 url을 가져옴

    for i in range(1,num+1): # 반복하겠음. 무한반복하고 싶은 경우 while문 쓰면 됨.
        더보기 = driver.find_element_by_css_selector('a.btn.btn_outline_gray')
        더보기.send_keys('\n')  # 더보기 엔터를 쳐서 클릭하게 함
        time.sleep(3) # 기사로딩을 위해 3초 기다림
        driver.find_element_by_xpath("//body").send_keys(Keys.PAGE_DOWN)  # 페이지 다운



    html = driver.page_source   # 크롬브라우져에서 현재 불러온 html소스를 가져옴
    soup = BeautifulSoup(  html, "html.parser") # html코드를 BeautifulSoup으로 파싱함

    base = soup.select("h2.headline > a")  # html코드에서 h2 태그의 headline 클래스의 자식 테그인
                                            # a 태그의 html 문서들을 가져와라 
    params=[] # 상세기사 url담을 리스트
    for  i  in  base[5:-5]:  #  중앙일보의 경우는 많이 본 뉴스가 상위 5개, 하위 5개를 제외
        params.append(i.get("href"))  #   a 태그 안에 있는 href 의 상세 url 을 가져옵니다. 

    print(len(params))  
    print(len(set(params))) # 중복확인

    # 기사 본문 가져와서 저장
    f2 = open("c:\\data\\joongang_"+keyword+".txt","w",encoding = 'utf8')
    cnt = 0
    for i in params:  # # 상세 url for문으로 돌리기
        url = urllib.request.Request(i) 
        f = urllib.request.urlopen(url).read().decode("utf-8")

        soup2 = BeautifulSoup(f, "html.parser")

        for k in soup2.find_all("div", class_ = "article_body fs3"):
            cnt+=1
            f2.write(str(cnt)+'. ' + re.sub('[\n\r\t]','',k.text)+'\n\n') 
            
    f2.close()
    driver.quit()  # 브라우저를 닫음

 

 

145 웹스크롤링 실전3 (네이버 블로그) 

"떡군이네와 가장 연관이 높은 단어가 무엇인가?"

 

예제1. 네이버 블로그에서 "떡군이네를 검색하고 그 url 주소를 가져옵니다.

https://section.blog.naver.com/Search/Post.naver?pageNo=1&rangeType=ALL&orderBy=sim&keyword=%EB%96%A1%EA%B5%B0%EC%9D%B4%EB%84%A4

 

예제2. 네이버 블로그에서 검색창에 떡군이네 키워드를 넣고 엔터치는 것까지 구현

import urllib.request
from  bs4 import BeautifulSoup
from selenium import webdriver  
from selenium.webdriver.common.keys import Keys
import time                   


# 웹브라우져로 크롬을 사용할거라서 크롬 드라이버를 다운받아 위의 위치에 둔다
binary = "C:\\data\\chromedriver_win32\\chromedriver.exe"

# 브라우져를 인스턴스화
driver = webdriver.Chrome(binary)

# 네이버 블로그 검색 url 받아옴(검색창이 비어있을때 url)
driver.get("https://section.blog.naver.com/BlogHome.naver?directoryNo=0&currentPage=1&groupId=0")

# 네이버 블로그 검색창의 클래스 이름
search = driver.find_element_by_xpath("//*[@class='textbox ng-pristine ng-untouched ng-valid ng-empty ng-valid-maxlength']") 

########################### 검색어 입력 ###########################

# search이 input 창과 연결되어 스스로 떡군이네를 검색
search.send_keys("떡군이네")

# 웹에서의 submit 은 엔터의 역할을 함
search.send_keys('\n')

3. 지금 보이고 있는 현재 html코드를 가져옵니다.

html = driver.page_source   # 크롬브라우져에서 현재 불러온 html 소스를 가져옵니다

soup = BeautifulSoup(html, "lxml") # html 코드를 검색할 수 있도록 설정

base= soup.select('div.desc > a')

print(base)

4. (점심시간 문제) 지금 가져온 코드에서 해당 블로그의 상세 url을 출력하시오.

import urllib.request
from  bs4 import BeautifulSoup
from selenium import webdriver  
from selenium.webdriver.common.keys import Keys
import time                   

# 웹브라우져로 크롬을 사용할거라서 크롬 드라이버를 다운받아 위의 위치에 둔다
binary = "C:\\data\\chromedriver_win32\\chromedriver.exe"

# 브라우져를 인스턴스화
driver= webdriver.Chrome(binary)

# 네이버 블러그 검색 url 받아옴(검색창 비어있을때 url)
driver.get("https://section.blog.naver.com/BlogHome.naver?directoryNo=0&currentPage=1&groupId=0")

# 네이버 블러그 검색창의 클래스 이름을 찾아서 검색창을 elem 이라는 객체로 만듭니다
search = driver.find_element_by_xpath("//*[@class='textbox ng-pristine ng-untouched ng-valid ng-empty ng-valid-maxlength']") 

########################### 검색어 입력 ###########################

# search 객체가 검색창과 연결되어서 스스로 떡군이네를 검색
search.send_keys("떡군이네")

# 엔터를 칩니다. 
search.send_keys('\n')


# 3.지금 보이고 있는 현재 html 코드를 가져옵니다. 

html = driver.page_source   # 크롬브라우져에서 현재 불러온 html 소스를 가져옵니다

soup = BeautifulSoup(html, "lxml") # html 코드를 검색할 수 있도록 설정

base= soup.select('div.desc > a')

for  i  in  base:
    print( i.get('ng-href'))

5. 떡군이네로 네이버 블로그에서 5개의 페이지를 조회해서 상세 url 가져오는 코드

import urllib.request
from  bs4 import BeautifulSoup
from selenium import webdriver  
from selenium.webdriver.common.keys import Keys
import time                   

# 웹브라우져로 크롬을 사용할거라서 크롬 드라이버를 다운받아 위의 위치에 둔다
binary = "C:\\data\\chromedriver_win32\\chromedriver.exe"

# 브라우져를 인스턴스화
driver= webdriver.Chrome(binary)

params=[]           # 상세 url 담기 위한 리스트를 생성 
for i in range(1,6):  # 5번만 반복하는데 
    time.sleep(1)     # 네이버 서버의 부하를 덜 주기 위해서 1초정도 쉬어주면서 가고
    url="https://section.blog.naver.com/Search/Post.naver?pageNo=" + str(i) + "&rangeType=ALL&orderBy=sim&keyword=" + "떡군이네"

    # 네이버 블러그 검색 url 받아옴(검색창 비어있을때 url)
    driver.get(url)  # 이렇게 가져와야 해당 html 페이지를 온전히 가져올 수 있습니다. 

    html = driver.page_source   # 크롬브라우져에서 현재 불러온 html 소스를 가져옵니다

    soup = BeautifulSoup(html, "html.parser") # html 코드를 검색할 수 있도록 설정, html.parser 로 해도 되면 이렇게 해도 됩니다. 

    base= soup.select('div.desc > a')  #  div 테그의 desc 클래스의 자식 테그인 a 테그에 있는 html 코드들을 가져옵니다. 

    
    for  i  in  base:
        params.append( i.get('ng-href'))

params2 = set(params)  # params 리스트에 있는 중복된 요소를 제거합니다. 
print( len(params2) )

6. params2에 담긴 상세 url 중에 하나를 뽑아서 웹페이지로 접속하고 안에 텍스트를 가져올 수 있도록 태그 이름과 클래스 이름을 알아내시오.

p 태그의 클래스 이름 se-text-paragraph se-text-paragraph-align-center 
base2 = soup.select('p.se-text-paragraph se-text-paragraph-align-center > span')

 

7. 텍스트 스크롤

개발자 모드로 들어가서 확인했을 때 iframe이 있으면 한 번 더 타고 들어가야함.

def naver_blog(keyword,page_num):

    # 모듈
    from selenium import webdriver  
    from selenium.webdriver.common.keys import Keys
    from bs4 import BeautifulSoup
    from urllib import request as urlreq
    import time
    import re

    # 크롬 드라이버
    binary = "C:\\data\\chromedriver_win32\\chromedriver.exe"

    # 브라우저를 인스턴스화
    driver = webdriver.Chrome(binary)

    params = []
    for i in range(1,page_num+1):
        url = "https://section.blog.naver.com/Search/Post.naver?pageNo="+str(i)+"&rangeType=ALL&orderBy=sim&keyword="+keyword
        driver.get(url)
        time.sleep(1)
        html = driver.page_source

        soup = BeautifulSoup(html,'html.parser')
        base = soup.select('div.desc > a')
        for i in base:
            params.append(i.get('href'))

    params2 = list(set(params))

    from tqdm import tqdm_notebook  # 속도 진행상황

    f2 = open("c:\\data\\"+keyword+".txt","w",encoding = "utf8")

    for k in tqdm_notebook(params2):
        driver = webdriver.Chrome(binary)
        driver.get(k)

        element = driver.find_element_by_id("mainFrame") #iframe 태그 엘리먼트 찾기
        driver.switch_to.frame(element)

        html2 = driver.page_source

        soup2 = BeautifulSoup(html2, 'html.parser')
        
        #닉네임 크롤링
        overlays = ".nick"
        nick = driver.find_element_by_css_selector(overlays)
        nickname = nick.text
        nickname = re.sub('[\n\r\t]','',nickname)

        #날짜 크롤링
        overlays = ".se_publishDate.pcol2"
        date = driver.find_element_by_css_selector(overlays)
        datetime = date.text
        
        #내용 크롤링
        content = soup2.select('div.se-component-content>div>div>p')
        
        f2.write('\n\nurl주소 : '+k)
        f2.write('\n작성날짜: ' + datetime) # 날짜쓰기
        f2.write('\n블로그 작성자['+nickname +']\n')  # 닉네임 쓰기
        for i in content:
            if len(i.text) > 1:
                f2.write(re.sub('[\n\r\t]','',i.text)+'\n')  # 내용 크롤링하면서 쓰기

    f2.close()
반응형

'Study > class note' 카테고리의 다른 글

python / 웹스크롤링 감성분석  (0) 2022.01.05
감성분석 기본코드(한글)  (0) 2022.01.05
python / 중앙일보 웹스크롤링  (0) 2022.01.03
python / beautiful soup 모듈  (0) 2021.12.31
python / HTML 기본문법  (0) 2021.12.30