조종 다음은 개발
article thumbnail

크롤링을 하면서 가격 정보를 가져올 때 css 선택자로 가격 정보가 들어있는 class를 선택하여

 

가격 정보를 가져왔었다.

200만원이 적혀있는 부분을 css선택자로 선택했다

그러나 모든 게시글이 이러한 형식을 따른 것은 아니였다..

 

특히 공식앱을 통해서 업로드 된 게시글들은 위 사진과 같은 형식으로 업로드 되지 않아서 가격 정보를 추출하지 못했다.

 

하지만 그러한 게시글들의 가격 정보는 제목에 담아 있었다.

위 사진에서 알 수 있듯이 제목에서 대괄호로 공식앱, 제목, 가격 정보가 들어 있었다.

 

그래서 제목에서 가격정보를 추출하여 가격 칼럼에 저장하는 방식으로 코드를 추가했다.

 

하지만 이 과정에서 문제가 다시 발생 했었다.

 

 

 

크롤링을 하는 과정에서 위 사진과 같은 공식앱으로 업로드 된 게시글에서 가격 정보를 추출하는 시간이

 

너무 오래 걸렸다. (최소 15초)

 

15초면 빠르다고 생각할 수 있지만 한 페이지에 대략 10개의 게시글을 총 10페이지 정도 크롤링 한다고 하면

 

한 게시글에서 15초가 걸리면 작업이 완료되는 시간이 너무 오래 걸렸다.

 

그래서 일단 만약 공식앱인 경우 새로운 list에 추가를 하여 마지막에 다루기로 했다.

 

            try:
                # 정보추출

                write_date = driver.find_element_by_css_selector('.date').text
                product_title = driver.find_element_by_css_selector('h3.title_text').text
                seller_name = driver.find_element_by_css_selector('.nick_box').text
                url = driver.find_element_by_css_selector('.button_url').get_attribute('href')

                try:
                    status = driver.find_element_by_css_selector('.SaleLabel').text
                    product_price_str = driver.find_element_by_css_selector('.ProductPrice').text
                    # 가격 문자열을 숫자로 바꾸기
                    price_no_won = product_price_str[:-1]
                    product_price = int(price_no_won.replace(',', ''))
                except:
                    product_price = ''
                    status = ''
                    # 데이터프레임에 작성
                    datas_yet.append([write_date, status, seller_name, product_title, url, product_price])

                    # 뒤로가기
                    driver.back()
                    driver.switch_to.frame('cafe_main')
                    continue

            except:
                print('???')
                write_date = ''
                product_title = ''
                seller_name = ''
                url = ''
                status = ''
                product_price= ''
                
       datas.append([write_date, status, seller_name, product_title, url, product_price])

(위 코드는 전체 크롤링 반복문에서 몇 줄만 추출하여 나타낸 것이다)

 

먼저 크롤링을 하려고 게시글에 들어가서 제목을 추출한다.

 

제목이 추출되지 않으면 그냥 빈 정보를 변수에 저장하고

 

제목이 추출되면 다음으로 가격 정보를 추출한다.

 

 

가격 정보가 무사히 추출되면 datas 라는 list에 append를 하고

 

가격 정보가 추출이 되지 않으면 중고나라의 서식을 따르지 않은 게시글이라고 판단하여

 

일단 datas_yet이라는 리스트에 append한다.

 

그리고 마지막에 datas_yet에서 제목에 들어 있는 가격 정보를 가격 칼럼에 추가하는 형식으로 코드를 바꿨다.

 

이러한 방식으로 수정하니 크롤링 속도가 15초에서 8초로 줄일 수 있었다.

 

 

def no_price_data(dataframe):
    price_int_list = []
    df_app = dataframe[dataframe['제목'].str.startswith('[')].copy()

    title_spl_list = df_app['제목'].str.split('[')

    for i in title_spl_list:
        p = i[-1]  # 가격이 포함된 문자열
        p_str = p[:-2]  # 가격만 추출
        price_int_list.append(int(p_str.replace(',', '')))  # 가격을 숫자로 바꿈

    df_app['price'] = price_int_list

    return df_app

이렇게 함수로 인자로 df_yet을 넣으면 제목에서 가격 정보를 추출하여 가격 칼럼에 저장하는 함수를 추가했다.

 

그리고 이제 두 데이터 프레임을 합쳐서 csv로 저장하면 된다.

 

 

# 두 데이터 프레임 합치기
df_final = pd.concat([df_no_outer, df_filled_price])

# 데이터프레임 저장하기
df_final.to_csv('/Users/#####/######/####/######/df_final.csv', index=False, encoding='utf-8-sig')

df_no_outer은 기존에 df 를 이상점과 중복점을 삭제한 데이터 프레임이고

df_filled_price는 위 함수(no_price_data)의 리턴값이다.

 

 

 

가격 문제를 해결하고 프로그램을 마무리 할 수 있었다.

 

물론 계속해서 리펙터링 할 수 있지만 기본적인 기능은 완료했다고 판단했다.

 

전체적으로 이번 프로젝트를 진행하면서 어떤 점을 얻고 어떤점이 부족한지 회고를 해보려고 한다.

 

 

좋았던 점

 

1. 실제로 프로그램을 만들어서 활용할 수 있었다.

 

나는 이 프로그램으로 맥북을 구매했다. ㅎㅎ

 

 

2. 프로그래밍의 재미를 더욱 느낄 수 있었다.

 

실제로 활용하는 단계까지 가서 실제로 도움이 되니까 프로그래밍이 확실히 재미있다고 느껴졌다.

 

 

 

부족한 점

 

1. 개발 시간이 많이 걸렸다. 

 

처음에는 결과를 어떤 방식으로 출력할지 명확하게 세우지 않아서 그런가 이런 방식 저런 방식 시도 하다 보니까 개발 시간이 

 

생각 보다 많이 걸렸다. 다음 부터는 명확한 목표를 세우는게 좋을 것 같다.

 

 

2 크롬이 업데이트 될 때 마다 해당 프로그램을 업데이트해야한다.

 

이는 사용성을 떨어트릴 수 있겠다.

 

 

3. 아직도 크롤링 속도가 조금 느리다.

 

나름 속도를 줄이기 위해 여러 노력을 해보았지만 자체 크롤링 속도는 느린편인 것 같다.

 

물론 사용하는데 큰 어려움은 없다. 나중에 좀 더 많은 것을 알게 된다면 리펙터링 해보겠다.

 

 

전체적으로 많은 것을 깨달았던 프로젝트였다.

 

이번 프로젝트를 기반으로 좀 더 재미있고 실제로 활용하기 좋은 프로그램을 만들면 좋겠다.

 

'중고나라 크롤링' 카테고리의 다른 글

중고나라 크롤링 도전 (2)  (1) 2021.04.11
중고나라 크롤링 시도!  (0) 2021.03.18
profile

조종 다음은 개발

@타칸

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!