GDSC 토이프로젝트(2) - 편의점 정보 크롤링

chaejm55·2023년 7월 11일
0

GDSC-KNU-2nd-Backend

목록 보기
5/10

GDSC 백엔드 스터디 팀의 토이 프로젝트를 통해 작성한 게시물입니다.

앞서 포스팅한 제 역할 중에 첫 번째인 편의점 위치와 서비스 정보 크롤링하기입니다. 백엔드와는 약간 거리가 있어보여도 데이터를 가져 오는 일이기 때문에 중요합니다.
쉬운 크롤링을 위해 python을 사용해 크롤링하고, 이를 csv로 저장해 다시 db에 입력해서 사용하는 방식으로 진행하였습니다.

1. 각 편의점 정보 웹 사이트 찾기

각 편의점의 홈페이지에서 편의점 정보 페이지를 크롤링했습니다. 대부분의 동적페이지를 사용하여 간단하게 크롤링하긴 어려웠습니다.

위의 예시처럼 동적으로 검색하는 방식이 대부분이었습니다. 그래서 다른 방법을 찾아보았습니다.

2. 각 웹 사이트에 알맞는 크롤링 방법 찾기

1) header 넣기

header에 파라미터를 넣어 request로 크롤링 하는 방법을 사용했습니다.
위의 emart24를 크롤링하기 위해 짠 코드입니다.

data = {'wpsido': '', 'spgugun': '', 'cpage': '1', 'service_cv': '', 'stplacesido': '',
        'stplacegugun': '', 'sText': ''}


webpage = requests.get(conv_store_url, data=data)
soup = BeautifulSoup(webpage.content, 'html.parser')
end_page = int(re.findall('\(([^)]+)', soup.select(".paging > a")[-1].get('href'))[0].replace("'", ""))

for i in range(end_page):
    data['cpage'] = i + 1
    webpage = requests.get(conv_store_url, data=data)
    ...

  • data : header에 넣을 값입니다. 전체 검색을 위해 cpage를 제외한 모든 조건은 설정하지 않았습니다.
  • end_page : 마지막 페이지를 구해서 반복 범위를 정합니다.
  • data['cpage'] = i + 1 : page를 1개씩 증가 시키며 크롤링합니다.

2) selenium 사용하기

header를 사용해도 크롤링이 되지 않는 경우에는 어쩔 수 없이 selenium을 사용했습니다.
아래는 selenium으로 크롤링 하는 코드입니다.

driver.get(conv_store_url)
for i in range(end_page):
    conv_list = driver.find_elements_by_xpath('//*[@id="storeInfoList"]/tr')
    for k in range(len(conv_list)):
    ...
    
    driver.find_element_by_xpath(conv_store_next_button).click()
    time.sleep(random.uniform(0.5, 1))

  • for k in range(...) : 현재 페이지의 편의점 리스트에서 편의점 정보를 가져옵니다.
  • .click() : 다음 페이지로 가는 버튼을 클릭합니다.
  • time.sleep(random.uniform(...)) : 랜덤한 딜레이를 주어 크롤링합니다.

selenium을 사용한 방법도 나중에 header만 사용해서 request만 사용하도록 개선해봐야겠습니다.

3. 위치와 서비스 정보 csv로 저장하기

pandas를 이용해 사용할 데이터에 알맞게 dataFrame을 만들고 csv로 저장했습니다.

def to_csv(csv_file_name, conv_stores_info):
    conv_data = pd.DataFrame(conv_stores_info)
    conv_data.columns = ['brand_name', 'branch_name', 'address', 'latitude', 'longitude', 'service']
    conv_data.to_csv(csv_file_name, encoding='utf-8-sig')

여기서 얻은 csv를 db에 넣어 서비스를 했습니다.

4. 추후 개선 방안

  1. 편의점 정보 갱신 주기
    • 매달 서버에서 cronjob 등으로 2주 마다 다시 크롤링 하여 db 갱신
    • 정보 갱신 요청 시 수동으로 따로 갱신
  2. 크롤링 속도 개선
    • 추후 멀티 쓰레딩, 프로세싱 등으로 작업 속도 개선
profile
여러가지를 시도하는 학생입니다

0개의 댓글