프로그래밍/Python

[파이썬] 블로그 제목 크롤러 만들기 make a crawler for crawling blog title

대인보우 2020. 2. 1. 00:25
반응형

 

 

사실 긁어오는 것 자체는 어렵지 않다.

크롬 - 검사 기능을 통해 해당 태그만 잘 긁어오면 되니까.

오늘은 티스토리 게시글 제목을 긁어오는 크롤러를 만들어보자

 

R 통계 과제하며 썼던 코드를 짜집기 해보도록 하자^*^

 

 

 

※여기부턴 시행착오가 매우 많은 코드니 맨 밑에 정리된 코드를 사용할 것※

 

 

import os 
from selenium import webdriver
import time

#유튜브 댓글과 같이 스크롤 해야 뜨는 형식을 위해 쓰는 코드니까 지금은 딱히 필요없다
from selenium.webdriver.common.keys import Keys

#얘도 유튜브 검색할때 쓰던거라 딱히 필요 없음
import pandas as pd
from bs4 import BeautifulSoup

 

os.chdir("C:/Users/바탕 화면/python")

#크롬드라이버가 저장되어 있는 경로 (미리 크롬드라이버를 설치해주어야 한다.)

 

driver = webdriver.Chrome('chromedriver')

# 원격으로 크롬이 열린다

driver.get("https://cowimming.tistory.com/")

# 크롤링 할 주소 - 내 블로그 주소를 입력해주었다. 

 

body = driver.find_element_by_tag_name('body') 

 

title_list = []

# 결과를 저장해줄 빈 리스트

 

 

 

유튜브나 앱스토어 같은 리뷰를 긁어올 땐 스크롤을 내려주는 기능이 필요하지만

티스토리 블로그 같은 경우에는 필요없으므로 그냥 넘어가기.

 

 

 

이렇게 크롬에서 제목을 긁은뒤 오른쪽 마우스를 클릭하면 검사항목이 뜬다. 클릭!

 

 

검사항목을 눌러주면 해당 코드가 뜬다

 

 

분홍색으로 표시된 코드만 잘 기억해두자


    html = driver.page_source
    soup = BeautifulSoup(html,'html.parser')
    view = soup.select('div > section > article > div > div > a > span')
    title_list.append(view)

 

 

이제 중요한게 바로 soup.select인데 저기에 내가 크롤링할 코드의 엄마코드(?)부터 쭉 입력해주면 된다.

코린이라 그냥 다 입력해준다^^...뭐 어떻게 쓰면 그냥 div - span까지 한번에 된다고 하던데!!!! 

 

 

title_list를 보면 이렇게 긁어와진다

 

하지만 여기서 문제..!!! 꼭 저런 </span>같은 쓰잘데기 없는 태그까지 긁어와지는데...

이걸 아직도 어떻게 처리해야되는지 몰겠다 저것땜에 2차 전처리 하는데 시간 오래걸림 ㅡㅡ

그리고 제목만 긁고 싶은데 내용은 왜 긁냐고....

 

하여간 태그를 없애려고 

뒤에 .text를 붙여주면

 

AttributeError: 'list' object has no attribute 'text'

 

에러가 발생한다 ㅠㅠ 악!!!!

print(title_list[0].text) 또한 같은 에러가 발생하는데 코드를 자세히 살펴보니

 

<span class="thum"> </span>,

<span class="title">[집코노미TV] 아기곰 "강남행 마지막 버스 이미 떠났다"</span>,

 

저 보라색이 0번째 값인데 그 안에 text가 없어서 그런 것 같다. 

그래서 1을 넣어줬더니 IndexError: list index out of range 에러 발생^^^^^ 뭐 어쩌라는거지??????????

 

 

+ 그냥 print(title_list[0])을 했더니 전체값이 나온다.. 위의 추론은 틀린걸로..... 이래서 기반을 단단히 해야한다

밑빠진 독에 물붓기 오졌다.

 

 

++ 오!!!!!!! 새롭게 발견한 사실!!!!! 제목만 긁고 싶은데 그 아래 제목 게시글 내용까지 긁어오는 이유가 바로 

"모든 span" 함수까지 긁어져 왔기 때문이다. 나는 제목 span만 갖고오고 싶은데!!!! 코드를 수정했다.

 

a 태그 밑에 span이 두개다.

 

view = soup.select('div > section > article > div > div > a > span.title')

#span.title로 수정하니 제목만 긁어와진다

 

print(title_list)

[[<span class="title">[집코노미TV] 아기곰 "강남행 마지막 버스 이미 떠났다"</span>, <span class="title">1</span>, <span class="title">[R studio] 그래프 그릴 때 margin 뜻.R</span>, <span class="title">[R studio] T-TEST &amp; WELCH TEST.R</span>, <span class="title">[R studio] 기술통계 출력하는 다양한 방법들.R</span>]]

 

하지만 태그는 그대로....

 

 

+++

와 진짜 멍청했다.  왜 title_list에 append를 한거지??? view만 입력하면 잘나오는데!!!!!!!!!!!

 

print(view[0].text)

[집코노미TV] 아기곰 "강남행 마지막 버스 이미 떠났다"

 

for i in view:

print(i.text)

[집코노미TV] 아기곰 "강남행 마지막 버스 이미 떠났다" 1 [R studio] 그래프 그릴 때 margin 뜻.R [R studio] T-TEST & WELCH TEST.R [R studio] 기술통계 출력하는 다양한 방법들.R

 

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ잘나오는구만^-^

이제 이 태그를 없앤 값을 저장해야한다...

 

title_list=[] 

#빈 리스트를 만들어주고 저장하자

 

for i in view:
title_list.append(i.text)

 

예쓰!!!!!!!!!!!!!!

 

title_list = pd.DataFrame(title_list)
title_list.to_csv("저장경로/title.csv", header=False, index=False)

 

 

csv로 저장한 파일을 열어주면!!!!

 

이렇게 외계어로 뜬다

하하하

 

 

title_list.to_csv("저장경로/title.csv", header=False, index=False, encoding="euc-kr")로 다시 저장해준다

 

 

눈이 편안해진다^^

 

이렇게 하면 되는데... r 통계 과제할때 크롤링하고 - 엑셀로 전처리 - 크롤링하고 - 엑셀로 전처리

이렇게 반복했는데.. 내 시간과 쓸데없는 노력... 가뜩이나 변수도 많았는데 ㅠㅠ... 

보고서 보고 교수님이 띠용 싶었겠다,,,,,

어쨌든 정리!

 

 

*정리코드*


import os
from selenium import webdriver
import pandas as pd
from bs4 import BeautifulSoup

os.chdir("크롬 드라이버 경로")
driver = webdriver.Chrome('chromedriver')

driver.get("크롤링 할 주소")

body = driver.find_element_by_tag_name('body')

html = driver.page_source
soup = BeautifulSoup(html,'html.parser')
            
view = soup.select('긁어올 태그')

title_list = []

for i in view:
    title_list.append(i.text)

title_list = pd.DataFrame(title_list) 
title_list.to_csv("저장경로/title.csv", header=False, index=False, encoding="euc-kr")

 


 

 

 

 

반응형