파이썬(Python)

[ 크롤링-Selenium ] 파이썬 네이버 블로그 검색 결과 크롤링(엑셀파일 정리)

카루루1007 2022. 10. 30. 20:48
728x90
반응형
SMALL

기본적인 내용은 유튜브 검색결과를 크롤링하여 엑셀파일로 정리하는 것과 유사합니다.

유튜브 크롤링에 대한 전체적인 흐름과 소스는 여기서 확인이 가능합니다.

 

파이썬 유튜브 크롤링(제목, URL, 조회수, 업데이트 날짜, 길이)

퇴근하고 조금씩 공부하면서 작성하다보니 먼가 어지러워보입니다. 1. 파이썬 유튜브 제목과 URL 크롤링 2. 파이썬 유튜브 크롤링 결과 엑셀파일 저장하기 3. 파이썬에서 엑셀 셀값 불러오기 4. 파

karuru1007.tistory.com

 

먼저 네이버에 접속하여 [ 파이썬 ]을 검색합니다.

[ VIEW ] → [ 블로그 ]를 선택하시면 블로그에서 [ 파이썬 ]에 대한 검색결과만  확인이 가능합니다.

 

해당 부분의 URL을 살펴보겠습니다.

빨간색 네모부분이 검색어에 해당하는 것으로 보입니다.

빨간색 네모부분을 다른 검색어로 바꾸면 다른 결과가 나오는지 살펴보면

확인이 가능합니다.

 

URL을 확인을 했으니 이제 웹페이지의 구조를 살펴보아야 합니다.

[ F12 ]를 눌러 페이지의 구조를 확인해 보겠습니다.

페이지의 구조는 간단하게 되어 있습니다.

빨간색 네모의 ul 태그 id lst_total 안에 블로그의 리스트가 들어있습니다.

id sp_blog_1 부터 sp_blog_30 까지가 각각의 블로그에 해당하는 부분인것 같습니다.

 

페이지는 유튜브와 마찬가지로 스크롤을 하여 웹 페이지를 불러오는 구조로 되어 있습니다.

한번 아래로 스크롤을 해보겠습니다.

아래로 스크롤을 하니 sp_blog_숫자가 늘어난 것이 확인 가능합니다.

[ class ] bx 안의 [ id ] sp_blog_숫자 안에 블로그의 내용이 들어있을 것으로 추정됩니다.

 

가지고 올 내용은 [ 블로그 제목 ][ 업데이트 날짜 ][ 블로그 이름 ][ 내용 ]입니다.

반응형

다시 [ F12 ]의 [ 검사 ]를 통해 어떻게 구성되어 있는지 살펴보겠습니다.

[ class = "bx" ] 아래의 내용을 살펴보면 빨간색 부분이 블로그의 이름인 것으로 보이고

해당 부분은 [ class = "sub_txt sub_name" ]입니다.

 

같은 방식으로 살펴보면

[ 제목 ] 부분은 [ class = "api_txt_lines total_tit" ]

[ 게시일 ] 부분은  [ class = "sub_time sub_txt" ]

[ 내용 ] 부분은  [ class = "api_txt_lines.dsc_txt" ]

[ 블로그 이름 ] 부분은  [ class = "sub_txt sub_name" ]

 

이제 전체적인 구조를 요약해 보겠습니다.

<ul class="lst_total"> 은 블로그에 대한 내용을 감싸고 있습니다.

그 안에 <li class="bx" id="sp_blog_숫자"> 안에 블로그 하나하나에 대한 정보가 있습니다.

그 정보는 [ 제목 ] [ 게시일 ] [ 내용 ] [ 블로그 이름 ] 등으로 구성되어 있고

정보에 관한 부분은 

[ 제목 ] 부분은 [ class = "api_txt_lines total_tit" ]

[ 게시일 ] 부분은  [ class = "sub_time sub_txt" ]

[ 내용 ] 부분은  [ class = "api_txt_lines.dsc_txt" ]

[ 블로그 이름 ] 부분은  [ class = "sub_txt sub_name" ]

이렇게 됩니다.

 

유튜브 크롤링하기와 달라지는 부분의 코드만 작성하겠습니다.

ws.append(["연번", "제목", "내용", "게시일", "블로그이름"])

엑셀 파일에 제목을 만들어 줍니다.

 

for i in range(4):
    ws.cell(row=1, column=i+1).alignment = Alignment(horizontal="center", vertical="center")

제목 부분을 가운데 정렬을 해줍니다.

 

titles = driver.find_element(By.CLASS_NAME, "lst_total").find_elements(By.CLASS_NAME, "bx")

[ lst_total ]이라는 클래스를 찾아 그 안에서 [ bx ]라는 이름의 클래스를 모두 찾은 후

[ titles ]에 넣습니다. ※ 첫번째는 element 이고 두번째는 emements 입니다 [ s ]에 주의하세요

count_row = 1
# 연번을 넣기 위한 변수입니다.

for title in titles:
    sub = title.find_element(By.CLASS_NAME, "api_txt_lines.total_tit").text
    # 제목을 찾는 코드입니다.

    contents = title.find_element(By.CLASS_NAME, "api_txt_lines.dsc_txt").text
    # 내용을 찾는 코드입니다.

    update_date = title.find_element(By.CLASS_NAME, "sub_time.sub_txt").text
    # 게시일을 찾는 코드입니다.

    subname = title.find_element(By.CLASS_NAME, "sub_txt.sub_name").text
    # 블로그 이름을 찾는 코드입니다.

    ws.cell(row=count_row, column=1).value = count_row - 1
    ws.cell(row=count_row, column=1).alignment = Alignment(horizontal="center", vertical="center")

    ws.cell(row=count_row, column=2).value = sub
    ws.cell(row=count_row, column=2).alignment = Alignment(horizontal="center", vertical="center")

    ws.cell(row=count_row, column=3).value = contents
    ws.cell(row=count_row, column=3).alignment = Alignment(horizontal="center", vertical="center")       

    ws.cell(row=count_row, column=4).value = final_date
    ws.cell(row=count_row, column=4).alignment = Alignment(horizontal="center", vertical="center")

    ws.cell(row=count_row, column=5).value = subname
    ws.cell(row=count_row, column=5).alignment = Alignment(horizontal="center", vertical="center")

   # 각각의 column에 값을 넣고 정렬을 해줍니다.

    count_row = count_row + 1
   # 연번을 넣기위해 count_row를 1 증가시켜 줍니다.

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

추가 사항

몇가지 테스트를 하다보니 본문의 내용에 그림파일 하나만 들어가 있는 경우

오류코드가 발생합니다.

    try:
        ws.cell(row=count_row, column=3).value = contents
        ws.cell(row=count_row, column=3).alignment = Alignment(horizontal="center", vertical="center")
    except:
        pass

우선 이런식으로 수정을 했습니다.

728x90
반응형
LIST