[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
잔재미코딩 선생님 우선 강의 정말 잘 듣고 있습니다. 감사합니다. ^^ 크롤링 프로그램 완성: 크롤링한 데이터에서 다시 크롤링하기1 (업데이트)에서 질문드립니다. 수업자료에 올려주신 select로 태그를 가져오는 과정에서 지마켓 bestitems는 왜 one으로만 작동하는 건지 궁금합니다. 강의 찍어주시던 시기에는 bestitems 클래스가 2개가 있어서 select_one이 아닌 select를 사용하셨거든요. 이렇게 넣으면 왜 오류가 나는지 궁금해서 글을 남깁니다. 인터넷에 select와 select_one의 차이에 대해 찾아 봤으나 답을 얻지는 못해 문의드리게 되었습니다. 소중한 강의로 코딩을 알아가게 해주신 점 다시 한번 감사드립니다. ^^ #해당 코드 import requests from bs4 import BeautifulSoup res = requests.get(' http://corners.gmarket.co.kr/Bestsellers?viewType=G&groupCode=G06 ') soup = BeautifulSoup(res.content, 'html.parser') # 2022.09.13 수정사항 (웹사이트 코드가 수시로 변경되면서, best-list class 를 가진 태그가 하나이기 때문에 해당 태그만 선택하도록 수정) bestitems = soup.select ('div.best-list') # select_one() 은 해당 조건에 맞는 태그 하나만 선택하는 함수 products = bestitems.select ('ul > li') for index, product in enumerate(products): title = product.select _one('a.itemname') price = product.select _one('div.s-price > strong') print (title.get_text(), price.get_text(), title['href']) #문의 내용 bestitems = soup.select ('div.best-list') ^찾는 값이 1개인 경우에는 무조건 one을 적어야 하는 것일까요?
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 webdriver_manager.chrome import ChromeDriverManager # 크롬 드라이버 자동 업데이트 from selenium.webdriver.common.keys import Keys import time import pyautogui import pyperclip # 브라우져 꺼짐 방비 chrome_options = Options() chrome_options.add_experimental_option("detach", True) # 불필요한 에러 메시지 없애기 chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"] ) 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://map.naver.com/v5") search = driver.find_element(By.CSS_SELECTOR,"input.input_search") search.click() time.sleep(1) search.send_keys("제주 게스트하우스") time.sleep(1) search.send_keys(Keys.ENTER) time.sleep(1) # iframe 안으로 들어가기 driver.switch_to.frame("searchIframe") # iframe 나올 때 # driver.switch_to_default_content() # 무한스크롤 하기 ## iframe 안쪽을 한번 클릭하기 driver.find_element(By.CSS_SELECTOR,"#_pcmap_list_scroll_container").click() ## 로딩된 데이터 갯수 확인 lis = driver.find_elements(By.CSS_SELECTOR,"li.Fh8nG.D5NxL") before_len = len(lis) while True : # 맨 아래로 스크롤을 내린다. driver.find_element(By.CSS_SELECTOR,"body").send_keys(Keys.END) # 페이지 로딩 시간을 준다 time.sleep(1.5) # 스크롤 후 로딩된 데이터 개수 확인 lis = driver.find_elements(By.CSS_SELECTOR,"li.Fh8nG.D5NxL") after_len = len(lis) # 로딩된 데이터 개수가 같다면 반복 멈춤 if before_len == after_len: break before_len = after_len # 데이터 수집 ## lis에 모든 가계의 정보가 담겨있음 for li in lis: # 별점 있는 것만 선택 stars = driver.find_elements(By.CSS_SELECTOR,"span.XGoTG.cN3MU> em") if len(stars)>0: # 가계이름 store_name = li.find_element(By.CSS_SELECTOR,"span.place_bluelink.moQ_p").text star_point = li.find_element(By.CSS_SELECTOR,"span.XGoTG.cN3MU> em") 위에서 store_name까지는 출력이 잘 되는데...star_point를 추가하고 출력하면 아래와 같은 에러가 발생합니다. 아무리 해봐도 해결이 안되네요..
안녕하세요. 네이버 금융 크롤링 강의 중 질문이 있어서, 글 남깁니다. 우선 강의를 보면 아래와 같이, 코딩되어있습니다. soup.select () 코드 중 "onmouseover%" 이 부분 통해서 필요한 정보를 가지고 오고 있습니다. 다만, 제가 실습할때는 참고할 수 있는 값들이 좀 달랐습니다. (아래 캡쳐 화면 참고 부탁드리겠습니다.) 제가 작성한 코드는 가장 아래 코드 참고 부탁드립니다. 우선, 아래와 같이 정보를 가져옵니다. trs = soup.select("table.type_5 > tbody") -> 이 경우 trs값은 [] 빈 리스트로 찍히고 있는데, 제가 혹시 잘못 가져온걸까요? 그 이후, 빈칸의 경우 td[colspan]값으로 확인해서, 아래 코드로 해당 정보는 지우도록 하였습니다. td_cols = tr.select("td[colspan]") for td_col in td_cols: td_col.decompose() import requests from bs4 import BeautifulSoup url = "https://finance.naver.com/sise/field_submit.naver?menu=lastsearch2&returnUrl=http://finance.naver.com/sise/lastsearch2.naver&fieldIds=per&fieldIds=roe&fieldIds=pbr&fieldIds=reserve_ratio" response = requests.get(url) html = response.text soup = BeautifulSoup(html, "html.parser") ## 변경 코드 ## trs = soup.select("table.type_5 > tbody") #trs = soup.select("table.type_5") print("================================") print(trs) print("================================") for tr in trs: print("Sdsd") """td_cols = tr.select("td[colspan]") for td_col in td_cols: td_col.decompose() """ # nth-child 사용하는 방법 name = tr.select_one('td:nth-child(2)').text per = tr.select_one('td:nth-child(7)').text roe = tr.select_one('td:nth-child(8)').text pbr = tr.select_one('td:nth-child(9)').text reserve_ratio = tr.select_one('td:nth-child(10)').text print(name, per, roe, pbr, reserve_ratio) 위 말씀드린 과정을 통해서 코드 수행 시 정상적으로 동작하지 않는데, 관련해서 답변 주시면 감사하겠습니다!!
안녕하세요 먼저 좋은 강의 해주시는 나도코딩님께 감사드립니다. 이전에 나름 정성들여 글을 작성했는데, 확인이 안돼서 다시 작성해봅니다. 제가 강의를 보고있는 2023년 1월 19일과 강의날인 2020년 8월과 네이버 항공권 인터페이스가 많이 상이하고, 셀레니움과 파이썬 버전이 달라 저의경우 아래와 같이 코드를 작성했습니다. 다른분들께 도움이 되었으면 좋겠습니다. 현재 저의 환경의 경우 python버전 3.10.7 버전이고 selenium또한 강의때 사용하신것 보다 더 높은 것으로 보입니다. 현재 제 경우와 강의내용과 상이한 부분은 아래와 같습니다. 네이버 항공권 진입시, "지금 바로 혜택 확인하기" 광고 팝업창 발생, 해당부분 get_attribute메소드를 사용해 title을 비교해, 팝업이 있다면 팝업을 삭제하는 XPATH를 확인해 해당 엘리먼트를 클릭하도록 구현 browser.find_element_by_class_name과 같이 find_element_by_~~ 메소드 사용불가 => 현재 제가 사용중인 셀레니움 버전이 상위 버전으로 보이는데, 이는 3 line과 같이 import By로 쉽게 수정 가능 find_elements_link_text 메소드 사용 불가 => 2020년대비 2023년 현재 네이버 항공권 웹페이지 인터페이스의 변화때문인지 "가는 날" 및 날짜 선택을 위해 해당 메소드 사용시 빈리스트만 반환 "가는 날"은 XPATH로 엘리먼트를 얻어와 클릭하도록 구현 원하는 날짜의 경우 class이름을 확인해 모든 날짜정보를 갖고와 원하는 날짜정보만 사용하도록 구현 (compute_date 함수 참고 부탁 드립니다.) 추가적으로, 이 경우에 1년치 달력정보를 모두 읽어와 속도가 매우 느린데 더 좋은 방법을 알고계신분은 공유 부탁드립니다. ( _ _ ) compute_date(dates, 30)[1].click() 코드를 이렇게 수정해 오는날을 2월 30일을 선택하려 했으나 3월 30일을 선택해, 코드 오류인줄 알고 디버깅해보니 2월달은 30일이 없었습니다...ㅎ 정상동작 중 입니다. 저와같이 초반에 고생하시는 분들께 조금이나마 도움이 되었으면 좋겠습니다. 감사합니다. import time from selenium import webdriver from selenium.webdriver.common.by import By URL = "https://flight.naver.com/" def compute_date(dates, target) -> list: print("compute entire date information from current month to limit") return [date for date in dates if date.text == str(target)] browser = webdriver.Chrome() # browser.maximize_window() browser.get(URL) time.sleep(1) # remove AD popup find = browser.find_elements(By.CLASS_NAME, "anchor") for f in find: if f.get_attribute("title") == "지금 바로 혜택 확인하기": browser.find_element(By.XPATH, '//*[@id="__next"]/div/div[1]/div[9]/div/div[2]/button[1]').click() print("remove pop up") break # push 가는 날 button also delay 1 sec is necessary, if don't use this, can not read date information. browser.find_element(By.XPATH, '//*[@id="__next"]/div/div[1]/div[4]/div/div/div[2]/div[2]/button[1]').click() time.sleep(1) # read date information and push 25 day dates = browser.find_elements(By.CLASS_NAME, "sc-evZas dDVwEk num".replace(" ", ".")) compute_date(dates, 25)[0].click() # read date information and push 30 day dates = browser.find_elements(By.CLASS_NAME, "sc-evZas dDVwEk num".replace(" ", ".")) compute_date(dates, 30)[0].click() while True: pass
[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
- 본 강의 영상 학습 관련 문의에 대해 답변을 드립니다. (어떤 챕터 몇분 몇초를 꼭 기재부탁드립니다) - 이외의 문의등은 평생강의이므로 양해를 부탁드립니다 - 현업과 병행하는 관계로 주말/휴가 제외 최대한 3일내로 답변을 드리려 노력하고 있습니다 - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 12분 25초에 함수를 만들때 return이 3번 들어가도 되는건가요? 마지막에 함수 끝날때만 들어가야하고 조건문에서는 else로 조건문을 닫는다던가 해야하는거 아닌지 궁금합니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 전체 종목을 불러올때 fdr.StockListing('KRX') 으로 받아오는데.. 교수님이 강의해주신 카테고리와 다르게 나오고 있습니다. 혹시나 해서 FinanceDataReader 사용자 안내 가서 봤는데.. 해당 부분에서는 교수님 설명그대로 나오고 있습니다... FinanceDataReader에서 문제가 발생한건가요?
어느 사이트에서든 어떤 태그 내의 id 속성값은 유일무이하게 해당 태그에서만 사용된다고 봐도 정말로 문제없나요? 이전에 html 실습하면서 공부했을 때 id속성이나 class속성이나 두개 사용하면서 크게 다른게 없다고 느꼈는데 이 영상을 보면서 id가 실무에서는 해당 태그에만 적용되도록 사용하는건지 정확히 알고싶습니다.
[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 16:20 초 가량 data.keys() 를 item 에 집어넣으셨는데 그럼 item 은 data 의 키값을 가져오는건데 data[item] 을 하니 벨류값이 나오는지 도무지 이해가 안갑니다 ㅠ 56번도 같은 맥락으로 이해가 안갑니다. 감사합니다
ValueError: unknown format code 'd' for object of type 'str' 이라고 뜨네요 krx/listing.py 에서 df_listing['Symbol'] = df_listing['Symbol'].apply(lambda x: '{:06d}'.format(x)) 이부분에서 x값이 string으로 들어가서 문제가 생기는듯 합니다. 버전은 선생님 버전이랑 같은데 뭐가 문제인지 몰겠네요
안녕하세요, AWS Lightsail 사용 중단 하기 위해서는 어떻게 해야하는지 알 수 있을까요?? 강의 내용 모두 그대로 따라해서 AWS Lightsail 이용 하였구요. 강의 수강 후, 아래와 같이 처리하였는데요. 1) Lightsail 내 인스턴스 삭제 2) Lightsail 탄력적 IP 삭제 3) 깃허브에 올렸던 코드 삭제 그런데 계속 일별로 아주 소액이긴 하지만, 비용이 증가 / 청구 되고 있어서 문의드립니다.
안녕하세요! 크롤링 강의를 듣고 더 배우고 싶어서 스크래피를 듣고 있는 학생입니다. 저는 맥을 사용하고 있기 때문에 영상에서 iterm2를 보고 따라하면서 사용을 하는데 자꾸 zsh: command not found: scrapy 라는 문구가 나옵니다. 이 오류때문에 계속 나아가질 못해서 해결방법이 궁금합니다ㅜㅜ 만약 iterm2 자체 문제이면 기본적으로 설치되어있는 터미널이나, 아나콘다 터미널을 계속 사용해야 하는지 궁금합니다!