개발자

파이썬 크롤링 후 저장까지

2023년 06월 09일조회 124

A와 B코드가 있는데 다른점은 크롤링URL, 저장파일 이름만 다를 뿐 나머지는 동일합니다 그런데 A코드는 최종 엑셀저장까지 되는데 B코드는 엑셀저장까지 안되네요 오류뜨는 건 없고 크롤링까지도 둘다 잘 됩니다. 해결 부탁드리겠습니다..

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 2

김현진님의 프로필 사진

코드를 첨부해주시는 것도 답변에 더욱 도움이 될 수 있습니다. B코드의 저장파일 이름에 문제가 있는 것은 아닐까요? 이미 동일한 이름의 파일이 존재한다거나 아니면 특수문자등이 있어 사용할 수 없는 파일명이라던가요. B코드의 크롤링 url도 다르다고 하셨으니 저장이 문제인지 크롤링이 문제인지 확인을 위해 로그를 찍어 확인해 보는 것도 좋겠습니다.

윤찬종님의 프로필 사진

업로드한 코드가 엑셀저장이 안되는 b코드이며 상단에 url과 하단 엑셀 저장 이름만 변경 함 url은 네이버쇼핑 카테고리에 따라 url변경

1from webdriver_manager.chrome import ChromeDriverManager
2from selenium import webdriver
3from selenium.webdriver.chrome.service import Service
4import time
5from bs4 import BeautifulSoup
6from openpyxl import Workbook
7
8
9
10
11url="https://search.shopping.naver.com/search/category/100000930?catId=50000439&origQuery&pagingIndex=1&pagingSize=80&productSet=&query&sort=rel&timestamp=&viewType=list"
12
13chrome_options=webdriver.ChromeOptions()
14driver=webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
15driver.get(url)
16
17previous=driver.execute_script("return document.body.scrollHeight")
18interval=1
19
20while True:
21    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
22    time.sleep(interval)
23    current=driver.execute_script("return document.body.scrollHeight")
24    
25    if previous == current:
26        break
27        
28    previous=current  
29    
30    
31soup=BeautifulSoup(driver.page_source, "html.parser")
32items=soup.find_all("div", attrs={"class": "product_item__MDtDF"})
33
34
35
36#엑셀로 저장하기 세팅
37wb = Workbook()
38ws1 = wb.active
39ws1.title = "네이버쇼핑크롤링"
40ws1.append(["제품명", "가격", "제품설명", "url"])
41
42
43
44
45try:
46    
47    
48    
49    for i, item in enumerate(items):
50
51        title=item.find("div",attrs={"class":"product_title__Mmw2K"}).text
52        price=item.find("span",attrs={"class":"price_num__S2p_v"}).text
53        detail=item.find("div",attrs={"class":"product_detail_box__QjZP8"}).text
54        url=item.find("a")["href"]
55        
56        print(title)
57        print(price)
58        print(detail)
59        print(url)
60        
61        
62        #엑셀에 저장하기
63        ws1.append([title, price, detail, url])
64
65        
66        
67    wb.save(filename='naversp스킨토너.xlsx')
68        
69    
70
71except Exception:
72    pass
김현진님의 프로필 사진

김현진

퍼블리 소프트웨어엔지니어2023년 06월 09일

url과 filename만 바뀌고 다른데는 동일한데 저장만 되는거라면 for문에서 에러가 발생했을 때 try except에서 pass로 처리해서 에러가 발생했지만 별도 표시가 안되고 있는 것 일수 있습니다. except Exception as e: print("An error occurred:", str(e)) 으로 변경해서 확인을 해보면 어떨까요? 해당 url에서 item.find에서 에러가 발생했고 바로 except에서 pass되어 종료되었을 수 있을 듯합니다

김현진님의 프로필 사진

김현진

퍼블리 소프트웨어엔지니어2023년 06월 09일

코드상의 url을 확인해보았는데 item.find("div",attrs={"class":"product_detail_box__QjZP8"})가 없는 item이 있네요 "스킨수티컬즈 C E 페룰릭 30ml" 제품 보면 product_detail_box__QjZP8가 없습니다. 예외처리 해주시면 될거 같아요

윤찬종님의 프로필 사진

윤찬종

작성자

비티지 마케팅팀 팀원2023년 06월 09일

그럼 해당 클래스가 없으면 무시하고 다음 상품 클래스확인하여 진행하는 코드는 많이 복잡한가요? ㅎㅎ 더럽게 어렵네요 ㅜㅜ

김현진님의 프로필 사진

김현진

퍼블리 소프트웨어엔지니어2023년 06월 09일

그리 어렵지 않습니다ㅎㅎ item.find가 값이 없는데 .text로 접근하는 것이 문제가 되니 이 부분을 막아주시면 됩니다. title_element = item.find("div", attrs={"class": "product_title__Mmw2K"}) title = title_element.text if title_element else "" price_element = item.find("span", attrs={"class": "price_num__S2p_v"}) price = price_element.text if price_element else "" detail_element = item.find("div", attrs={"class": "product_detail_box__QjZP8"}) detail = detail_element.text if detail_element else "" 로 바꿔주시면 각 항목들이 없을 때 문제없이 예외처리가 될 겁니다.

윤찬종님의 프로필 사진

윤찬종

작성자

비티지 마케팅팀 팀원2023년 06월 09일

오! 해결되었습니다 감사합니다 ㅜㅜ

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!