무료
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
질문드립니다
import requests from bs4 import BeautifulSoup from openpyxl import Workbook keyword = input("검색어를 입력하세요") lastpage = input("마지막 페이지 번호를 입력해 주세요") pageNum = 1 for i in range(1, int(lastpage) * 10, 10): print(f"{pageNum}페이지 입니다.~~~~~~~~~~~~~~~~~") response = requests.get(f"https://search.naver.com/search.naver?sm=tab_hty.top&where=news&query={keyword}&start={i}") html = response.text soup = BeautifulSoup(html, 'html.parser') links = soup.select(".news_tit") wb = Workbook() ws1 = wb.active ws1.title = "연습" ws1.append(["제목", "링크"]) print(links) for link in links: title = link.text url = link.attrs['href'] print(title, url) ws1.append([title, url]) pageNum = pageNum + 1 wb.save(filename='연습.xlsx') 네이버 기사 제목과 url 수집한 걸 엑셀에 옮겨보려고 합니다. 터미널에서는 마지막 페이지 번호 입력를 4로 했다고 하면 총 40개의 제목과 링크가 나타나는데 엑셀에는 옮겨지기는 하는데 10개의 기사 제목, 링크만 옮겨집니다. 어떻게 수정해주어야 할까요?
- 해결됨[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
셀레니움_for 문 질문
안녕하십니까양질의 강의 잘 듣고 있습니다. 감사합니다. 네이버 쇼핑에 아이폰13을 검색하는 부분에 관하여질문드리고 싶은 부분이 있습니다. 무한스크롤에 크롤링까지는 잘 되지만, 가장 상단의 결과 딱 하나만 가져와지고, 나머지 항목들은 크롤링이 되지 않습니다. 반복문에 문제가 있는 것으로 추정되는데 어디가 문제인지 찾는데 어려움이 있습니다. 긴 글 읽어주셔서 감사하고, 아래는 제가 강사님 따라한 코드입니다. # 셀레니움에서 스크롤을 자동으로 내리고 크롤링하는 방법을 알아보자. import imp from lib2to3.pgen2 import driver from tkinter import BROWSE from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time # 크롬 드라이버 자동 업데이트 from webdriver_manager.chrome import ChromeDriverManager # 브라우저 자동으로 꺼짐 방지 chrome_options = Options() chrome_options.add_experimental_option("detach", True) # 불필요한 에러 메시지 삭제 chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) # 셀레니움으로 웹브라우저 자동으로 띄우기 # ChromeDriverManager를 통해서 ChromeDriver를 설치하고, Service라는 객체를 만든 뒤, service라는 변수에 저장한다 service = Service(executable_path=ChromeDriverManager().install()) driver = webdriver.Chrome(service=service, options=chrome_options) # 특정 웹페이지 주소로 이동 driver.implicitly_wait(5) # 웹페이지가 로딩 될때까지 5초는 기다려준다 driver.maximize_window() # 화면 최대화 driver.get('https://www.naver.com/') # 네이버 열기 # 쇼핑 배너 클릭 banner = driver.find_element(By.CSS_SELECTOR, '#NM_FAVORITE > div.group_nav > ul.list_nav.type_fix > li:nth-child(5) > a') # 네이버 쇼핑 배너의 selector banner.click() # id라는 변수를 클릭하라는 명령어다 time.sleep(2) # 쇼핑 배너를 클릭한 뒤, 아직 페이지가 뜨지도 않았는데 바로 다음 명령어가 실행될 수도 있으니까, 2초 정도 여유를 준다. # 쇼핑 페이지에서 검색 클릭 search = driver.find_element(By.CSS_SELECTOR, '#_verticalGnbModule > div > div._header_header_REoTl > div > div._gnb_header_shop_Xd6Hq > div > div._gnbSearch_search_area_3LAyd > form > fieldset > div > input') # 네이버 쇼핑 배너의 selector search.click() # id라는 변수를 클릭하라는 명령어다 # 검색어 입력 search.send_keys('아이폰 13') search.send_keys(Keys.ENTER) # 검색어를 입력하고, 엔터를 치라는 명령어 # 무한 스크롤: 동적 사이트에서 자동으로 스크롤을 가장 아래까지 내려주는 알고리즘 # 스크롤을 내리기 전 기본이 되는 높이 before_h = driver.execute_script('return window.scrollY') while True: # 맨 아래로 스크롤을 내린다. driver.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END) # 대부분의 웹페이지는 body 태그가 다 있다. 이걸 이용하고, END를 통해 맨 아래까지 스크롤 내림 # 너무 빠르면 오류가 생기니까 스크롤 사이에 페이지 로딩 시간을 주자. time.sleep(1) # 스크롤 후 높이 after_h = driver.execute_script('return window.scrollY') if after_h == before_h: break before_h = after_h # 상품정보 div items = driver.find_elements(By.CSS_SELECTOR, '#__next > div > div.style_container__1YjHN > div.style_inner__18zZX > div.style_content_wrap__1PzEo > div.style_content__2T20F > ul > div > div:nth-child(1) > li > div > div.basicList_info_area__17Xyo') for item in items: name = item.find_element(By.CSS_SELECTOR, '#__next > div > div.style_container__1YjHN > div.style_inner__18zZX > div.style_content_wrap__1PzEo > div.style_content__2T20F > ul > div > div:nth-child(1) > li > div > div.basicList_info_area__17Xyo > div.basicList_title__3P9Q7').text price = item.find_element(By.CSS_SELECTOR, '#__next > div > div.style_container__1YjHN > div.style_inner__18zZX > div.style_content_wrap__1PzEo > div.style_content__2T20F > ul > div > div:nth-child(1) > li > div > div.basicList_info_area__17Xyo > div.basicList_price_area__1UXXR > strong > span > span.price_num__2WUXn').text link = item.find_element(By.CSS_SELECTOR, '#__next > div > div.style_container__1YjHN > div.style_inner__18zZX > div.style_content_wrap__1PzEo > div.style_content__2T20F > ul > div > div:nth-child(1) > li > div > div.basicList_info_area__17Xyo > div.basicList_title__3P9Q7 > a').get_attribute('href') print(name, price, link)
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
webdriver_manager.chrome.ChromeDriverManager 질문드립니다
안녕하세요! 강의에서 수동으로 크롬드라이버를 설치하는 번거로움을 해결하기위해 webdriver_manager모듈에 있는 ChromeDriverManager를 사용한다고 말씀해주셨는데, ChromeDriverManager가 최신 크롬드라이버를 제 컴퓨터 경로 어딘가에 대신 직접 다운받아 주는 건가요? 그렇다면 만약 크롬 버전이 업데이트되면 해당 버전에 맞는 크롬드라이버를 ChromeDriverManager가 다운받고 이전 버전은 삭제해주는 식으로 관리를 해주는지, 아니면 이전 버전은 제가 따로 직접 삭제해줘야하는지 궁금합니다.
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
webdriver.implicitly_wait()과 time.sleep()의 차이점이 궁금합니다.
안녕하세요! 우선 이렇게 좋은 강의로 지식공유해주셔서 정말 감사합니다. 강의 중에 셀레늄라이브러리를 활용해 크롤링 하는 경우 브라우저에 웹페이지가 로딩될 때까지 기다려주는 것이 중요하기 때문에 implicitly_wait()와 time.sleep()같은 메서드를 사용해 주는 것이 중요한 것은 알겠는데 실제 크롤링을해 작업을 한다고 할 때, 이 둘의 차이가 뭔지 궁금합니다. 구글링해보니까 webdriver의 경우 explicitly_wait()메서드도 있는데 이 부분이 잘 이해가 가질 않아서 질문드립니다. 추가로 implicitly_wait()메서드의 경우 driver.get()이전에 사용해야 하는 건가요?? 추가로 올려주신 네이버 로그인 자동화 강의에서는 driver.get()위에 적혀있어서요. 순차적으로 실행되서 driver.get()메서드 아래에 있어야 하는 줄 알아서 추가 질문드립니다.
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
pip 오류
구글링해서 나오는 방법들 다 해보고 기존 방법들 안되었던 분이 올린 방법들도 다 해봤는데 여기서 넘어가지를 못하고 있네요. 환경변수도 잘 추가되어있고 그런데 대체 뭐가 문제일까요? 며칠째 이화면만 보고있어요.
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
colab에서 강의를 적용하려면 어떻게 해야할까요?
안녕하세요, 선생님. 선생님의 강의를 local PC에서 학습한 후에 구글 colab 환경에서도 진행하고자 하였는데요. 아래 전체 코드에서 import requests import os # 로컬에선 어쩐지 이것도 넣어줘야 한다 from bs4 import BeautifulSoup #네이버 서버에 대화를 시도한다. 네이버야, 내가 입력한 주소에서 사용하는 html 코드 정보를 줘 response = requests.get("https://www.naver.com") #네이버에서 html 을 주면 html이라는 변수에 담는다 html = response.text # html 변수에 담긴 정보를, 번역해줘! (=아름다운 스프를 만들어줘) 라는 명령을 #soup라는 변수에 담는다. soup = BeautifulSoup(html, 'html.parser') #Soup 대소문자 유의.html.parser는 html 번역 선생님이라는데 무슨 뜻인진 #(soup 변수 실행해서 번역된 값에서) id 값이 NM_SET_home_btm인 놈 하나를 찾아줘 word = soup.select_one("#NM_set_home_btn") # F12에서 확인한 id 앞에 #을 붙여준다. #찾은 것에서 텍스트 요소만 출력해줘 print(word.text) response = requests.get("https://www.naver.com") 부분부터 KeyError: <_SSLMethod.PROTOCOL_TLS_CLIENT: 16> 라는 에러가 뜨며 진행되지 않습니다. 본래 구글 colab에서는 이 코드가 적용되지 않는 것인지 알 수 있을까요?
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
셀레니움 기본설정 강의를 들으며 코드를 작성했는데 실행되질 않습니다..
안녕하세요, 최근에 startcoding님의 크롤링 강의를 보며 공부하고 있는 한 학생입니다. 그런데 공부하는 도중, 한 문제가 발생하였습니다. 원래라면 구글링을 통해 해결할 수 있었는데,도저히 해결되질 않아서 여쭤봅니다. 제가 본 강의는 '(BONUS) 셀레니움 ver 4.0 가이드 + 크롬 드라이버 자동으로 다운 받는 법'입니다. 또한 이 강의를 통해 작성한 코드는 다음과 같습니다. from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options # 크롬 드라이버 자동 업데이트 from webdriver_manager.chrome import ChromeDriverManager # 브라우저 꺼짐 방지 chrome_options = Options() chrome_options.add_experimental_option("detach", True) service = Service(executable_path=ChromeDriverManager().install()) driver = webdriver.Chrome(service=service, options=chrome_options) # 웹페이지 해당 주소 이동 driver.get("https://www.naver.com") 그리고 이 코드를 실행시켰을 때 발생한 오류는 아래와 같습니다. 이 문제에 대하여 제가 구글링을 해 본 결과, 같은 오류를 겪은 사람을 찾을 수 있었습니다. 하지만 이 문제에 대한 해답으로 webdriver_manager 설치를 내놓은 것 같은데, 저는 이미 webdriver_manager가설치되어 있기 때문에 무엇이 잘못된 것인지 잘 모르겠습니다... 그래서 이 오류를 해결할 수 있는 방법을 여쭤보고자 합니다.읽어주셔서 감사합니다 :) + 저와 같은 문제를 겪은 사람을 찾았던 사이트도 올려놓겠습니다.https://stackoverflow.com/questions/72868256/chromedrivermanager-install-doesnt-work-webdriver-manager + 혹시 모르니 제가 가지고 있는 pip list도 올려놓겠습니다.
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
네이버까지는 들어가지는데 네이버 쇼핑이 안떠요 ㅠㅠ
안녕하세요 사진과 같이 코드를 따라 썼는데 네이버 메인까지는 들어가지는데 이후 네이버 쇼핑란이 안뜹니다 ㅠㅠ (* DeprecatedWarning 및 셀레니움 경고 메시지를 안뜨게 하는 방법 도 수행해보았는데 똑같아요) 그래서 그 다음 코드는 수행해보지 못하고 있어요 뭐가 문제일까요? 오타도 확인했는데 오타는 없는거 같아 보여요 참고로 저는 browser.find_element_by_css_selector 작성할떄 browser.find_element까지만 자동완성되고 이후는 자동완성으로 안뜨는데 뭔가 설치가 안된 기능이 있는걸까요? 참고로 오류 메시지는 다음과 같이 출력됩니다 AttributeError: 'WebDriver' object has no attribute 'find_element_by_css_selector' (base) C:\startcoding>[1364:12544:0626/121605.283:ERROR:device_event_log_impl.cc(214)] [12:16:05.283] USB: usb_device_handle_win.cc:1048 Failed to read descriptor from node connection: 시스템에 부착된 장치 가 작동하지 않습니다. (0x1F) [1364:12544:0626/121605.345:ERROR:device_event_log_impl.cc(214)] [12:16:05.345] USB: usb_device_handle_win.cc:1048 Failed to read descriptor from node connection: 시스템에 부착된 장치가 작동하지 않습니다. (0x1F) [1364:13436:0626/121658.110:ERROR:util.cc(127)] Can't create base directory: C:\Program Files\Google\GoogleUpdater [6104:9888:0626/121757.755:ERROR:gpu_init.cc(486)] Passthrough is not supported, GL is disabled, ANGLE is
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
셀레니움 기초 사용법 - find_element_by_css_selector가 존재하지 않습니다.
네이버 페이지가 열리는 것까지는 되는데 그 후에 쇼핑탭을 클릭하기 위해서 find_element_by_css_selector함수를 이용하니 사진과 같은 에러가 뜹니다. 혹시 관련이 있을까 싶어 셀레니움 설치 시 오류메세지가 뜬 것도 함께 첨부합니다! ERROR: conda 4.12.0 requires ruamel_yaml_conda>=0.11.14, which is not installed. ERROR: requests 2.24.0 has requirement urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1, but you'll have urllib3 1.26.9 which is incompatible. Installing collected packages: h11, wsproto, async-generator, sniffio, outcome, trio, trio-websocket, urllib3, selenium Attempting uninstall: urllib3 Found existing installation: urllib3 1.25.9 Uninstalling urllib3-1.25.9: Successfully uninstalled urllib3-1.25.9 Successfully installed async-generator-1.10 h11-0.13.0 outcome-1.2.0 selenium-4.3.0 sniffio-1.2.0 trio-0.21.0 trio-websocket-0.9.2 urllib3-1.26.9 wsproto-1.1.0
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
크롤링시 url 변화 부분 중
"삼성전자" 검색, 1page https://search.naver.com/search.naver?where=news&sm=tab_pge&query=삼성전자&sort=0&photo=0&field=0&pd=0&ds=&de=&cluster_rank=40&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:all,a:all&start=1 "삼성전자" 검색, 2page https://search.naver.com/search.naver?where=news&sm=tab_pge&query=삼성전자&sort=0&photo=0&field=0&pd=0&ds=&de=&cluster_rank=62&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:all,a:all&start=11 여기서 초록 글씨를 변수로 두는 것은 이해가 가는데, 붉은 글씨는 requests.get() 안에 들어가지 않아도 크롤링이 되는 이유는 무엇인가요?
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
왜 오류가 난건지ㅠㅠ
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유 typeerror 가 났는데 해결방법이 어떻게 될까요 ㅠㅠ?
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
크롤링 실전 강의 문의드립니다
실전 강의 커리큘럼의 쿠팡 크롤링에서 혹시 어떤 항목들을 크롤링하는지 자세히 알 수 있을까요?
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
실행시 한글이 깨지는데 어떻게 해야 하나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
실시간으로 올라오는 뉴스기사
실시간으로 올라오는 뉴스데이터도 바로 크롤링해서 알림이 가능한가요??
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
주식 크롤링 이름 받아오는 법
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 친절하신 설명 덕분에 현재가 받아오는 방법은 충분히 완료하였습니다. 지금은 추가로 주식의 이름을 받아오고 싶은데 아래와 같은 조건이면 soup.select_one() 괄호 안에 들어갈 html코드를 무엇을 잡아야 할 지 감이 안잡혀서 질문드립니다. <h2> <a href="#" onclick="clickcr(this, 'sop.title', '', '', event);window.location.reload();">삼성전자</a> </h2> 잘 부탁드리겠습니다.
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
블로그 업로드 관련
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강사님, 안녕하세요 :) 강사님의 강의를 너무 좋아하는 학생입니다. 개인적으로 공부 블로그를 운영 중인데, 출처와 함께 수업 중 다룬 내용 업로드가 가능할지 문의 드립니다. 답변 주시면 참고하도록 하겠습니다. :) 감사합니다!
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
무한 스크롤 질문드립니다.
안녕하세요 먼저 좋은 강의 감사드립니다. 강의를 보고 크롤링을 시도하던 중 무한 스크롤부분에서 문제점이 발생했습니다. 제가 크롤링 하려고 한 사이트에서 전체 데이터를 보기 위해서는 무한 스크롤을 진행 해야 하는데, 데이터 더보기를 클릭하면 오로지 마우스 스크롤로 밖에 내려갈 수 없는 창이 등장합니다. 이곳에서 스크롤을 진행하려면 셀레니움으로는 불가능 한건가요? 키보드의 pgdn키나 end키가 사용불가능하고 옆에 스크롤창이 등장하긴 하지만, F12키를 누르면 스크롤창클릭할 수 있는 태그가 존재하지 않습니다.
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
엑셀 내용 저장
안녕하세요 스타트 코딩님 엑셀에 내용을 저장하는 부분이 잘 되지 않아 질문드립니다. 처음에 아래와 같은 mkl-service 패키지 관련 에러가 발생해 관련 해당 사이트를 통해 install하였으나 C:\Users\user\anaconda3\lib\site-packages\numpy\__init__.py:143: UserWarning: mkl-service package failed to import, therefore Intel(R) MKL initialization ensuring its correct out-of-the box operation under condition when Gnu OpenMP had already been loaded by Python process is not assured. Please install mkl-service package, see http://github.com/IntelPython/mkl-service from . import _distributor_init 설치 후 코드에 from . import _mklinit 위 코드를 입력하였는데도 C:\Users\user\anaconda3\lib\site-packages\numpy\__init__.py:143: UserWarning: mkl-service package failed to import, therefore Intel(R) MKL initialization ensuring its correct out-of-the box operation under condition when Gnu OpenMP had already been loaded by Python process is not assured. Please install mkl-service package, see http://github.com/IntelPython/mkl-service from . import _distributor_init Traceback (most recent call last): File "C:\startcoding_crawling\02_파이썬엑셀다루기\01_엑셀만들기.py", line 2, in <module> import mkl File "C:\Users\user\anaconda3\lib\site-packages\mkl\__init__.py", line 49, in <module> from . import _mklinit ImportError: DLL load failed while importing _mklinit: 시스템에서 파일에 액세스할 수 없습니다. 위와 같은 에러가 뜨면서 저장이 되지를 않습니다. 이런 경우 어떻게 해야하나요?? 구글링을 통해 아래의 사이트를 발견하기는 했는데 여기서 어떻게 해결해야할지를 잘 모르겠습니다ㅠㅠ https://conda.io/projects/conda/en/latest/user-guide/troubleshooting.html#numpy-mkl-library-load-failed
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
select() class명 질문입니다.
안녕하세요. 좋은 강의 제공해주셔서 감사합니다! 제 블로그에 있는 제목들을 크롤링 해보고 싶어서 코드를 작성하고 있는데, 첨부한 사진과 같은 클래스 명이 있어서 test = bsObject.select(".sc-dtMgUX fmewbM") 위와 같이 작성을 해도 받아오질 못해서 구글링을 해봤는데도 해결을 못해서 질문 올립니다... 전체 코드입니다. import requestsfrom bs4 import BeautifulSoupres = requests.get("https://velog.io/@0__h0__")bsObject = BeautifulSoup(res.text, "html.parser")test = bsObject.select(".sc-dtMgUX fmewbM")print(test)
- 미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
선생님 선택자 태그에 대해 질문드리고 싶은게 있습니다
네이버 쇼핑 링크에서 class가 nav shop이고 영상에서 선택자를 찾아보라고 하셨을때 a.nav.shop라고 하셨는데 왜 a.nav.shop가 되는지 알고싶습니다.. 왜 a.nav.shop으로 되는지 모르겠네요 ㅠㅜ...(수업을 다 보니까 input.co_srh 이것두 궁금합니다..!)