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

손과발님의 프로필 이미지
손과발

작성한 질문수

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

페이지를 변수에 넣고 for 문으로 클릭해서 넘기려고 하는데 에러가

작성

·

16

·

수정됨

0

강사님 도움을 요청합니다. 아래의 문제로 몇일을 끙끙이다 현재의 본인의 수준으로는 해결을 못해서 염치불구 하고 도움을 구합니다.

사이트에서 페이지 넘기기가 안됩니다. 코드를 올립니다.

마지막 부분 반복문에서 순차적으로 다음 페이지로 넘기려고 하는데 다 넘어가지 못하고 에러가 납니다.

페이지를 변수에 담아 프린트 해보면 8개의 페지가 찍이는데

반복문으로 넘어가서는 8개의 페지로 순차적으로 이동이 안되고 걸립니다.

코드는 아래와 같이 했습니다. 바쁘실줄 알지만 길이 없어 문의하니 한번 봐주시면 감사하겠습니다.

import requests
from bs4 import BeautifulSoup
import pandas as pd

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()

# 사이트 불러 오기
url = 'https://ctx.cretec.kr/CtxApp/ssp/selectSbarPmtnList.do'
driver.get(url)

# 로그인 

user_id = ''
user_pw = ''

# 로그인 완료 후 신바람 화면으로 넘어감
id = driver.find_element(By.CSS_SELECTOR, '#ctxId' )
id.send_keys(user_id)
time.sleep(1)

pw = driver.find_element(By.CSS_SELECTOR,'#password')
pw.send_keys(user_pw)
time.sleep(1)

login = driver.find_element(By.CSS_SELECTOR, '#ctxUserVO > button')
login.click()
time.sleep(3)

tag = driver.find_element(By.CSS_SELECTOR,'#content-container > div.content > div.content-body > div > div.sub_promo_cnt > div:nth-child(24) > div.promore > span')
driver.execute_script("arguments[0].scrollIntoView(true)", tag)
time.sleep(5)

tag.click()

tag2 = driver.find_elements(By.CSS_SELECTOR, '#list ul li.cur-pager > a')
time.sleep(5)
print(len(tag2))
time.sleep(5)

for i in tag2:
    time.sleep(10)

    print(i.text)
    time.sleep(15)
    
    i.click()
    time.sleep(10)

답변 2

0

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

image.png

로그인 후 태그를 찾는 과정에서 오류가 나는데..
어떤 걸 찾으려고하는지 알려주셔야 할거 같아요 ㅎㅎ

0

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

안녕하세요

아이디랑 비밀번호 노출되었습니다

우선 빠르게 가려주세요!

손과발님의 프로필 이미지
손과발
질문자

강사님 아이디 비밀번호는 노출 되어도 무방합니다.

강사님

강사님 확인시 에러난 부분은 , 11월 15일 에서 11월 16일로 상품들이 바뀌어서 이전에 코딩할 때의 상품이 11월 16일이 되면서 다른 상품으로 변경되어 나는 에러 같습니다 이것은 문제가 안됩니다.

다시 코딩 한 것을 올리면

import requests
from bs4 import BeautifulSoup
import pandas as pd

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()

# 사이트 불러 오기
url = 'https://ctx.cretec.kr/CtxApp/ssp/selectSbarPmtnList.do'
driver.get(url)

# 로그인 



user_id = ''
user_pw = ''

# 로그인 완료 후 신바람 화면으로 넘어감
id = driver.find_element(By.CSS_SELECTOR, '#ctxId' )
id.send_keys(user_id)
time.sleep(1)

pw = driver.find_element(By.CSS_SELECTOR,'#password')
pw.send_keys(user_pw)
time.sleep(1)

login = driver.find_element(By.CSS_SELECTOR, '#ctxUserVO > button')
login.click()
time.sleep(3)

# 상품  "더보기447" 을 클릭해서 리스트 페이지로 들어감
tag = driver.find_element(By.CSS_SELECTOR, '#content-container > div.content > div.content-body > div > div.sub_promo_cnt > div:nth-child(10) > div.promore > span')
tag.click()
time.sleep(5)

# 클릭된 상품의 리스트 페이로 이동 해서  맨 하단의  10 페이지 까지 페이지 수가 나열됨 
# 이 10 개의 페이지 선택자를 복사해  "tag2" 변수에 넣고 "for 문으로 반복해서 돌아가며 클릭하게 함"
tag2 = driver.find_elements(By.CSS_SELECTOR, '#list ul li.cur-pager > a')
time.sleep(5)
print(len(tag2))
time.sleep(5)

# 아래 반복문에서 페이지를  순서대로 1페이지 2페이지 3페이지...마지막페이지 돌게 하는 코드를 짜려는데 안된네요
for i in tag2:
    time.sleep(10)

    print(i.text)
    time.sleep(15)
    
    i.click()
    time.sleep(10)

아래의 페이이지의 10페이지까지 반복문으로 코딩을 해서 1페이를 클릭하고 그다음 2 페이지를 클리하고 그다음 3페이지를 클릭, 이렇게 마지막페이지 까지 돌게 하려고 하는데 1페이지에서 걸리고 어떤 때는 2페지에서 걸리고 반복문이 마지막 페이지 까지 실행이 안되네요

# 리스트 페이지의 페이지 선택자를  "tag2" 의 변수에 넣음
tag2 = driver.find_elements(By.CSS_SELECTOR, '#list ul li.cur-pager > a')
time.sleep(5)
print(len(tag2))
time.sleep(5)

# 아래 반복문에서 페이지를  순서대로 1페이지 2페이지 3페이지...마지막페이지 돌게 하는 코드를 짜려는데 안된네요
for i in tag2:
    time.sleep(10)

    print(i.text)
    time.sleep(15)
    
    i.click()
    time.sleep(10)

위의 반복문에서 페지가 10 개인데 10페이지까지 반복하면서 이동이 안되고 중간에 에러가 나버립니다.

  1. 리스트 페이지를 설정에서 확인해보면 동적페이지고

  2. 폼태그로 감싸진 테이블 테그라서 그런지( 아이프램은 아닌 것같고)

  3. time 문제로 페이지가 로딩되기 전에 반복문이 실행 되어서 그런지

  4. 반복문 중 클릭시점에 페이지가 가리워 져 클릭이 안되나 싶어 스크롤을 페이지 숫자가 다 보이도록 내려 놓고 for 문을 돌려도 안되고

도무지 방법을 찾을 수가 없네요.

강사님 함 확인해주시면 감사하겠습니다.

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

for i in range(1, 11):
    # url의 page 파라미터를 변경해가면서 페이지 이동 하시면 될거 같아요
    driver.get(f"https://ctx.cretec.kr/CtxApp/ctx/selectPowerSearchList.do?keyword=&smartKeyword=&prod_cd=&item_nm=&brnd_nm=&item_stdz=&modl_no=&agg_brnd_cd=&agg_pmtn=&agg_contentInfo=&agg_origCounDest=&sort=&agg_cate_1=&agg_cate_2=&agg_cate_3=&agg_cate_4=&pmtn_cls_cd=11&pmtn_seq=14&pmtn_year=2024&pmtn_cnt=1102&comp_cd=W&cateSearch=&pmtnSearch=Y&page={i}&rows=&listType=&prodcontents=&prod_cd_multi=&include_delete=Y")
    time.sleep(5)

클릭을 하면서 페이지를 이동시키는 것보다는 URL을 변경하는게 훨씬
쉬워 보입니다!! 참고로 파라미터의 value 값이 없는 애들은 생략해도 돼요~

손과발님의 프로필 이미지
손과발

작성한 질문수

질문하기