월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결이것이 진짜 크롤링이다 - 실전편
크롤링 관련하여 질문드립니다.
안녕하세요 강사님, 유튜브 강의 너무 잘 보고 좀 더 강사님의 강의를 통해 파이썬 배워보고자 인프런 수강하게 된 학생입니다.크롤링 관련하여 강의나 유튜브 영상을 찾아봐도 접하기 힘든 유형인 듯 하여 질문드립니다. 위와 같이 흔히 접할 수 있는 가격 비교 사이트(D사, E사 등) 에서 카드할인가 포함과 같은 체크박스 선택을 하여 정보를 추출하고자 할 경우 어떻게 해야하나요? 기존 강의에서 접한 사이트와는 다르게 크롤링이 제한되는 듯 하여 질문드립니다...
- 미해결이것이 진짜 크롤링이다 - 실전편
주식 크롤링 도움이 필요합니다. (추가 질문 있습니다.)
안녕하세요.어느새 무제한 강의로 바뀌었네요. ^^네이버금융크롤링을 응용하여 재무제표를 가져 오고 싶은데...https://finance.naver.com/item/main.naver?code=005930 페이지의 재무제표는 잘 가져왔습니다.그런데 재무재표 더보기 버튼을 클릭한 페이지에서 재무제표의 테이블 값을 가져오려니 못가져 오고 있습니다.https://finance.naver.com/item/coinfo.naver?code=005930&target=finsum_more 페이지 입니다.찾고 싶은 테이블 : <table class="gHead01 all-width" summary = "주요재무정보를 제공합니다.">왜 못가져오나 테스트 해보니html print 해보면 찾고 싶은 table 내용이 아예 없어요.해당 table의 부모인 div = id는 페이지 열 때 마다 값이 변합니다.동적페이지 이런 걸까요??? Selenium을 사용해야 하는건지...별 삽질을 다 해 보고 있는데 제 능력으로는 해결이 안되 도움이 필요합니다. ㅠㅠ
- 미해결이것이 진짜 크롤링이다 - 실전편
코레일 크롤링 질문
코레일도 토요코인이랑 비슷하게 post 이용해서 크롤링하려 해봤는데 잘 안되더라고요,,결국에는 그냥 selenium으로 들어가서 beautifulsoup로 좌석있는지 체크하고 10초마다 다시 조회한 다음 좌석있는지 다시 체크하는 식으로 해서 어느 정도 성공시키긴 했는데, 코레일은 requests랑 beautifulsoup만으로는 어려울까요? import requests from bs4 import BeautifulSoup import time token = "" channel = "#test" text = "Check your stock crawler." def post_message(token, channel, text): requests.post("https://slack.com/api/chat.postMessage", headers={"Authorization": "Bearer "+token}, data={"channel": channel,"text": text} ) myToken = "API토큰" url = "https://www.letskorail.com/ebizprd/EbizPrdTicketpr21100W_pr21110.do" #date_list = ['2022/06/25', '2022/07/02'] datas_obj = { "selGoTrain": 5, "txtPsgFlg_1": 1, "txtPsgFlg_2": 0, "txtPsgFlg_8": 0, "txtPsgFlg_3": 0, "txtPsgFlg_4": 0, "txtPsgFlg_5": 0, "txtSeatAttCd_3": 000, "txtSeatAttCd_2": 000, "txtSeatAttCd_4": 15, "selGoTrainRa": 5, "radJobId": 1, "adjcCheckYn": "Y", "txtGoStart": "용산", "txtGoEnd": "전주", "txtGoStartCode": 104, "txtGoEndCode":45, "selGoYear": 2023, "selGoMonth":3, "selGoDay": 23, "selGoHour": 8, "txtGoHour": 85500, "txtGoYoil": "목", "selGoSeat1": 15, "txtPsgCnt1": 1, "txtPsgCnt2": 0, "txtGoPage": 1, "txtGoAbrdDt": 20230323, "checkStnNm": "Y", "txtMenuId": 11, "SeandYo": "N", "ra": 1, "hidRsvTpCd": 3, "txtPsgTpCd1": 1, "txtPsgTpCd2": 3, "txtPsgTpCd3": 1, "txtPsgTpCd5": 1, "txtPsgTpCd7": 1, "txtPsgTpCd8": 3, "txtDiscKndCd1": 000, "txtDiscKndCd2": 000, "txtDiscKndCd3": 111, "txtDiscKndCd5": 131, "txtDiscKndCd7": 112, "txtDiscKndCd8": 321, "txtCompaCnt1": 0, "txtCompaCnt2": 0, "txtCompaCnt3": 0, "txtCompaCnt4": 0, "txtCompaCnt5": 0, "txtCompaCnt6": 0, "txtCompaCnt7": 0, "txtCompaCnt8": 0 } while True: time.sleep(2) response = requests.post(url, data=datas_obj) html = response.text soup = BeautifulSoup(html, 'html.parser') #a가 있으면 좌석 있음:#tableResult > tbody > tr:nth-child(1) > td:nth-child(6) > a:nth-child(1) > img #a없이 바로 이미지면 좌석 없음:#tableResult > tbody > tr:nth-child(1) > td:nth-child(6) > img # '#tableResult > tbody > tr:nth-child(1) > td:nth-child(6) > a:nth-child(1) > img' 선택자를 이용하여 좌석 이미지를 찾습니다. seat_with_a = soup.select_one('#tableResult > tbody > tr:nth-child(1) > td:nth-child(6) > a:nth-child(1) > img') seat_with_a2 = soup.select_one('#tableResult > tbody > tr:nth-child(3) > td:nth-child(6) > a:nth-child(1) > img') #tableResult > tbody > tr:nth-child(3) > td:nth-child(6) > img #tableResult > tbody > tr:nth-child(3) > td:nth-child(6) > a:nth-child(1) > img # '#tableResult > tbody > tr:nth-child(1) > td:nth-child(6) > img' 선택자를 이용하여 좌석 이미지를 찾습니다. seat_without_a = soup.select_one('#tableResult > tbody > tr:nth-child(1) > td:nth-child(6) > img') seat_without_a2 = soup.select_one("#tableResult > tbody > tr:nth-child(3) > td:nth-child(6) > img") # 좌석 이미지가 있으면 "좌석 있음"을, 없으면 "좌석 없음"을 출력합니다. if seat_with_a or seat_with_a2: print("좌석 있음") post_message(token, channel, "좌석 생김") elif seat_without_a and seat_without_a2: print("좌석 없음")이렇게 했는데 데이터 자체가 잘못됐는지 중간에 print(html)로 보니까 제대로 해당 페이지를 가져온 것 같지도 않더라고요..
- 미해결이것이 진짜 크롤링이다 - 실전편
엑셀에 데이터 크롤링 하면서 중간에 새로운 열 추가
선생님 안녕하세요좋은 강의 감사드립니다. 이전에 여쭤보았던 질문 중에 해결안된 것이 있어서 추가 질문드립니다. 아래의 예시와 같이 "중간에" 계속 열을 추가해야 하는 상황인데, 강의에서 나온 방식대로만 하면 "고정된" 열에만 추가할 수 있어서, 기존에 추가했던 데이터가 "밀리지 않는" 현상이 발생하더라고요. 혹시 해결할 수 있는 방법이 있을까요? 기존 데이터 그 이후에, 정보를 추가할 일이 있어서, 아래와 같이 B열에 새로운 열을 추가했다고 가정하면요또 그 이후에, 중간에 새로운 열 하나를 더 추가할 수도 있고요그러면, 원래 B열에 PER를 크롤링 하기로 되어있는데, D열로 크롤링 하도록 코드를 바꿔야 하는데, 코드를 안바꾸고 열이 밀린것처럼 코드도 자동으로 D열로 밀려서 크롤링 하도록 처음부터 설정할 수 있는 방법이 있을까요?
- 해결됨이것이 진짜 크롤링이다 - 실전편
첫째 페이지 크롤링 오류
import requests from bs4 import BeautifulSoup main_url = "https://www.coupang.com/np/search?component=&q=%EA%B2%8C%EC%9D%B4%EB%B0%8D+%EB%A7%88%EC%9A%B0%EC%8A%A4&channel=user" header = { 'Host': 'www.coupang.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3',} response = requests.get(main_url, headers = header) html = response.text soup = BeautifulSoup(html, 'html.parser') links = soup.select("a.search-product-link") for link in links: sub_url = "https://www.coupang.com/" + link.attrs['href'] response = requests.get(sub_url,headers = header) html = response.text sub_soup = BeautifulSoup(html,'html.parser') #브랜드명 #중고상품 예외처리 try: #아래 태그를 찾고 brand = soup.select_one("a.prod-brand-name") except:# 없으면 아래처럼 비우기 brand = "" #상품명 name = soup.select_one("h2.prod-buy-header__title") #가격 price = soup.select_one("span.total-price > strong") print(brand,name,price) 이렇게 작성 하고 실행 시키니 아무일도 일어나지 않았습니다. 그래서 ctrl + F5 로 실행 시키니 크롤링 된 데이터가 모두 none 으로 크롤링 되네요 ..
- 해결됨이것이 진짜 크롤링이다 - 실전편
스크롤이 되지 않는 오류.
안녕하세요. 스타트코딩 선생님.강의 재미있게 듣고 실습하고 있습니다.deprecated 경고문 제외하고는 큰 문제 없이 실행되어 50개의 결과는 가져옵니다.그런데 좀 특이한 몇 가지 문제가 있습니다. ① 크롬이 불필요하게 2개 창으로 실행됩니다. 창 하나는 주소표시줄에 data; 라고 쓰여있는, 아무 동작도 하지 않는 텅 빈 화면을 보여주고, 그 다음에 열리는 크롬창은 네이버 이미지 검색 결과 화면이 우선은 잘 출력됩니다.② 두 번째로 열리는 크롬창에서 검색 결과 화면까지는 나오고 주소까지 크롤링 되는데, 스크롤이 되지 않습니다. 그냥 화면에 보이는 이미지의 주소 결과 딱 50개만 크롤링 되는 것 같아요. 어지간해서는 대부분 구글링으로 해결했는데, 이 부분은 찾기가 어려워 직접 여쭤봅니다.조언 부탁드립니다. from typing import KeysView from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By 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"]) service = Service(executable_path=ChromeDriverManager().install()) driver = webdriver.Chrome(service=service, options=chrome_options) # 웹페이지 해당 주소 이동 url = "https://search.naver.com/search.naver?where=image&sm=tab_jum&query=BTS" browser = webdriver.Chrome("c:/chromedriver.exe") browser.implicitly_wait(5) browser.maximize_window() browser.get(url) # 무한 스크롤 처리 # 스크롤 전 높이 before_h = browser.execute_script("return window.scrollY") # 무한 스크롤 while True: # 맨 아래로 스크롤을 내린다. browser.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END) # 스크롤 사이 페이지 로딩 시간 time.sleep(2) # 스크롤 후 높이 after_h = browser.execute_script("return window.scrollY") if after_h == before_h: break before_h = after_h # 이미지 태그 추출 imgs = browser.find_elements(By.CSS_SELECTOR,'._image._listImage') for i, img in enumerate(imgs, 1): # 각 이미지 태그의 주소 img_src = img.get_attribute("src") print(i, img_src)
- 해결됨이것이 진짜 크롤링이다 - 실전편
selenium을 활용한 크롤링 질문
안녕하세요 강사님 selenium은 동적 크롤링을 할때 사용한다고 알고있습니다. 간혹 로그인을 해야만 정보를 열람할 수 있는 사이트가 있는데 이런 경우에는 어떤식으로 접근을 할 수 있을지 알고싶습니다!
- 미해결이것이 진짜 크롤링이다 - 실전편
광고상품 외 표기 문의드립니다.
안녕하세요. 답변 감사드립니다.전체 코드를 첨부하여 다시 문의글 작성하였습니다.쿠팡 광고상품과 로켓상품도 표기하고자 합니다.if len(link.select(".ad-badge-text")) > 0:print("광고상품")를 아래와 같이 수정하면 될까요?해봤는데 아무표기가 안되서요. if len(link.select("span.badge rocket")) > 0:print("로켓상품") 그리고 광고상품 로켓상품 둘다 표현하고자 하면아래와 같이 표기하면 될까요?if len(link.select(".ad-badge-text")) > 0:print("광고상품")elif len(link.select("span.badge rocket")) > 0:print("로켓상품")광고상품은 광고상품이라고 잘 표기가 되는게 로켓상품은 전혀 결과가 나오지 않아서요.
- 미해결이것이 진짜 크롤링이다 - 실전편
광고 상품 표기 추가문의
안녕하세요. 문의드립니다.광고 상품 대신에 로켓상품도 표기하고자 합니다. if len(link.select(".ad-badge-text")) > 0: print("광고상품")를 아래와 같이 수정하면 될까요?해봤는데 아무표기가 안되서요. if len(link.select("span.badge rocket")) > 0: print("로켓상품") 그리고 광고상품 로켓상품 둘다 표현하고자 하면아래와 같이 표기하면 될까요? if len(link.select(".ad-badge-text")) > 0: print("광고상품")elif len(link.select("span.badge rocket")) > 0: print("로켓상품")
- 해결됨이것이 진짜 크롤링이다 - 실전편
광고상품 표기외에 상품명도 보려고 하는데요. 에러가나네요.
광고상품 광고상품 표기외에 상품명도 보고자하는데요.아래와 같이 에러가 납니다.상품명도 보려면 어떻게 해야 할까요?https://www.coupang.com//vp/products/7119405125?itemId=17821748239&vendorItemId=84985642101&sourceType=srp_product_ads&clickEventId=f08dcc16-7eb1-4918-979f-8e4d3e2f2314&korePlacement=15&koreSubPlacement=1&clickEventId=f08dcc16-7eb1-4918-979f-8e4d3e2f2314&korePlacement=15&koreSubPlacement=1<div class="name">디엑스 DX320QHD 32인치 QHD 75Hz IPS 고성능 게이밍 컴퓨터 모니터, DX320QHD(일반)</div>Traceback (most recent call last):line 45, in <module>print(ad_name).textAttributeError: 'NoneType' object has no attribute 'text'print(ad_name).text에서 text를 빼고 실행시켜보았는데 다른 상품인데 아래와 같이 모두 상품명이 동일하게 나옵니다. <div class="name">인터픽셀 60.5cm FHD 75Hz IPS 평면 게이밍 모니터 화이트, IP2422(무결점)</div>광고상품https://www.coupang.com//vp/products/6070742312?itemId=11207404701&vendorItemId=78484994606&sourceType=srp_product_ads&clickEventId=2981eff0-533f-432a-ace7-a9dbbc8cf39b&korePlacement=15&koreSubPlacement=12&clickEventId=2981eff0-533f-432a-ace7-a9dbbc8cf39b&korePlacement=15&koreSubPlacement=12<div class="name">인터픽셀 60.5cm FHD 75Hz IPS 평면 게이밍 모니터 화이트, IP2422(무결점)</div>광고상품https://www.coupang.com//vp/products/1955685399?itemId=3323143682&vendorItemId=71310006110&sourceType=srp_product_ads&clickEventId=8ab74e64-bccb-400c-968d-9fe175da93a9&korePlacement=15&koreSubPlacement=15&clickEventId=8ab74e64-bccb-400c-968d-9fe175da93a9&korePlacement=15&koreSubPlacement=15<div class="name">인터픽셀 60.5cm FHD 75Hz IPS 평면 게이밍 모니터 화이트, IP2422(무결점)</div>광고상품 for link in links: print(ad_name).text <-이부분 때문에 에러가 나는것 같습니다. 어떻게 표기를 해야 할까요?
- 미해결이것이 진짜 크롤링이다 - 실전편
유튜브 크롤링/키워드 별 크롤링 방법에서 에러발생합니다.
div#metadata-line > span위 그림에서 처럼 이것은 인식 합니다만위 그림에서와 같이 div#metadata-line > span::nth-child(1) 은 인식 하지 못하는 것 같습니다.info.find_elements(By.CSS_SELECTOR, "div#metadata-line span")[0]selenium에서는 이렇게 해서 해결했습니다만...views = info.select("div#metadata-line > span")[1].text views = info.select("div#metadata-line span")[1].textBeautifulSoup에서는 위 코드도 오류가 발생합니다.
- 미해결이것이 진짜 크롤링이다 - 실전편
lxml.etree.LxmlSyntaxError: not in an element - 쿠팡결과_엑셀저장
워크시트 저장하는 코드에서...lxml.etree.LxmlSyntaxError: not in an element이런 에러가 났습니다. 디렉토리명을 포함한 파일이름을 아래와 같이 했을 때...wb.save('./04_쿠팡_크롤링/coupang_result.xlsx')이것도 에러 납니다. wb.save('startCoding_crawling/04_쿠팡_크롤링/coupang_result.xlsx')이렇게 하니 에러가 나지 않았습니다. 참고 바랍니다. 오류 전체 내용은 다음과 같습니다.Traceback (most recent call last): File "d:\python_Workspace\crawling\startCoding_crawling\04_쿠팡_크롤링\04_엑셀에저장하기.py", line 80, in <module> wb.save('04_쿠팡_크롤링/coupang_result.xlsx') # 왜 2번쓰지? File "d:\python_Workspace\crawling\lib\site-packages\openpyxl\workbook\workbook.py", line 386, in save save_workbook(self, filename) File "d:\python_Workspace\crawling\lib\site-packages\openpyxl\writer\excel.py", line 291, in save_workbook archive = ZipFile(filename, 'w', ZIP_DEFLATED, allowZip64=True) File "C:\Users\exper\Anaconda3\lib\zipfile.py", line 1248, in __init__ self.fp = io.open(file, filemode) FileNotFoundError: [Errno 2] No such file or directory: '04_쿠팡_크롤링/coupang_result.xlsx' Error in atexit._run_exitfuncs: Traceback (most recent call last): File "d:\python_Workspace\crawling\lib\site-packages\openpyxl\worksheet\_writer.py", line 32, in _openpyxl_shutdown os.remove(path) PermissionError: [WinError 32] 다른 프로세스가 파일을 사용 중이기 때문에 프로세스가 액세스 할 수 없습니다: 'C:\\Users\\exper\\AppData\\Local\\Temp\\openpyxl.9zt9hqlf' Exception ignored in: <generator object WorksheetWriter.get_stream at 0x0000019973439F90> Traceback (most recent call last): File "d:\python_Workspace\crawling\lib\site-packages\openpyxl\worksheet\_writer.py", line 300, in get_stream File "src\lxml\serializer.pxi", line 1834, in lxml.etree._FileWriterElement.__exit__ File "src\lxml\serializer.pxi", line 1570, in lxml.etree._IncrementalFileWriter._write_end_element lxml.etree.LxmlSyntaxError: inconsistent exit action in context manager Exception ignored in: <generator object WriteOnlyWorksheet._write_rows at 0x00000199734B05F0> Traceback (most recent call last): File "d:\python_Workspace\crawling\lib\site-packages\openpyxl\worksheet\_write_only.py", line 75, in _write_rows File "src\lxml\serializer.pxi", line 1834, in lxml.etree._FileWriterElement.__exit__ File "src\lxml\serializer.pxi", line 1568, in lxml.etree._IncrementalFileWriter._write_end_element lxml.etree.LxmlSyntaxError: not in an element
- 미해결이것이 진짜 크롤링이다 - 실전편
크롤링 중에 구글 reCAPTCHA 우회 방법
안녕하세요. 선생님, 파이썬-크롤링 기본/실전 강의 너무 잘 들었습니다. (완강~ ^^")실전편까지 들으니 초보적이지만 웬만한 크롤링은 가능하게 되어서너무 감사한 마음입니다. 다름이 아니라, 크롤링 중에 구글 reCAPTCHA 만나면 우회할 수 있는 방안이 있을까요?reCAPTCHA가 iframe 으로 되어 있고, 그래서 switch_to.frame해서 해당 체크박스를 자동 클릭 까지는 가능한데, 이게 봇 클릭으로 인식해서 그런지 추가 이미지 선택 팝업이 뜹니다.구글링 해 보니, reCAPTCHA v3 같은 경우에는 마우스 움직임 등의 조건을 본다고 하는데요~pyautogui.moveTo() 함수로 마우스를 이리저리 왔다갔다 했다가 클릭하면 가끔씩 추가 이미지 선택 팝업이 안뜰 때도 있습니다. 질문은 reCAPTCHA 우회 방법이 있는지요?? 바쁘실텐데 미리 감사 드립니다.
- 미해결이것이 진짜 크롤링이다 - 실전편
네이버 주식 크롤링 종목명 에러
선생님 안녕하세요좋은 강의 감사합니다. 강의 코드와 조금 다르게 작성을 해보았는데요네이버 주식 크롤링 부분에서 종목명을 가져오는 경우 에러가 발생해서 도움을 요청드립니다. 네이버증권 코드는 아래와 같이 되어있는데요 trs = soup.select("table.type_2 > tbody > tr[onmouseover='mouseOver(this)']") # class가 number로만 되어있고 안쪽에 잇는 것들이 구분이 안된다. # n번째 td 를 가져오도록 설정하면 된다. nth-child가 안되므로 다른 방법 사용 for tr in trs: name = tr.select_one('a.title').text이라고 작성하면 nonetype은 text가 없다는 에러가 뜹니다. name = tr.select_one('td > a.title').text라고 작성해도 똑같은 오류가 뜨는데, 제가 보기에는 맞는 코드 같거든요;;; 혹시 어디가 잘못된 것인지 말씀이 가능하실까요?
- 미해결이것이 진짜 크롤링이다 - 실전편
엑셀(구글)시트에 크롤링 하는 경우 열 변경시 문제
선생님 안녕하세요좋은 강의 감사합니다. 강의 외적으로 질문드립니다. 정기적으로 크롤링을 해와서 엑셀에 정보를 업데이트 하는 것을 하고 싶은데요 예를 들어, A열에 종목번호, B열에 종가를 넣다가, 갑자기 두 열 사이에 하나 열을 추가해서 다른 정보를 넣어야 할때가 많은데요(예를 들어, PER나 PBR같은 정보) 이런 경우에 B열로 종가를 불러오게 하면 계속 정보가 덧쓰일것 같아서요.이 경우, B열로 불러오라는 코드를 수정하지 않고, 자동으로 C열로 밀리도록 코딩을 하려면 어떻게 해야 하나요?
- 미해결이것이 진짜 크롤링이다 - 실전편
뉴스 본문 내용 크롤링 응용
import requests from bs4 import BeautifulSoup respones = requests.get("https://www.coupang.com/np/categories/498917") html = respones.text soup = BeautifulSoup(html,'html.parser') item = soup.select(".baby-product-link") # 쿠팡 아이템 1페이지 모두 지정 for items in item: print(f"{pn}페이지 입니다=========================") name = items.select("div.name") #리스트 url = items.attrs['href'] #두번째 링크의 href를 추출 그리고 url에 저장 response = requests.get(url, headers={'user-agent' : 'mozila/5.0'}) # headers={'user-agent' : 'mozila/5.0'}로 기계같이 보이는 오류를 막음 #받아온 url들을 다시 불러옴 html = response.text # 받아온걸 텍스트로 변환 soup = BeautifulSoup(html,'html.parser') # 알아보기쉽게 만들어줌 img = soup.attrs[".src"]# 본문이 가지고 있는 자신만의 태그로 지정 print (name,img) pn = pn + 1이런식으로 응용 해보았는데 실행을 하면 오류도 없고 아무 동작이 없네요 .. 이런 경우 어떻게 해야하죠 ? 터미널에는 아무 글도 안떠요 그냥 파일 경로만 뜹니다
- 미해결이것이 진짜 크롤링이다 - 실전편
해결이 안되네요
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) 위 말씀드린 과정을 통해서 코드 수행 시 정상적으로 동작하지 않는데, 관련해서 답변 주시면 감사하겠습니다!!
- 미해결이것이 진짜 크롤링이다 - 실전편
원본 소스 부탁 드립니다.
강사님 기본과 실전 수강중에 있는데요어느 부분에서 계속 오류가 걸리는 경우를 보면거의 오타가 많아요지금도 오류에 멈춰서 있습니다.해서 원본 소스를 주시면 제 문제점 찾는데큰 도움이 될 것 같아요. 메일로 부탁 드립니다.( kim691220@naver.com )
- 미해결이것이 진짜 크롤링이다 - 실전편
네이버 이미지 크롤링 무한 스크롤 처리. 밑으로 안 내려갑니다.
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 import pyautogui import os # 검색어 입력. keyword = keyword = pyautogui.prompt("검색어를 입력해주세요.") # 저장 폴더 중복 검사 pd_exists = os.path.exists(f'{keyword}') # 조건에 따른 저장 폴더 생성법 ① if True == pd_exists: pass else: os.mkdir(f'{keyword}') # 조건에 따른 저장 폴더 생성법 ② # if not pd_exists: # os.mkdir(f'{keyword}') # 크롬 드라이버 자동 업데이트 from webdriver_manager.chrome import ChromeDriverManager # 브라우저 자동 꺼짐 방지하기 chrome_options = Options() chrome_options.add_experimental_option("detach", True) # 불필요한 에러 메세지 안보이게 하기 chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) # 크롬드라이버매니저를 통해서 최신 크롬드라이버를 자동으로 설치하고, # service 객체를 만들어 변수에 저장. service = Service(executable_path=ChromeDriverManager().install()) # 크롬 열고, 화면 최대화 browser = webdriver.Chrome(service=service, options=chrome_options) browser.maximize_window() # 검색어 입력했을때, 네이버 이미지 탭 결과 리스트창 browser.get(f"https://search.naver.com/search.naver?where=image&query={keyword}") # 웹페이지가 로딩 될 때까지 10초 기다림. 뜨면 바로 10초 안채워도 넘어감. browser.implicitly_wait(10) # 무한 스크롤 처리 # 스크롤 내리기 전 위치 before_h = browser.execute_script("return window.scrollY") # 무한스크롤 while True: #맨 아래로 스크롤 내리기 browser.find_element(By.CSS_SELECTOR, "body.wrap-new.api_animation.tabsch.tabsch_image").send_keys(Keys.END) # 스크롤 사이 페이지 로딩 시간 time.sleep(3) # 스크롤 후 높이 after_h = browser.execute_script("return window.scrollY") if after_h == before_h: break before_h = after_h전에 수업때 만들었던 무한스크롤 파일에선 잘 동작하는데 네이버 이미지 크롤링에서 시도하면 작동이 안됩니다. ㅠㅠ find_element(By. TAG_NAME, "body").send_keys(Keys.END)로 해도 스크롤이 밑으로 안 내려갑니다.새해 복 많이 받으세요!