강의에서 기능 구현을 빠르게 하기위해 브라우저 화면 로딩이 끝날 때까지 time.sleep 으로 코드 진행을 멈추도록 작성되어 있습니다. 강의 도중에 해당 부분을 다른 방법으로 변경한다고 언급했는데, 변경되지 않은 채로 강의가 종료되었습니다. 이 부분은 어떻게 개선될 수 있을까요? 일반적으로는 webdriver에서 제공하는 implicitly_wait을 이용하는 것으로 알고 있는데, 더 나은 방법이 있을까요?
[이웃신청] 추출한 블로거의 계정에 이웃신청을 해봅시다 1 위 강의에서 서이추 화면 URL 에러가 왜 발생한건가요? 에러라고 말씀하신 URL로 GET을 날려봤는데, 크롬 웹 드라이버가 아무런 반응을 하지 않더라구요. 혹시 다른 사이트 자동화를 할 때, 어떻게 지금처럼 "URL 에러구나" 라고 판단할 수 있는지 궁금합니다. 그리고 이를 우회하기 위해서 모바일 페이지의 URL을 이용하신 것 같은데, 혹시 블로그에서 모바일 URL을 제공하지 않았다면 방법이 없었을까요?
23년 2월 7일 현재, 강의해주신 다음부동산의 화면이 상이해 네이버 부동산을 이용해서 비슷하게 따라해봤습니다. import requests from bs4 import BeautifulSoup url = "https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%EC%86%A1%ED%8C%8C+%ED%97%AC%EB%A6%AC%EC%98%A4%EC%8B%9C%ED%8B%B0+%EB%A7%A4%EB%AC%BC&oquery=%EC%86%A1%ED%8C%8C+%ED%97%AC%EB%A6%AC%EC%98%A4%EC%8B%9C%ED%8B%B0+%EB%A7%A4%EB%A7%A4&tqi=h%2B4thwprvmZss6uUL7ossssstOZ-299895" res = requests.get(url) res.raise_for_status() soup = BeautifulSoup(res.text, "lxml") houses = soup.find_all("tr", attrs={"class": {"_land_tr_row"}}) for num, house in enumerate(houses): info = house.get_text().split() print(f"=========={num+1}번 매물==========") print(f"매매 방식 : {info[0]}") print(f"매물 위치 : {info[1]}") print(f"매물 이름 : {info[2]}") print(f"동 : {info[3][:4]}") print(f"거래 부동산 : {info[3][4:]}") print(f"면적 : {info[4]}") print(f"가격 : {info[5]} 만원") print(f"층 : {info[-2]}")
쉽게 처음하는 파이썬 고급 크롤링 [Scrapy, Selenium, Headless Chrome]
연습1 모범 코드: id가 begin 인 데이터만 출력해보기 코드를 실행해보면, 데이터 출력까지 꼬박 30초가 걸리네요.. from selenium import webdriver from selenium.webdriver.common.keys import Keys import time from selenium.webdriver.common.by import By from selenium.webdriver.chrome .service import Service from webdriver_manager.chrome import ChromeDriverManager chromedriver = 'C:/dev_python/Webdriver/chromedriver.exe' driver = webdriver.Chrome (service=Service(chromedriver)) driver.get(" https://davelee-fun.github.io/blog/crawl_html_css.html ") elems = driver.find_elements( By.ID , 'begin') for elem in elems : print(elem.text) driver.quit() 강사님 영상보면 늦어도 5초 이내에 실행되는 것 같은데 좀 답답한 마음에 문의 드립니다. data:, 화면에서 20초 가량을 멈춰있어요.. 구글링 해보니 브라우저와 드라이버 버전을 맞추면 실행이 빨라진다 해서, 몇 번 재설치를 해봐도 안되고 있네요.. 109.0.5414.25와 .74 모두 설치해봤으나 동일한 처리 속도이며,, Edge드라이버를 설치해서 불러와도 30초가 걸리네요. 참고로 제가 사용하는 컴퓨터이며, 크롬에서 주소 입력시 1초 이내로 반응합니다. 강의 내용과는 조금 벗어날 수도 있는 부분인 것 같으나.. 현업이나 교육 중에 이런 현상을 보신 적이 있으실까 싶어서 여쭤보네요. 강의는 정말 잘 듣고 있습니다. 양질의 강의 찍어주셔서 정말 감사드려요!!^^
안녕하세요 먼저 좋은 강의 해주시는 나도코딩님께 감사드립니다. 이전에 나름 정성들여 글을 작성했는데, 확인이 안돼서 다시 작성해봅니다. 제가 강의를 보고있는 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
안녕하세요. 이번에 크롤링 강의를 듣고 있는 수강생 입니다. 현재 네이버 지도에서 위치를 검색 후 클릭 -> 클릭-> 한 후 네이버의 한줄평 리뷰 를 크롤링 하는 자체 프로젝트를 진행중입니다. 이때, 검색창을 찾고, click() 을 이용해 Crawling 을 위한 (3) 페이지 로딩까지는 성공하였으나, 옆의 화면에서 click 및 어떠한 활동도 할 수 없는 상태입니다. 제 소스 코드는 이렇습니다. for l in list_loc: ele = l.split(( ',' ))[:- 1 ] comp = unicodedata.normalize( 'NFC' , ele[- 1 ][- 1 ]) if comp != dong and comp != eup and comp != myun and comp != lee and comp != ga : continue address = ele[ 0 ]+ ' ' +ele[ 1 ]+ ' ' +ele[ 2 ]+ ' 식당 ' add_quote = urllib.parse.quote(address) driver.get(url) sleep( 1 ) key_search = address time_wait( 2 , 'div.input_box > input.input_search' ) search = driver.find_element(By.CSS_SELECTOR , 'div.input_box > input.input_search' ) sleep( 1 ) search.send_keys(key_search) search.send_keys(Keys.ENTER) res = driver.page_source soup = BeautifulSoup(res , 'html.parser' ) # html 파싱하여 가져온다 sleep( 1 ) def switch_frame (frame): driver.switch_to.default_content() # frame 초기화 driver.switch_to.frame(frame) # frame 변경 res soup def page_down (num): body = driver.find_element(By.CSS_SELECTOR , 'body' ) body.click() for i in range (num): body.send_keys(Keys.PAGE_DOWN) switch_frame( 'searchIframe' ) page_down( 3 ) sleep( 1 ) # 매장 리스트 store_list = driver.find_elements(By.CSS_SELECTOR , '._1EKsQ' ) next_btn = driver.find_elements(By.CSS_SELECTOR , '._2ky45 > a' ) print ( len (next_btn) , '....' ) for btn in range ( len (next_btn))[ 1 :]: # next_btn[0] = 이전 페이지 버튼 , 1,2 : 광고 / 0,1,2 무시 -> [3] 부터 시작 print (next_btn[btn].text , 'adsadsa' ) store_list print (store_list[ 0 ].text) store_page = driver.find_elements(By.CSS_SELECTOR , '.OXiLu' ) for data in range ( len (store_list)): # 매장 리스트 만큼 #print(data, len(store_page), store_page[data].text, '00') store_page[data].click() sleep( 2 ) try : driver.switch_to.default_content() print ( 'switch test1' ) sleep( 0.5 ) driver.switch_to.frame( 'entryIframe' ) sleep( 4 ) print ( 'switch test2' ) reviews = driver.find_elements(By.CSS_SELECTOR , '_2RG_o' ) except : pass 여기서, (3) 의 페이지가 네이버 지도의 entryIframe 안에 있는 것을 알고, switch frame 을 시도했습니다만, 무슨 락이 걸려 있는것인지 저 entryIframe 이 전혀 검색이 되지 않습니다. 하지만 소스 페이지 검색 결과, entryIframe 는 분명이 존재합니다. 제가 무엇을 빼먹은 것인지, 무엇을 잘못 하고 있는 것인지 알고 싶습니다. 감사합니다.
질문 https://www.localdata.go.kr/devcenter/dataDown.do?menuNo=20001 사이트에서 데이터 다운로드 - 전체 데이터 다운로드 - 전체분 - excel 다운로드를 하고자 합니다. 이를 위해서 우선 링크에서 '전체 데이터 다운로드'단계로 가려고 캡쳐처럼 id를 down-area인 것으로 보여서 xpath로도 해보고, selector로도 해봤는데 둘이 같은 오류가 발생합니다. 작성한 코드는 다음과 같습니다. from selenium import webdriver broswer = webdriver . Chrome () broswer . get ( 'https://www.localdata.go.kr/devcenter/dataDown.do?menuNo=20001' ) # id = broswer.find_element_by_xpath('//*[@id="down-area"]') id = broswer . find_element_by_css_selector ( '#down-area' ) id . click () 사이트는 정상적으로 켜지나 클릭이 되지 않으며 나오는 오류 코드는 다음과 같습니다. (base) C:\test>[83512:84772:0427/183423.717:ERROR:device_event_log_impl.cc(214)] [18:34:23.718] USB: usb_device_handle_win.cc:1049 Failed to read descriptor from node connection: 시스템에 부착된 장치가 작동하지 않습니다. (0x1F) 어떻게 해결할지 모르겠어서 질문드립니다. 답변 기다립니다. 감사합니다.
쉽게 처음하는 파이썬 고급 크롤링 [Scrapy, Selenium, Headless Chrome]
안녕하세요. celenium 크롤링을 이용해 여러 페이지에서서 데이타를 가져올때, 특정 페이지에 해당 태그나 속성 name 이 없을 경우 그 곳에서 프로그램이 멈춰 서 버리는데요. 이럴 경우 어떻게 처리해야 하나요? 예) driver.get(https://davelee-fun.github.io) elem = driver.find_element_by_class_name("card-title") 물론 위의 테스트 웹사이트에서는 해당 클래스가 모두 있기 때문에 문제가 없는데요. 예외적으로 없을 경우 어떻게 처리를 해야 하는지 궁금해서 여쭤봅니다.
쉽게 처음하는 파이썬 고급 크롤링 [Scrapy, Selenium, Headless Chrome]
강의 비디오 : Selenium 기본 사용법 1 - name으로 찾기 10분대 http 페이지명 : http://davelee-fun.github.io 질문 : 안녕하세요 강의 잘 보고 있습니다. Teddy의 선물 블로그에 각각의 카드 내에서 상품 추천과 상품명 2개를 가져오려고 할때 어떤 방법이 있는지 알고 싶습니다. 추천상품 다음에 상품명이 같이 나란히 나오게 하려고 하는데 잘 안되네요. 카드 정보 전체를 추출해서 다시 인덱스로 추출해야 하나요?
쉽게 처음하는 파이썬 고급 크롤링 [Scrapy, Selenium, Headless Chrome]
안녕하세요. headless 개념 설명 이해 강의 14강 12:20 에서 options 에 여러 옵션을 add하는 부분이 있는데요! lang = ko_KR 옵션은 관계가 ' = ' 으로 되어 있고 User-Agent : 옵션은 관계가 ' : ' 으로 되어 있는데 어떤 상황에서 ' = ' 과 ' : ' 를 쓰는건지 헷갈립니다. 구글에 쳐봤는데 제가 잘 못 찾는 건지.. 자료를 찾기 힘들어서요. 각 관계표시가 어떤 상황에서 쓰이는건지 차이점을 알고 싶습니다. 항상 좋은 강의 감사합니다 :)
from selenium import webdriver driver = webdriver.Chrome('C:/Users/estee/Desktop/파이썬 작업물/chromedriver.exe') import time # 주소모음 naver_GIBH = "https://map.naver.com/v5/search/%EA%B5%AC%EC%8A%A4%EC%95%84%EC%9D%BC%EB%9E%9C%EB%93%9C%20%EB%B8%8C%EB%A3%A8%ED%95%98%EC%9A%B0%EC%8A%A4/place/505375149?c=14140682.3022615,4508106.9534795,15,0,0,0,dh" naver_GBK = "https://map.naver.com/v5/entry/place/996095686?c=14133872.9335375,4519631.0127127,15,0,0,0,dh" naver_YONGSAN = "https://map.naver.com/v5/entry/place/1905880476?c=14133837.3558283,4513226.0701902,15,0,0,0,dh" naver_adresses = [naver_GIBH, naver_GBK, naver_YONGSAN] # 평점과 리뷰 크롤링 for adress in naver_adresses : driver.get(adress) driver.implicitly_wait(10) driver.switch_to.frame('entryIframe') rating = driver.find_element_by_xpath('//*[@id="app-root"]/div/div/div[2]/div[1]/div/div/div[1]/div/span[1]').text submenu_name = driver.find_element_by_xpath('//*[@id="app-root"]/div/div/div[2]/div[3]/div/div/div/div/a[3]/span').text # 메뉴가 5개 나올 때는, 4번째 탭을 이용하고, 메뉴가 4개 나올 때는 3번째 탭을 이용 if submenu_name != "리뷰" : driver.find_element_by_xpath('//*[@id="app-root"]/div/div/div[2]/div[3]/div/div/div/div/a[4]/span').click() else : driver.find_element_by_xpath('//*[@id="app-root"]/div/div/div[2]/div[3]/div/div/div/div/a[3]/span').click() # 리뷰개수 print( driver.find_element_by_xpath('//*[@id="app-root"]/div/div/div[2]/div[5]/div[4]/div[3]/h2/span').text ) driver.close() 해당 코드는 네이버 지도의 각 매장 별 리뷰 개수를 가지고 오는 코드에요. naver_GIBH , naver_GBK 링크는 리뷰 개수를 불러오는데, 마지막 naver_YONGSAN 링크의 리뷰 개수는 들고오지 못하더라구요. 혹시 이 코드에 관해 봐주실 수 있을까요 ? + 추가 질문인데, 제가 Selenium을 통해서 리뷰개수를 찾아오는 방식은 selenium으로 리뷰 탭을 선택하고 나서, 들고 오는 거에요. 근데 네이버 지도가 인스타그램처럼 스크롤을 내리면 정보를 불러오는 방식으로 설계되어 있더라구요. 혹시 이와 관련해서 Selenium으로 클릭하지 않고, crawling 하는 방법이 따로 있을지도 질문드려요 .
내 업무를 대신 할 파이썬(Python) 웹크롤링 & 자동화 (feat. 주식, 부동산 데이터 / 인스타그램)
안녕하세요 . crawling 수업시 가상환경 생성하여 수업진행하셔서 저도 따라서 진행하고 있는데요. 가상환경에서 from selenium import webdriver 명령 입력시 하기와 같은 에러가 발생합니다.. ModuleNotFoundError: No module named 'selenium' selenium 설치되어있는것을 anaconda prompt에서 확인했는데도 계속 오류가 발생하길래 이상해서 가상환경을 종료하고 (base) 환경에서 selenium을 import하니 정상적으로 작동하네요.. 혹시 가상환경에서는 selenium이 작동되지 않는건가요?? 아니면 해결방법이 따로 있는건가요?? 아시는 부분 있으시면 알려주시면 감사하겠습니다.
현재 셀레니움을 공부하고 있습니다 너무 감사합니다 질좋은강의 최고입니다. 유료보다 좋은 무료라니... 천사이십니다... 저 지금 네이버 항공권 이미지가 조금 달려졌는데 browser.find_element_by_link_text( " 가는 날 " ).click() 이라고 하니 NoSuchElementException이 발생했습니다 왜이런건지 이해를 못하겠습니다
driver.find_element_by_xpath('/html/body/div[2]/form/div/section/div/div[3]/p[2]/input').send_keys('5950') #금액 입력 안녕하세요 파이썬, 셀레니움을 이용해서 웹페이지 자동화를 하고 있습니다. click, send_keys가 다 정상적으로 작동 되는데 저 부분만 제꺼 컴퓨터에서는 정상 작동 친구컴퓨터에서는 작동하지 않네요... 건강보험 사이트인데...일부는 정상작동 몇분은 작동 안되는 이유를 모르겠습니다.