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¤tPage=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¤tPage=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 |