인프런 커뮤니티 질문&답변

Jung Hun Kim님의 프로필 이미지

작성한 질문수

[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)

openpyxl에서 2중 반복문 사용중 append 사용법에 관해 문의드립니다.

22.01.18 00:53 작성

·

719

1

안녕하세요 선생님, 

우선 선생님의 쉽고 친절한 강의 덕분에 날로 실력이 늘어감을 느껴서 무한한 감사를 느끼고 있습니다.

강의를 완강한 후 나름대로 이것저것 찾아보며 네이버 지도 크롤링을 해보고 있는데요, 한 가지 해결되지 않는 문제가 있어

이렇게 문의 드립니다. 

다름이 아니라 네이버 지도를 json 형태로 받아내서 크롤링을 하고 있는데 타겟 키워드를 입력하면 미리 파일로 되어있는

동네 이름을 불러와서 반복적으로 해당 동네의 타겟 키워드 상점을 크롤링 해오는 구조입니다.

배운대로 openpyxl의 append를 이용해서 저장을 하는데 2중 반복문을 쓰다보니 자꾸 마지막 동네의 결과만 가져와서

파일에 저장되는데 이걸 어떻게 해야 전체 결과물을 한 파일로 다 저장할 수 있을지 여쭤봅니다.

참고로 제 코드는 아래와 같습니다. 

 

import requests
import urllib, openpyxl, time
print('구동중입니다. 잠시만 기다려주세요 ')
target_word = input('검색어를 입력하세요>>> ')
with open('C:/startcoding_crawling/town_list.txt', 'r', encoding='utf-8') as tf:
    keywords = tf.readlines()

    for keyword in keywords:
        keyword = keyword.strip().replace('\t', '') + target_word
        print(keyword, ' 동네의', target_word, ' 결과입니다.\n\n')
        url_keyword = urllib.parse.quote(keyword)
        wb = openpyxl.Workbook()
        ws = wb.active
        ws.append(['상호명', '주소', '연락처'])
        try:
            for i in range(1, 100):
                print('\n', i,'페이지입니다.\n')
                response = requests.get(f'https://map.naver.com/v5/api/search?caller=pcweb&query={url_keyword}&type=all&page={i}&displayCount=40&lang=ko', headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'}).json()
                numbers = response['result']['place']['list']
                for i in range(0,len(numbers)):
                    name = response['result']['place']['list'][i]['name']
                    address = response['result']['place']['list'][i]['roadAddress']
                    tel = response['result']['place']['list'][i]['telDisplay']
                    print(name, address, tel)
                    ws.append([name, address, tel])
                time.sleep(1)
        except:
            print('끝났습니다.')
wb.save(f'{target_word}결과.xlsx')
tf.close()
 
 

분명 append 한 부분을 다시 변수 처리하던지 해서 더 앞 1차 반복문쪽에 append로 넣어야 할 것 같은데 방법을 도저히 모르겠네요.. 구글에 찾아봐도 쉽게 결과가 나오지 않아 이렇게 문의를 남깁니다.

가르침 주시면 감사드리겠습니다. 항상 좋은 강의 감사합니다.

답변 2

1

Jung Hun Kim님의 프로필 이미지
Jung Hun Kim
질문자

2022. 01. 18. 22:47

아 정말 감사합니다. 제가 처음에 키워드 하나만 코드를 짜놨다가 추가한거다보니 기존에 짜놓은것을 생각을 못했네요 며칠동안 속머리 썩던것이 선생님덕분에 시원하게 해결됐습니다. 감사합니다.!! 

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

2022. 01. 19. 01:16

머리 아프고, 계속 고민하는 과정이 있어야 성장하는 겁니다 ^^

모른다고 금방 포기하면 안되고, 끈질기게 물고 늘어져야 합니다ㅎㅎ

최수빈님의 프로필 이미지

2022. 02. 06. 00:24

선생님 영상만 보며 연습하다가 우연히 커뮤니티에서 이 글을 보았네요

json으로 크롤링하는게 참 멋있고 재밌다는 생각이 들었습니다

 

저는 업무에 활용하느라 '생생정보통맛집 서울'과 같은 키워드로 테스트해보게되었는데요

이러한 필터링 검색은 위치정보가 같이 입력되지 않으면 제대로 json이 뜨지 않더라구요

물론 &coords=와 같은 위치정보 옵션값을 달아보기도 했지만 제대로 결과가 뜨지 않습니다

혹시 이런 경우에는 어떤 방법으로 해결하는게 좋을까요?

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

2022. 02. 06. 14:03

안녕하세요~! 수빈님ㅎㅎ

테스트하고 계신 소스코드와 오류나는 부분을 알려주시겠어요? 

1

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

2022. 01. 18. 01:42

안녕하세요~!!

우선 제 강의를 듣고 실력이 일취월장 하셨다니 정말 뿌듯하고 대견스럽습니다 :)

 

프로그래밍에서 반복문이 가장 어렵습니다ㅎㅎ

실무에 있는 개발자들도 반복문이 2중 3중으로 되면 복잡해져서 머리아파 하죠ㅎㅎ

원래 어려운 거니 꾸준히 많이 해보는 수밖에 없습니다.

 

지금 코드를 보면, 당연히 마지막 결과만 저장 될 수 밖에 없습니다.

        wb = openpyxl.Workbook()
        ws = wb.active
        ws.append(['상호명', '주소', '연락처'])

이 부분이 첫번째 for 문 안쪽에 있습니다. 그러니 첫번째 for문을 돌때 마다 매번 새로운 wb를 만들어 내고 있겠죠?

그리고 엑셀 저장은 for문이 끝나고 하고 있습니다. 그러니 마지막 for 문을 돌때 만든 wb만 저장되는 거죠.

 

저라면 위 세코드를 첫번째 코드 밖으로 빼낼 것 같습니다 ^^ 

 

import requests
import urllib, openpyxl, time
print('구동중입니다. 잠시만 기다려주세요 ')
wb = openpyxl.Workbook()
ws = wb.active
ws.append(['상호명', '주소', '연락처'])
target_word = input('검색어를 입력하세요>>> ')

with open('C:/startcoding_crawling/town_list.txt', 'r', encoding='utf-8') as tf:
    keywords = tf.readlines()
    for keyword in keywords:
        keyword = keyword.strip().replace('\t', '') + target_word
        print(keyword, ' 동네의', target_word, ' 결과입니다.\n\n')
        url_keyword = urllib.parse.quote(keyword)
        try:
            for i in range(1, 100):
                print('\n', i,'페이지입니다.\n')
                response = requests.get(f'https://map.naver.com/v5/api/search?caller=pcweb&query={url_keyword}&type=all&page={i}&displayCount=40&lang=ko', headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'}).json()
                numbers = response['result']['place']['list']
                for i in range(0,len(numbers)):
                    name = response['result']['place']['list'][i]['name']
                    address = response['result']['place']['list'][i]['roadAddress']
                    tel = response['result']['place']['list'][i]['telDisplay']
                    print(name, address, tel)
                    ws.append([name, address, tel])
                time.sleep(1)
        except:
            print('끝났습니다.')
wb.save(f'{target_word}결과.xlsx')
tf.close()

이런식으로 말이죠.

 

앞으로도 꾸준히 코딩을 해서 실력을 팍팍 쌓아 보세요~ ㅎㅎ