쌩초보가 파이썬 크롤링 더듬거리다 막혀서 질문드립니다.

안녕하세요. 크롤링에 관심이 생겨 책보고 장님 코끼리 더듬거리듯 코드를 만져보다 혼자선 아무리 찾아도 도저히 해결이 안 돼서 질문드립니다.

이런 고수분들이 계신 곳에서 질문드리는 것도 처음이라 좀 걱정됩니다. 혹시 제가 올린 글에 문제가 있다면 말씀해주세요. 고치겠습니다.

아래 코드는 제가 보는 책의 실습예제인데, 책의 코드를 그대로 따라 입력했음에도 오류가 나고 있습니다.

이 코드의 목적은 https://korean.visitkorea.or.kr/main/main.do에서 크롤링할 키워드를 검색하고 검색 건수를 입력받아 요약 정보를 추출한 뒤 저장까지 하는 것입니다.

문제는 실제 실행해보면 오류는 나지 않지만 실제 검색된 글의 건수(cnt2라는 변수)가 어떤 키워드로 검색하건 0건으로 나와 실제로 게시글 수집까지 진행되지 않고 프로그램이 끝납니다.

제가 의심하는 것은

‘’’
search_cnt_2 = search_cnt_1.find(‘strong’).find(‘span’).get_text()
‘’’
부분인데, 파이참에서는 find부분이 하이라이트되어 Unresolved attribute reference ‘find’ for class ‘PageElement’ 라는 메시지가 뜹니다.

다른 부분의 find는 잘 작동되는데 이 부분의 find만 문제가 생기니 골치가 아프네요.

이 문제를 어떻게 해결할 수 있는지 조언을 받고 싶습니다.

아래는 코드 전문입니다.

‘’’

Step 1. 필요한 모듈과 라이브러리를 import 합니다.

from bs4 import BeautifulSoup
from selenium import webdriver
import time
import sys

import math
import numpy
import pandas as pd
import xlwt

Step 2. 필요한 정보를 입력 받습니다.

query_txt = input('1.크롤링할 키워드는 무엇입니까?: ')

cnt = int(input('2.크롤링할 건 수는 몇 건 입니까?: '))

page_cnt = math.ceil(cnt / 10) # 크롤링 할 전체 페이지 수

f_name = ‘D:\a\b\test.txt’
fc_name = ‘D:\a\b\test.csv’
fx_name = ‘D:\a\b\test.xls’

확장자를 입력할 때는 슬래시를 두 번 쳐야 경로에 오류가 생기지 않는다! ex)c:\a\b\test.txt

Step 3. 크롬 드라이버를 사용해서 웹 브라우저를 실행합니다.

path = “C:/Users/aaa/bbb/chromedriver.exe”
driver = webdriver.Chrome(path)

driver.get(“대한민국구석구석”)
time.sleep(2)

Step 4. 검색창의 이름을 찾아서 검색어를 입력 후 검색을 진행합니다.

