본문 바로가기

데이터 청년 캠퍼스(경남대학교)/스터디

2021-07-13

네이버 블로그 크롤링하기

 

#Step 1. 필요한 모듈을 로딩합니다
from selenium import webdriver
import time
#Step 2. 사용자에게 검색 관련 정보들을 입력 받습니다.
print("=" *100)
print(" 연습문제 6-5: 블로그 크롤러 : 여러건의 네이버 블로그 정보 추출하여 저장하기")
print("=" *100)
query_txt = input('1.크롤링할 키워드는 무엇입니까?(예: 여행): ')

include = input('2. 결과에서 반드시 포함하는 단어를 입력하세요(예: 국내, 바닷가)\n(여러개일 경우 , 로 구분해서 입력하고 없으면 엔터 입력하세요): ')
in_li =include.split(',')
    

exclude = input('3. 결과에서 제외할 단어를 입력하세요(예: 분양권, 해외)\n(여러개일 경우 , 로 구분해서 입력하고 없으면 엔터 입력하세요): ')
ex_li = exclude.split(',')

start = input('조회 시작일자 입력(예:2017-01-01): ')
st_li = start.split('-')


end = input('조회 종료일자 입력(예:2017-04-20): ')
ed_li = end.split('-')
collect_cnt = int(input('크롤링 할 건수는 몇건입니까?(최대 100건): '))
#Step 3. 수집된 데이터를 저장할 파일 이름 입력받기 
f_dir = input("파일을 저장할 폴더명만 쓰세요(기본값:c:\\temp\\):")
if f_dir == '' :
    f_dir="c:\\temp\\"

#Step 4. 크롬 드라이버 설정 및 웹 페이지 열기
chrome_path = "c:/temp/chromedriver.exe"
driver = webdriver.Chrome(chrome_path)

url = 'https://www.naver.com/'
driver.get(url)
time.sleep(2)
Step 4. 자동으로 검색어 입력 후 조회하기
element = driver.find_element_by_id("query")
driver.find_element_by_id("query").click( ) #입력창? 클릭
element.send_keys(query_txt) #글자입력
if in_li[0] != '':
    for i in in_li:
        element.send_keys(' +'+i)
    
if  ex_li[0] != '':
    for j in ex_li:
        element.send_keys(' -'+j)
    
element.send_keys("\n") #엔터키 입력
st_li[1] = str(int(st_li[1]))
st_li[2] = str(int(st_li[2]))
print(st_li)

ed_li[1] = str(int(ed_li[1]))
ed_li[2] = str(int(ed_li[2]))
print(ed_li)
## Step 5.view
driver.find_element_by_link_text('VIEW').click()
time.sleep(2)

#Step view
driver.find_element_by_link_text('블로그').click()
time.sleep(2)

driver.find_element_by_xpath('//*[@id="snb"]/div[1]/div/div[2]').click()
driver.find_element_by_xpath('//*[@id="snb"]/div[2]/ul/li[3]/div/div[1]/a[9]').click()

driver.find_element_by_xpath('//*[@id="snb"]/div[2]/ul/li[3]/div/div[2]/div[1]/span[3]/a').click()

driver.find_element_by_link_text(ed_li[0]).click()
time.sleep(1)
driver.find_element_by_link_text(ed_li[1]).click()
time.sleep(1)
driver.find_element_by_link_text(ed_li[2]).click()
time.sleep(1)

driver.find_element_by_xpath('//*[@id="snb"]/div[2]/ul/li[3]/div/div[2]/div[1]/span[1]/a').click()
time.sleep(1)
driver.find_element_by_link_text(st_li[0]).click()
time.sleep(1)
driver.find_element_by_link_text(st_li[1]).click()
time.sleep(1)
driver.find_element_by_link_text(st_li[2]).click()

driver.find_element_by_xpath('//*[@id="snb"]/div[2]/ul/li[3]/div/div[2]/div[3]/button').click()

옵션에서 날짜 선택하기

 

#Step 7.Beautiful Soup 로 본문 내용만 추출하기
from bs4 import BeautifulSoup
html_1 = driver.page_source
soup_1 = BeautifulSoup(html_1, 'html.parser')

content_1 = soup_1.find('ul','lst_total').find_all('li')
for i in content_1 :
    print(i.get_text().replace("\n",""))
#Step 9. 데이터 수집하기

address2 = [] #블로그 주소
name2 = [] #작성자 닉네임
rdate2 =[] #작성일자
contents2=[]     # 내용


no = 1           # 게시글 번호 초기값
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
content_list = soup.find('ul','lst_total').find_all('li')

for i in content_list:


    # 1.블로그주소
    print("\n")
    print("%s 번째 정보를 추출하고 있습니다============" %no)        
    address = i.find('div','total_wrap api_ani_send').find('a')['href']
    print('블로그 주소: ',address)
    address2.append(address)

    # 2. 작성자닉네임
    name = i.find('a','sub_txt sub_name').get_text().strip()
    print('제목: ', name)
    name2.append(name)
    
    #게시글 들어가기
    driver.find_element_by_id('sp_blog_%d' %no).click()
    #i.find('ul','lst_total').find_all('div').click()
#     link = i.find('a')['href']
#     link1 = link
#     driver.get(link1)
        
    #게시글 전체 불러오기
    #Step 7.Beautiful Soup 로 본문 내용만 추출하기
    html_2 = driver.page_source
    soup_2 = BeautifulSoup(html_2, 'html.parser')

    content_2 = soup_2.find('div','se-viewer se-theme-default')

    # 3. 작성일자
    date=content_2.find('div','se-component-content').find('div','blog2_container').find('span','se_publishDate pcol2').get_text()
            se-component-content
    rdate2.append(date.strip())
    print("작성일자 : ", date)


    # 4. 내용
    content=content_2.find_all('span').get_text().strip()
    content2.append(content.strip())
    print("내용 : %s" %content.strip())

네이버 블로그는 크롤링을 막아놓아서 iframe 문제를 해결해야해야 크롤링이 가능함

하지만 iframe에서 해결하짐 못해서 마무리

'데이터 청년 캠퍼스(경남대학교) > 스터디' 카테고리의 다른 글

2021-07-15  (0) 2021.07.16
2021-07-14  (0) 2021.07.14
2021-07-12  (0) 2021.07.12
2021 - 07 - 07  (0) 2021.07.07
2021-07-06  (0) 2021.07.06