ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬] 블로그 제목 크롤러 만들기 make a crawler for crawling blog title
    프로그래밍/Python 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")

     


     

     

     

     

    반응형

    '프로그래밍 > Python' 카테고리의 다른 글

    [파이썬🐍] 얕은 복사 vs 깊은 복사  (0) 2022.07.27
    [Python] dictionary 안 맨 처음 key 출력하기  (0) 2022.01.06
    [python] for~ else~ 문  (0) 2020.12.19
    [python] eval()  (0) 2020.11.30
    [python] sort와 sorted 차이  (0) 2020.08.13

    댓글

Designed by Tistory.