driver.find_element_by_xpath(’//*[@id=“safetyStay1”]/div/button’).click()
driver.find_element_by_id(“btnSearch”).click()
element = driver.find_element_by_id(“inp_search”)
element.send_keys(query_txt)
driver.find_element_by_link_text(“검색”).click()

학습목표 1: 사용자가 입력한 건수와 실제 검색 건수를 비교 후 동기화하기

Step 5. 사용자가 입력한 건수와 실제 검색 건수를 비교 후 동기화하기

cnt2 = 0

time.sleep(2) # 페이지가 로딩 될 때까지 2초 기다립니다.

html = driver.page_source
soup = BeautifulSoup(html, ‘html.parser’)
search_cnt_1 = soup.find(‘div’, ‘total_check’)
search_cnt_2 = search_cnt_1.find(‘strong’).find(‘span’).get_text()

이대로 실행하면 딱히 에러가 뜨진 않지만 cnt2 가 0이 돼서 게시글 수집이 진행이 안 된다. 윗줄의 find가 문제인 것 같은데 해결책을 모르겠다.(Unresolved attribute reference ‘find’ for class ‘PageElement’ )

if cnt > int(search_cnt_2):
cnt2 = int(search_cnt_2)

real_page_cnt = math.ceil(cnt2/10)

print("\n")
print("="*80)
print(“요청하신 검색 수는 %s 건이었으나” % cnt)
print(“해당 키워드로 실제 검색된 글의 건수가 총 %s 건이라서” % cnt2)
print(“실제 검색 건수인 %s 건으로 재설정하였고” % cnt2)
print(“총 %s 페이지의 게시글 수집을 진행하겠습니다” % real_page_cnt)
print("="*80)
print("\n")

학습 목표2 : 페이지 이동하기

Step 6. 페이지 번호를 바꾸면서 실제 데이터 추출하기

no = 1 # 게시글 번호 카운트용 변수

no2 = [] # 게시글 번호 저장용 리스트
contents2 = [] # 게시글 내용 저장용 리스트
tags2 = [] # 해쉬 태그 정보 저장용 리스트

for x in range(1, real_page_cnt+1): # 1페이지부터 반복 시작
print("%s 페이지 내용 수집 시작합니다 =======================" % x)
print("\n")
time.sleep(2) # 페이지가 로딩 될 때까지 2초 대기

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
content_list = soup.find('ul', 'list_thumType flnon').find_all('div', 'area_txt')

for i in content_list:
    # 게시글 번호 입력
    no2.append(no)
    print('번호', no)

    # 게시글의 내용 추출 및 입력
    contents = i.find('div', 'tit').get_text()
    contents2.append(contents)
    print('내용: ', contents.strip())

    # 학습목표 3: 예외 처리 사용하기
    try:
        tag = i.find('p', 'tag').get_text()
    except AttributeError:
        tag = '태그정보가 없습니다'
        tags2.append(tag)
        print('태그:', tag.strip())
        print("\n")
    else:
        tags2.append(tag)
        print('태그:', tag.strip())
        print("\n")

    if no == cnt2:
        break

    no += 1

time.sleep(2)       # 페이지 변경 전 2초 대기

x += 1

if x == real_page_cnt+1:
    break

if x == 6:
    driver.find_element_by_xpath("""//*[@id="6"]""").click()
else:
    driver.find_element_by_link_text("""%s""" % x).click()

Step 7. 출력 결과를 표(데이터 프레임) 형태로 만들기

korea = pd.DataFrame()
korea[‘번호’] = no2
korea[‘내용’] = contents2
korea[‘태그’] = tags2

추출 결과를 txt 파일로 저장하기

f = open(f_name, ‘a’, encoding=‘UTF-8’)
f.write(str(no2))
f.write(str(contents2))
f.write(str(tags2))
f.close()

추출 결과를 csv 형태로 저장하기

korea.to_csv(fc_name, encoding=“utf-8-sig”, index=False)

추출 결과를 엑셀 형태로 저장하기

korea.to_excel(fx_name, index=False)

print(“총 %s 건의 데이터 추출 작업이 모두 완료되었습니다” % no)
print("추출된 데이터의 txt 파일 저장 경로: %s " % f_name)
print("추출된 데이터의 csv 파일 저장 경로: %s " % fc_name)
print("추출된 데이터의 xls 파일 저장 경로: %s " % fx_name)

driver.close()

‘’’

1 Like

경자년 벽두부터 크롤링 이슈가 많네요.

이미 문제의 원인은 정리해두신 것 같네요.
코드를 돌려보면 우회방법을 찾기 쉬운 부분이겠지만,
한창 꽂혀 있는 문제가 있어서 남의 코드 돌려주고 있을 정성은 없네요.

이런 문제가 크롤링에선 훨씬 비일비재 합니다. ( 저도 며칠도 안만져본거지만 )

  1. 사이트가 개편됨
  2. 책에 나온 라이브러리나 파이썬이랑 버전이 다름
  3. 브라우져 드라이버가 다르거나 버전이 다름
  4. html parser 가 대충임( 성능은 lxml 이 나아보이지만 정확도는 html5lib 가 낫다고 생각 )

그럴때 마다 우회 말곤 답이 없죠. 뭐 어떤 논리적인 구조가 잘못되어 문제가 있기는 힘드니까요.
스스로 좀 우회방법을 찾아보시면 좋을듯합니다.

1 Like

네 이것저것 해보고는 있는데 좀 어렵네요.
답변 감사합니다.