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

초칼라님의 프로필 이미지
초칼라

작성한 질문수

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

데이터 추출하기 (복잡한 HTML 구조)

Link를 엑셀로 저장할 때 하이퍼링크 되도록 저장 방법 문의

작성

·

313

0

네이버쇼핑 크롤링 수강 중입니다.

 

데이터를 엑셀로 저장시 링크를 하이퍼링크로 저장하고 싶습니다. 즉, 엑셀 오픈해서 링크를 클릭하면 해당 물건이 바로 열리도록 하고 싶습니다.

 

아래 1번은 되는데, 2번은 되지 않습니다.

문제는 엑셀에서 하이퍼링크 저장시 255자 제한이 있어서 그런 거 같습니다.

 

데이터 저장 시 해결할 방법이 있을까요?

 

 

  1. 네이버 링크

link = '=HYPERLINK("' + "https://www.naver.com" + '","링크")'

 

  1. 쇼핑몰 링크

=HYPERLINK("https://cr.shopping.naver.com/adcr.nhn?x=GwvRQqYCu%2BX8ZwpHCECcSv%2F%2F%2Fw%3D%3DsIn%2F3Yf0iawU%2FzYEzOgBb07i9rrLilELSXaeDEWTHUjtksg%2BYslp4t2Zt1cdDccTdi7DZdZimWRXHZMabDRX2%2B0qx7Bhh0Caeclo2i1Y7qOjFHLn4wLuCnoHhSfPE4oks1bvHhHAfdqzhIkba38yyQMi30QtKP1mA7BYZPpxeJLexWvZfe2todmJfmpbNrXnq6vlxEEPFYikY%2FFgWDJTeh03Mlu1kRkTyoaI3uw69wpRITi0bKHCP2rGy6hahVn%2B%2FZFBJ7H6pZqRmC993ssAkNKg2IE65NtMdlJVi06ALuC2AbCY81f975eS5nfR25FBiP83WAv8GAIoQ0MwLPWeb%2FcJtwFagNdosKd1Zse6UhJ%2BzaLo3YojXuQJMvdaZ%2BI%2FyctBNJeJkeiSk%2FpIY4IZgm7f5ZWpM0X6C8Lqgv9yl84OxyTNOpvF5JKAAUscSxRXpeCJA4vgneLxHO126ixVGIQneuqvZhheEd%2B4ASDHeLEMX6dOjXdNdhYZO31pYVC%2BHCJkBzybiEA%2BrGVfnMGK9vAlypD3xRxtfsji%2Flj2GA5OdSlPOZBN6V54TTL6u%2FzFsCXIMYKkzT061mzrwfgc%2F8GThNu%2B1yBb0rg6nns0Ykn3LVWGr8fvvH1mWvUgXPK6j&nvMid=21813412965&catId=50013800","링크")

답변 2

0

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

image

link 저장할 때 HYPERLINK 함수를 빼셔야 합니다~

 

# 셀레니움 기본 템플릿 templates
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import pyperclip
import pyautogui
from bs4 import BeautifulSoup

# 크롬 드라이버 생성
driver = webdriver.Chrome()

# search_text = pyautogui.prompt("검색어를 입력하세요.")
search_text = "닭가슴살"

# 페이지 이동
url = f"https://search.shopping.naver.com/search/all?query={search_text}"
driver.get(url)

# scroll 전 높이 확인
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # 스크롤 끝까지 내리기
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    time.sleep(0.5)
    # 스크롤 후 높이
    current_height = driver.execute_script("return document.body.scrollHeight")

    # 비교
    if last_height == current_height:
        break

    # 스크롤 전 높이 Update
    last_height = current_height

import pandas as pd

# 상품명, 상세페이지링크, 가격 추출하기
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

data = []

items = soup.select(".product_item__MDtDF")
for item in items:
    name = item.select_one('.product_title__Mmw2K > a').text
    link = item.select_one('.product_title__Mmw2K > a').attrs['href']
    # link = item.select_one('.product_title__Mmw2K > a').attrs['href']
    print(len(link))
    # strip() : 앞뒤 공백 제거
    # soup.select_one('.product-price').text.strip()
    price = int(item.select_one('.price_num__S2p_v').text.split('원')[0].replace(',',''))
    print(name, price, link)  
    data.append([name, price, link])  

df = pd.DataFrame(data, columns=["상품명", "가격", "상세페이지링크"])

df.to_excel("output.xlsx", index=False, engine='xlsxwriter')

0

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

pip install xlsxwriter 를 하고

engine 을 xlsxwriter로 지정해 보시겠어요?

 

df.to_excel("output.xlsx", index=False, engine='xlsxwriter')
초칼라님의 프로필 이미지
초칼라
질문자

동일하게 에러가 발생합니다.

 

=======================

코딩 내용

=======================

 

# 셀레니움 기본 템플릿 templates
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import pyperclip
import pyautogui
from bs4 import BeautifulSoup

# 크롬 드라이버 생성
driver = webdriver.Chrome()

# search_text = pyautogui.prompt("검색어를 입력하세요.")
search_text = "닭가슴살"

# 페이지 이동
url = f"https://search.shopping.naver.com/search/all?query={search_text}"
driver.get(url)

# scroll 전 높이 확인
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # 스크롤 끝까지 내리기
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    time.sleep(0.5)
    # 스크롤 후 높이
    current_height = driver.execute_script("return document.body.scrollHeight")

    # 비교
    if last_height == current_height:
        break

    # 스크롤 전 높이 Update
    last_height = current_height

import pandas as pd

# 상품명, 상세페이지링크, 가격 추출하기
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

data = []

items = soup.select(".product_item__MDtDF")
for item in items:
    name = item.select_one('.product_title__Mmw2K > a').text
    link = '=HYPERLINK("' + item.select_one('.product_title__Mmw2K > a').attrs['href'] + '","링크")'
    # link = item.select_one('.product_title__Mmw2K > a').attrs['href']
    print(len(link))
    # strip() : 앞뒤 공백 제거
    # soup.select_one('.product-price').text.strip()
    price = int(item.select_one('.price_num__S2p_v').text.split('원')[0].replace(',',''))
    print(name, price, link)  
    data.append([name, price, link])  

df = pd.DataFrame(data, columns=["상품명", "가격", "상세페이지링크"])

df.to_excel("output.xlsx", index=False, engine='xlsxwriter')

 

 

 

 

 

 

초칼라님의 프로필 이미지
초칼라

작성한 질문수

질문하기