개발자
A와 B코드가 있는데 다른점은 크롤링URL, 저장파일 이름만 다를 뿐 나머지는 동일합니다 그런데 A코드는 최종 엑셀저장까지 되는데 B코드는 엑셀저장까지 안되네요 오류뜨는 건 없고 크롤링까지도 둘다 잘 됩니다. 해결 부탁드리겠습니다..
답변 2
코드를 첨부해주시는 것도 답변에 더욱 도움이 될 수 있습니다. B코드의 저장파일 이름에 문제가 있는 것은 아닐까요? 이미 동일한 이름의 파일이 존재한다거나 아니면 특수문자등이 있어 사용할 수 없는 파일명이라던가요. B코드의 크롤링 url도 다르다고 하셨으니 저장이 문제인지 크롤링이 문제인지 확인을 위해 로그를 찍어 확인해 보는 것도 좋겠습니다.
윤찬종
작성자
비티지 마케팅팀 팀원 • 2023년 06월 09일
댓글로 코드 첨부하였습니다
업로드한 코드가 엑셀저장이 안되는 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×tamp=&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일
오! 해결되었습니다 감사합니다 ㅜㅜ
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!