월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결이것이 진짜 크롤링이다 - 실전편
뉴스기사 크롤링 css선택자 선정의 어려움......도와주세요....
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요!쌤 인프런, 유튜브 강의 보면서 잘 만들어 가고 있었는데현재 코드에서 아무리 수정을 해도 css를 잘못 가져오는건지 오류가 생겨서 답답해서 질문 들고 왔습니다현재 css 코드 찾기 좀 부탁드릴게요ㅠㅠ안되는 항목✔연예뉴스 -> 내용을 못 가져옴✔스포츠뉴스 -> 제목, 날짜, 내용 다 못 가져옴css를 여러개 바꿔서 넣어봐도 저는 자꾸 찾을 수 없다고 크롤링 됩니다 도와주세요,,,,,,,#네이버기사 크롤링 엑셀저장 import requests from bs4 import BeautifulSoup import time import pyautogui from openpyxl import Workbook #사용자입력 keyword = pyautogui.prompt("검색어를 입력하세요") lastpage = int(pyautogui.prompt("몇 페이지까지 크롤링 할까요?")) #엑셀 생성 wb = Workbook() #엑셀시트 생성 ws = wb.create_sheet(keyword) #열 너비 조절 ws.column_dimensions['A'].width = 60 ws.column_dimensions['B'].width = 30 ws.column_dimensions['C'].width = 60 ws.column_dimensions['D'].width = 150 #행 번호 row = 1 #페이지 번호 pageNum = 1 for i in range(1, lastpage*10, 10) : print(f"{pageNum}페이지 크롤링중입니다 =================") response = requests.get(f"https://search.naver.com/search.naver?where=news&query={keyword}&sm=tab_opt&sort=1&photo=0&field=0&pd=3&ds=2024.04.11&de=2024.15.20&news&query={keyword}&start={i}") html = response.text soup = BeautifulSoup(html, 'html.parser') articles = soup.select("div.info_group") #뉴스기사 div 10개 추출 for article in articles: links = article.select("a.info") #리스트 time.sleep(0.7) if len(links) >= 2: #링크가 2개 이상이면 url = links[1].attrs['href'] #두번째 링크의 href를 추출 response = requests.get(url, headers={'User-agent': 'Mozilla/5.0'}) html = response.text soup_sub = BeautifulSoup(html, 'html.parser') content = soup_sub.select_one("#newsct_article") if content: content_text = content.get_text(separator="\n") else: content_text = "내용을 찾을 수 없습니다." title = None date = None #만약 연예 뉴스라면 if "entertain" in response.url: title = soup_sub.select_one(".end_tit") date = soup_sub.select_one("div.article_info > span > em") content = soup.select_one("#articeBody") #만약 스포츠 뉴스라면 elif "sports" in response.url: title = soup_sub.select_one(".Main_article_title") content = soup.select_one("._article_content") else: title = soup_sub.select_one(".media_end_head_headline") date = soup_sub.select_one("span.media_end_head_info_datestamp_time._ARTICLE_DATE_TIME") #본문 내용안에 불필요한 div, p제거 divs = content.select("div") for div in divs: div.decompose() paragraphs = content.select("p") for p in paragraphs: p.decompose() print("=======제목======= \n", title.text.strip() if title else "제목을 찾을 수 없습니다.") print("=======날짜======= \n", date.text if date else "날짜를 찾을 수 없습니다.") print("=======URL======= \n", url) print("=======내용======= \n", content.text.strip() if content else "내용을 찾을 수 없습니다") # 'else' 블록에서 'date' 변수 정의는 여기서 끝나도록 수정 ws['A1'] = '제목' ws['B1'] = '날짜' ws['C1'] = 'URL' ws['D1'] = '내용' ws[f'A{row}'] = title.text.strip() if title else "제목을 찾을 수 없습니다." ws[f'B{row}'] = date.text.strip() if date else "날짜를 찾을 수 없습니다." ws[f'C{row}'] = url ws[f'D{row}'] = content_text.strip() if content else "내용을 찾을 수 없습니다." row=row+1 #마지막 페이지 여부 확인하기 next_button = soup.select_one("a.btn_next") if next_button: isLastPage = next_button.attrs.get('aria-disabled', None) if isLastPage == 'true': print("마지막 페이지 입니다.") break pageNum = pageNum+1 wb.save(f"{keyword}_4월_뉴스기사_크롤링(4)_내용까지_0411~0415(3).xlsx")
- 미해결이것이 진짜 크롤링이다 - 실전편
연예뉴스크롤링의 CSS연산자 적용 및 no attribute 'text' 해결 방법
안녕하십니까, 강사님. 강의 잘 듣고 있습니다.<연예뉴스크롤링>에서 뉴스 불러오기가 안돼 질문드립니다. 이렇게 코드를 작성했습니다. import requestsfrom bs4 import BeautifulSoupimport timeresponse = requests.get("https://entertain.naver.com/ranking/read?oid=076&aid=0004129264")html = response.textsoup = BeautifulSoup(html, 'html.parser')articles = soup.select("div.info_group")for article in articles:links = article.select("a.info")if len(links) >= 2:url = links[1].attrs['href']response = requests.get(url, headers={'User-agent':'Mozila/5.0'})html = response.textsoup = BeautifulSoup(html, 'html.parser') if "entertain" in response.url:title = soup.select_one(".end_tit")content = soup.select_one("#articeBody")else:title = soup.select_one("#articleTitle")content = soup.select_one("#newsct_article") print(content.text) 이렇게 하면 이런 표시만 나옵니다.C:\스타트코딩_크롤링>C:/Users/Sedaily/AppData/Local/Microsoft/WindowsApps/python3.11.exe c:/스타트코딩_크롤링/03_연예뉴스크롤링하기.py 그래서 else:title = soup.select_one("#articleTitle") 의 CSS 연산자를 #news_tit로 바꿔서 else:title = soup.select_one("#news_tit")이렇게 하니 불러오기는 됩니다.[1번 질문] 강의 마지막 부분에 ID 값이기 때문에 앞의 # 을 . 으로 변경하라고 알려주셨는데 그렇게 하면 안됩니다. html이 강의 당시와 변경돼 그런 건지, 이유가 궁금합니다. [2번 질문] 마지막 부분의 print(content.text) 대신링크, 제목, 본문 정리해서 가져오는 코드로 알려주신 이 코드를 밑에 붙이면print("=======링크=======\n", url)print("=======제목=======\n", title.text)print("=======본문=======\n", content.text) 이렇게 표시가 됩니다. 해결 방법 알려주시면 감사하겠습니다. =======링크=======https://n.news.naver.com/mnews/article/003/0012480442?sid=101Traceback (most recent call last):File "c:\스타트코딩_크롤링\03_연예뉴스크롤링하기.py", line 26, in <module>print("=======제목=======\n", title.text)^^^^^^^^^^AttributeError: 'NoneType' object has no attribute 'text'
- 미해결이것이 진짜 크롤링이다 - 실전편
이 다음 강의도 준비가 되어 있을까요??
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 크롤링 관련해서 이 다음 클래스도 준비되어 있을까요??도움많이 받고 있어 조금 더 고급 스킬 배우고 싶습니다.
- 미해결이것이 진짜 크롤링이다 - 실전편
이미지 수집이 28번 이후로 이미지가 안떠요
스크롤도 잘내려가다가 갑자기 안되는경우도 잇습니다 ㅜㅜ 왜그런걸까요ㅜ
- 미해결이것이 진짜 크롤링이다 - 실전편
마지막 페이지 관련
안녕하세요~! 몇가지 궁금증이 있어 문의 드립니다! 네이버 뉴스 기사가 페이지 넘버링이 아닌, 스크롤식으로 변경된 것으로 확인됩니다. 이러한 경우에는 마지막 기를 어떻게 확인할 수 있을까요? (굳이 마지막 페이지를 확인할 이유가 없을 것 같긴 하지만ㅎㅎ 그래도 궁금하네요 ) 2.f'https://search.naver.com/search.naver?ssc=tab.news.all&where=news&sm=tab_jum&query={keyword}&start={i}' 이전 강의에서 확인하였던, &start={i}을 추가하여 네이버 뉴스 기사 결과를 수집해본 결과, 계속해서 수집이 되긴 했습니다.제 생각에는 연관도가 높은순 → 낮은순으로 출력되는 것 같은데 맞는지도 궁금하네용ㅎㅎ
- 미해결이것이 진짜 크롤링이다 - 실전편
강사님 html 이 업데이트 되어서 오류가 난거 같습니다..!
안녕하세요 ! 최근 데이터크롤링에 대해 수업을 끊고 공부를 시작한지 얼마 안된 학생입니다 ! 평소 궁금했던 내용들을 배우니 참 재미가 있네요 ..! 다름이 아니라 "뉴스 본문 내용 크롤링하는 법" 강의 들으면서 오류가 자주 나는것을 보니 네이버 html 이 업데이트 된거 같습니다.저 스스로 오류를 해결해보려고 해도 잘 안되어서 답답한 마음에 이렇게 글을 씁니다. import requests from bs4 import BeautifulSoup response = requests.get("https://search.naver.com/search.naver?ssc=tab.news.all&where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90") html = response.text soup = BeautifulSoup(html, 'html.parser') articles = soup.select("div.info_group") # 뉴스 기사 div 10개 추출 for article in articles : links = article.select("a.info") # 리스 if len(links) >= 2: # 링크가 2개 이상이면 url = links[1].attrs['href'] # 두번째 링크의 href를 추출 # print(url) response = requests.get(url, headers={'User-agent':'Mozila/5.0'}) html = response.text soup = BeautifulSoup(html, 'html.parser') # print(soup) content = soup.select_one('#articleBodyContents') print(content.text)위 코드를 강사님이 알려주신 코드 입니다. 혹시 뉴스 본문 내용 크롤링하려면 어떻게 해야 될지 알려주실 수 있나요?
- 미해결이것이 진짜 크롤링이다 - 실전편
url도 출력하려면 어떻게 해야 하나요
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import requests import time import pyautogui import os import urllib.request import openpyxl # 검색어 입력하기 keyword = pyautogui.prompt("검색어를 입력하세요>>>") # 엑셀 생성 및 시트 추가 wb = openpyxl.Workbook() ws = wb.active ws.title = keyword # 시트의 타이틀을 검색어로 지정합니다. ws.append(['번호', '제목', '조회수', '날짜', 'url주소']) # 데이터 행 추가 chrome_options = Options() chrome_options.add_experimental_option("detach", True) # 불필요한 에러 메세지 없애기 chrome_options.add_experimental_option("excludeSwitches",["enable-logging"]) service = Service(executable_path=ChromeDriverManager().install()) url = f"https://www.youtube.com/results?search_query={keyword}" browser = webdriver.Chrome(service=service, options=chrome_options) browser.implicitly_wait(5) # 웹페이지가 로딩 될때까지 5초 기다림 browser.maximize_window() # 화면 최대화 browser.get(url) response = requests.get(url, headers={'User-agent':'Mozila/5.0'}) html = response.text soup = BeautifulSoup(html, 'html.parser') # 7번 스크롤하기 scroll_count = 7 i = 1 while True : # 맨 아래로 스크롤을 내린다. browser.find_element(By.CSS_SELECTOR,"body").send_keys(Keys.END) # 스크롤 사이에 페이지 로딩 시간 time.sleep(2) if i == scroll_count: break i += 1 # Selenium - Beautifulsoup 연동방법 html = browser.page_source soup = BeautifulSoup(html, 'html.parser') infos = soup.select('div.text-wrapper') for i, info in enumerate(infos,1) : # 원하는 정보를 가져오기 # 제목 title = info.select_one("a#video-title").text try: # 조회수 views = info.select_one("div#metadata-line>span:nth-child(3)").text # 날짜 data = info.select_one("div#metadata-line>span:nth-child(4)").text except: views = "조회수 0회" date = "실시간" try : # url주소 target = browser.find_element(By.CSS_SELECTOR,".yt-simple-endpoint.inline-block.style-scope.ytd-thumbnail") url_href = target.get_attribute['href'] except : url_href = "href없음" print(title, views, data, url_href) ws.append([i, title, views, data, url_href]) wb.save(f'07_유튜브_크롤링/{keyword}.xlsx')선생님 url 코드도 뽑아보고 싶어서 해봤는데 리스트 형태로 출력이 되어서 어떻게 하는지 궁금해서 여쭤봅니다 구글링 해 보았는데 제가 잘 못 찾아서 그런지 오류 나거나 리스트 형태로 밖에 출력이 안되네요[]
- 미해결이것이 진짜 크롤링이다 - 실전편
주소창에 sports가 들어가 있어도 읽어서 출력해요ㅠㅠ
import requests from bs4 import BeautifulSoup import time response = requests.get('https://search.naver.com/search.naver?ssc=tab.news.all&where=news&sm=tab_jum&query=%EC%86%90%ED%9D%A5%EB%AF%BC') html = response.text soup = BeautifulSoup(html, 'html.parser') articles = soup.select("div.info_group") # 뉴스 기사 div 10개 추출 for article in articles : links = article.select("a.info") # 리스트 if len(links) >= 2 : # 링크가 2개 이상이면 url = links[1].attrs['href'] # 두번째 링크의 href를 추출 # 다시 request 날려 준다 response = requests.get(url, headers={'User-agent':'Mozila/5.0'}) html = response.text soup = BeautifulSoup(html, 'html.parser') # 만약 연예 뉴스라면 if "entertain" in response.url : title = soup.select_one(".end_tit") content = soup.select_one("#articeBody") elif "sports" in response.url : title = soup.select_one("h4.title") content = soup.select_one("#newsEndContents") # 본문 내용안에 불필요한 div, p 삭제 divs = content.select('div') for div in divs : div.decompose() paragrahs = content.select('p') for p in paragrahs: p.decompose() else : title = soup.select_one(".media_end_head_headline") content = soup.select_one("#newsEndContents") print("==========링크==========\n", url) print("==========제목==========\n", title.text.strip()) print("==========본문==========\n", content.text.strip()) time.sleep(0.3)==========링크==========https://n.news.naver.com/mnews/article/005/0001678573?sid=102==========제목==========나이도 못 막았다… 8090 ‘은발의 손흥민’들Traceback (most recent call last):File "c:\Program Files\FirstPython\crawling\10.셀리니움_기본설정\Chapter04\04.스포츠뉴스크롤링하기.py", line 42, in <module>print("==========본문==========\n", content.text.strip())^^^^^^^^^^^^AttributeError: 'NoneType' object has no attribute 'text'하면 이렇게 에러가 나요 선생님 ㅠ.ㅠ 주소창을 보니깐 sports가 안 들어가 있는데 출력이 되어서 나옵니다. 혹시 넘어갈려면 어떻게 해야 하는지 여쭤봐도 되겠습니까?!
- 미해결이것이 진짜 크롤링이다 - 실전편
HTML 변경으로 인한 CSS 선택자 및 줄바꿈 문의
import requests from bs4 import BeautifulSoup response = requests.get('https://search.naver.com/search.naver?ssc=tab.news.all&where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90') html = response.text soup = BeautifulSoup(html, 'html.parser') news_infos = soup.select(' div.info_group') news_num = 1 for news_info in news_infos: news_link = news_info.select('a.info') if len(news_link) >= 2 : url = news_link[1].attrs['href'] news_info = requests.get(url) news = news_info.text news_information = BeautifulSoup(news, 'html.parser') news_text = news_information.select_one('article') print(str(news_num) , "입니다>>>>>>>>>>>>>>>>") print(news_text.text) news_num += 1CSS선택자를 article로 선택하고출력을 하였더니 결과값 사이 사이에 줄바꿈이 있네요없앨 수 있는 방법은 무엇일까요?
- 해결됨이것이 진짜 크롤링이다 - 실전편
수집 갯수 부족 오류 문의
선생님에게서 파이썬을 처음 배우고, 덕분에 크롤링을 체험할 수 있었습니다.항상 감사한 마음으로 수강하고 있습니다.조악하지만, 아래와 같은 코드로 유튜브 크롤링 코드를 만들어 보았는데 예를들어,https://www.youtube.com/@user-rr5gv5ov5j와 같은 채널의 동영상은 대략 88개인데 최종적으로 수집되는 데이터는 11개 동영상에 한정되어 수집됩니다.제가 어느 부분을 놓치고 있는지 감을 잡기가 어렵네요.또한 개선해야할 부분이 있다면 검토 부탁드립니다.바쁘시더라도 검토를 부탁드리며 작성해본 코드를 첨부합니다. ^^except Exception as e: print("스크롤 중 에러가 발생하였습니다.: ", e) all_titles = soup.find_all('yt-formatted-string', class_='style-scope ytd-rich-grid-media') all_views = soup.find_all('span', class_='style-scope ytd-thumbnail-overlay-time-status-renderer') titles = [title.string for title in all_titles] views = [view.string.strip() for view in all_views]
- 미해결이것이 진짜 크롤링이다 - 실전편
강의 노트
안녕하세요?강의 노트가 제공된다고 했는데... 어디에서 찾아 볼 수 있는지요?
- 미해결이것이 진짜 크롤링이다 - 실전편
유튜브 크롤링
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 선생님파이썬 처음 깔아봤는데 덕분에 여기까지 왔습니다어떻게 이것저것 끼워넣어서 코드를 만들기는 했는데유튜브 크롤링시날짜 지정해서 그 날짜만 가져오고 싶습니다스크롤 없애고 날짜 지정을 넣고 싶은데 너무 어렵네요코드 수정 부탁드려도 될까요ㅠㅠfrom selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup import time import pyautogui import openpyxl # 검색어 입력 keyword = pyautogui.prompt("검색어를 입력하세요") # 엑셀 생성 wb = openpyxl.Workbook() ws = wb.create_sheet(keyword) ws.append(['번호', '제목', '조회수', '날짜', 'URL']) #열 너비 조절 ws.column_dimensions['A'].width = 5 ws.column_dimensions['B'].width = 80 ws.column_dimensions['C'].width = 20 ws.column_dimensions['D'].width = 15 ws.column_dimensions['E'].width = 80 # 브라우저 설정 chrome_options = Options() chrome_options.add_experimental_option("detach", True) chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) browser = webdriver.Chrome(options=chrome_options) # YouTube 검색 페이지로 이동 url = f"https://www.youtube.com/results?search_query={keyword}" browser.implicitly_wait(5) browser.maximize_window() browser.get(url) # 스크롤 횟수 scroll_count = 5 # 스크롤 수행 i = 1 while True: browser.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END) time.sleep(0.7) if i == scroll_count: break i += 1 # 동적으로 로딩되는 콘텐츠를 기다림 wait = WebDriverWait(browser, 10) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "ytd-video-renderer #video-title"))) # 페이지 소스를 가져와 BeautifulSoup으로 파싱 html = browser.page_source soup = BeautifulSoup(html, 'html.parser') videos = soup.select("ytd-video-renderer") # 정보 추출 for i, video in enumerate(videos, 1): title = video.select_one("#video-title").text.strip() metadata = video.select_one("#metadata-line") views = metadata.find_all("span")[0].text.strip() if metadata else "조회수 0회" date = metadata.find_all("span")[1].text.strip() if metadata else "날짜 없음" # 각 영상의 URL 가져오기 video_url = video.select_one("#video-title").get("href", "") full_url = f"https://www.youtube.com{video_url}" print(title, views, date, full_url) ws.append([i, title, views, date, full_url]) # 브라우저 종료 browser.quit() # 엑셀 파일 저장 wb.save(f"{keyword}_유튜브_검색결과.xlsx")
- 미해결이것이 진짜 크롤링이다 - 실전편
유튜브 크롤링시 어려움
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요유튜브 크롤링 중에 이렇게 코드를 돌리면 전립선암의 증상과 진단을 위한 검사는? [AMC 병법] 조회수 0회 날짜 없음 모든 결과가 조회수0회 날짜없음으로 가져와집니다ㅠㅠ어디가 문제일까요? from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options import time from bs4 import BeautifulSoup # 브라우저 꺼짐 방지 chrome_options = Options() chrome_options.add_experimental_option("detach", True) # 불필요한 에러 메시지 없애기 chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) # 브라우저 생성 browser = webdriver.Chrome(options=chrome_options) url = "https://www.youtube.com/results?search_query=%EC%95%94" #웹페이지 해당 주소 이동 browser.implicitly_wait(5) #웹페이지가 로드될때까지 5초는 기다린다 browser.maximize_window() #화면 최대화 browser.get(url) #3번 스크롤하기 scroll_count = 3 i = 1 while True: #맨 아래로 스크롤을 내린다. browser.find_element(By.CSS_SELECTOR,"body").send_keys(Keys.END) #스크롤 사이에 페이지 로딩 시간 time.sleep(2) if i == scroll_count: break i += 1 #selenium - beautifulsoup 연동방법 html = browser.page_source soup = BeautifulSoup(html, 'html.parser') infos = soup.select("div.text-wrapper") for info in infos: #원하는 정보 가져오기 #제목 title = info.select_one("a#video-title").text try: #조회수 views = info.select_one("div#metadata-line > span:nth-child(1)").text #날짜 date = info.select_one("div#metadata-line > span:nth-child(2)").text except: views = "조회수 0회" date = "날짜 없음" print(title, views, date) browser.quit()
- 미해결이것이 진짜 크롤링이다 - 실전편
크롬 웹드라이버가 필요 없어진걸로 알고 있습니다. 어떻게 수정해야 하나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 유튜브 제목 크롤링을 하려는데웹드라이버문제로 아예 초반부터 막혔습니다ㅠㅠ초반 코드 도와주세요...
- 미해결이것이 진짜 크롤링이다 - 실전편
전처리전 강의인데 조회수와 날짜가 출력되지 않습니다.
from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom bs4 import BeautifulSoupimport timeimport pyautoguiimport openpyxl# 검색어 입력keyword = pyautogui.prompt("검색어를 입력하세요")#엑셀 생성wb = openpyxl.Workbook()ws = wb.create_sheet(keyword)ws.append(['번호','제목','조회수', '날짜']) url = f"https://www.youtube.com/results?search_query={keyword}"browser = webdriver.Chrome("c:/chromedriver.exe" )browser.implicitly_wait(10)browser.maximize_window()browser.get(url)# 7번 스크롤하기scroll_count=7i=1while True: # 맨 아래로 스크롤을 내린다. browser.find_element_by_css_selector("body").send_keys(Keys.END) # 스크롤 사이에 페이지 로딩 시간 time.sleep(2) if i == scroll_count: break i +=1 # Selenium - Beautifulsoup 연동방법html = browser.page_sourcesoup = BeautifulSoup(html, 'html.parser')infos = soup.select("div.text-wrapper")for i, info in enumerate(infos, 1):# 원하는 정보 가져오기# 제목 title = info.select_one("a#video-title").text try: # 조회수 views = info.select_one("div#metadata-line>span:nth-child(1)").text # 날짜 date = info.select_one("div#metadata-line>span:nth-child(2)").text except: views = "조회수 0회" date = "날짜 없음" print(title, views, date) ws.append([i, title, views, date])wb.save(f'07_유투브_크롤링/{keyword}.xlsx')
- 미해결이것이 진짜 크롤링이다 - 실전편
requests 라이브러리를 활용한 쿠팡 로그인 가능 여부
안녕하세요.쿠팡에서 제가 주문한 주문내역을 크롤링하고 싶은데, 우선 로그인이 필요하겠더라구요.로그인 화면 URL은 https://login.coupang.com/login/login.pang 이고,주문 내역 URL은 https://mc.coupang.com/ssr/desktop/order/list 인데,제가 아는 모든 방법을 동원해도 session.post 요청을 날리면 무한로딩에 빠져버리네요..강사님께서는 requests 라이브러리를 이용한 쿠팡 로그인이 가능한 지 여쭤봅니다.제가 작성한 코드를 아래 남깁니다.import requests login_url = "https://login.coupang.com/login/login.pang" user = 'EMAIL' password = 'PASSWORD' login_data = dict() login_data['email'] = user login_data['password'] = password 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', } with requests.Session() as session: res = session.post(login_url, data = login_data, headers=header) url_order = 'https://mc.coupang.com/ssr/desktop/order/list' res = session.get(url_order) print(res.content)
- 미해결이것이 진짜 크롤링이다 - 실전편
쿠팡 브랜드 CSS 선택자
강의에서는 class name이 a.prod-brand-name로 잘 나오는데,제가 사이트에서 확인할 때는 .prod-brand-name brandshop-link 으로 보입니다.실행시켜보면a.prod-brand-name 이 맞고.prod-brand-name brandshop-link 는 아닙니다.직접 찾아볼 때는 .prod-brand-name이 안보이는데 어떻게 찾을 수 있을까요?CSS 선택자를 잘 못 정하겠습니다.ㅠㅠ
- 해결됨이것이 진짜 크롤링이다 - 실전편
키워드입력시 오류
안녕하세요 선생님 2가지의 질문이 있습니다.아래와 같이 코드를 구성했습니다.1. 키워드로 강남역 맛집 / 이태원 술집으로는 엑셀파일로 저장이 잘 되는데 "행궁동 맛집"이라고 치면 아래와 같은 오류가 출력됩니다. 왜이러는 걸까요?제 생각엔 "이태원 술집" , "강남역 맛집"에서는 iframe 안쪽을 한번 클릭 하는 것이 실행이 되는 것 같은데 "행궁동 맛집", "용산역 맛집"에서는 검색어 입력 후 iframe 클릭 하지 않고 바로 스크롤이 되는 것 같습니다. C:\CRAWLLING>C:/Users/libra_erv8ij1/AppData/Local/Programs/Python/Python312/python.exe c:/CRAWLLING/CRAWLING심화/ch7.네이버지도크롤링/06.데이터저장.pyc:\CRAWLLING\CRAWLING심화\ch7.네이버지도크롤링\06.데이터저장.py:85: SyntaxWarning: invalid escape sequence '\c'wb.save(f"CRAWLING심화\ch7.네이버지도크롤링\\{keyword}.xlsx")Traceback (most recent call last):File "c:\CRAWLLING\CRAWLING심화\ch7.네이버지도크롤링\06.데이터저장.py", line 81, in <module>print(rank, name, star)^^^^NameError: name 'name' is not definedfrom 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 import pyautogui import openpyxl keyword = pyautogui.prompt("검색어를 입력하세요") wb = openpyxl.Workbook() ws = wb.create_sheet(keyword) ws.append(["순위", "이름", "별점"]) 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(10) 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(keyword) time.sleep(1) search.send_keys(Keys.ENTER) time.sleep(2) # iframe 안으로 들어가기 driver.switch_to.frame("searchIframe") # driver.switch_to_default_content() iframe 밖으로 나오기 # iframe 안쪽을 한번 클릭 driver.find_element(By.CSS_SELECTOR, "#_pcmap_list_scroll_container").click() # 로딩된 데이터 개수 확인 lis = driver.find_elements(By.CSS_SELECTOR, "li.UEzoS") before_len = len(lis) while True: # 맨 아래로 스크롤 내린다 driver.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END) # 아무 태그나 선택하기 위해 body를 선택하는 것 # 스크롤 사이 페이지 로딩 시간 time.sleep(1.5) # 스크롤 후 로딩된 데이터 개수 확인 lis = driver.find_elements(By.CSS_SELECTOR, "li.UEzoS") after_len = len(lis) # 로딩된 데이터 개수가 같다면 반복 멈춤 if before_len == after_len: break before_len = after_len # 데이터 기다리는 시간을 0으로 만들어줌 (데이터가 없어도 빠르게 넘어감) driver.implicitly_wait(0) rank = 1 for li in lis: # 광고상품 아닌것만 if len(li.find_elements(By.CSS_SELECTOR, "svg.dPXjn")) == 0: # 별점이 있는 것만 크롤링 if len(li.find_elements(By.CSS_SELECTOR, "span.h69bs.orXYY")) > 0: # 가게명 name = li.find_element( By.CSS_SELECTOR, "span.TYaxT").text # 별점 star = li.find_element(By.CSS_SELECTOR, ".h69bs.orXYY").text.split('\n')[1] print(rank, name, star) ws.append([rank, name, float(star)]) rank = rank + 1 wb.save(f"CRAWLING심화\ch7.네이버지도크롤링\\{keyword}.xlsx") # 새롭게 오픈한 가게이면 if len(li.find_elements(By.CSS_SELECTOR, "span.h69bs.DjPAB")) > 0: try: # 방문자 리뷰수 visit_review = li.find_element(By.CSS_SELECTOR,"span.h69bs:nth-child(3)").text except: visit_review = "0" # 새로 오픈한 가게가 아니면 else: try: visit_review = li.find_element(By.CSS_SELECTOR,"span.h69bs:nth-child(2)").text except: visit_review = "0"네이버 지도가 바뀌어서 리뷰가 바뀌었습니다.위와 같이 새로 오픈한 가게로 해서 코드를 작성했는데 작동하지 않습니다. 어떻게 코드를 구성하면 좋을까요?
- 해결됨이것이 진짜 크롤링이다 - 실전편
NoSuchElementException 이라고 뜹니다
안녕하세요 선생님 ~ 질문있습니다.아래의 코드를 실행하니 NoSuchElementException이라고 뜹니다. 제가 생각하기엔 큰이미지를 다운로드 하는 과정에서 첫번째 사진만 저장되고 그 이후에 저런 메세지가 나옵니다.CSS 선택자가 잘못된 것 같은데 해결을 못하고 있습니다 ㅠㅠ 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 os import urllib.request import pyautogui # 크롬 드라이버 자동 업데이트 from webdriver_manager.chrome import ChromeDriverManager keyword = pyautogui.prompt("검색어를 입력하세요.") if not os.path.exists(f'CRAWLING심화\ch4.구글이미지크롤링\{keyword}') == True: os.mkdir(f'CRAWLING심화\ch4.구글이미지크롤링\{keyword}') # 브라우저 꺼짐 방지 코드 chrome_options = Options() chrome_options.add_experimental_option("detach", True) # 불필요한 에러 메세지 차단 chrome_options.add_experimental_option('excludeSwitches', ["enable-logging"]) # 최신 버전의 ChromeDriver 경로를 자동으로 다운로드하거나 검색 service = Service(executable_path=ChromeDriverManager().install()) driver = webdriver.Chrome(service=service, options=chrome_options) # url 검색 url = f"https://www.google.com/search?q={keyword}&sca_esv=581612012&tbm=isch&sxsrf=AM9HkKnRu6DCGGz23e29xT4BSB7Hq95zgA:1699754235522&source=lnms&sa=X&ved=2ahUKEwiboaf7rb2CAxWJfd4KHWkWA9MQ_AUoAXoECAQQAw&biw=1552&bih=737&dpr=1.65" # 웹 페이지가 로딩될때까지 10초 기다림 driver.implicitly_wait(10) # 화면 최대화 driver.maximize_window() driver.get(url) # 스크롤 전 높이 before_h = driver.execute_script("return window.scrollY") # 무한 스크롤 while True: # 맨 아래로 스크롤 내린다. driver.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END) # 스크롤 사이 페이지 로딩 시간 time.sleep(1) # 스크롤 후 높이 after_h = driver.execute_script("return window.scrollY") if after_h == before_h: break before_h = after_h # 썸네일 이미지 태크 추출 imgs = driver.find_elements(By.CSS_SELECTOR, ".rg_i.Q4LuWd") for i, img in enumerate (imgs, 1): # 이미지를 클릭해서 큰 사이즈 찾기 # 클릭하다보면 element click intercepted 에러가 등장 # javascript로 클릭을 직접 하도록 만들어주면 된다 driver.execute_script("arguments[0].click();", img) img.click() time.sleep(1) # 큰 이미지 주소 추출 target = driver.find_element(By.CSS_SELECTOR, 'img.sFlh5c.pT0Scc.iPVvYb') img_src = target.get_attribute('src') opener = urllib.request.build_opener() opener.addheaders = [('User-Agent', 'Mozila/5.0')] urllib.request.install_opener(opener) # 이미지 다운로드 urllib.request.urlretrieve(img_src, f'CRAWLING심화\ch4.구글이미지크롤링\{keyword}\{keyword}{i}.jpg') print(f'img {i}개 : {target}')
- 해결됨이것이 진짜 크롤링이다 - 실전편
쿠팡 첫페이지 관련 href 오류가 뜹니다.
강의노트에 올려주신 코드를 그대로 복붙해서 실행시켰는데,C:\CRAWLLING> cmd /C "C:\Users\libra_erv8ij1\AppData\Local\Programs\Python\Python312\python.exe c:\Users\libra_erv8ij1\.vscode\extensions\ms-python.python-2023.20.0\pythonFiles\lib\python\debugpy\adapter/../..\debugpy\launcher 1693 -- "c:\CRAWLLING\CRAWLING 심화\ch3. 쿠팡크롤링\01.첫번째페이지크롤링.py" "Traceback (most recent call last): File "c:\CRAWLLING\CRAWLING 심화\ch3. 쿠팡크롤링\01.첫번째페이지크롤링.py", line 20, in <module> sub_url = "https://www.coupang.com" + link.attrs['href'] ~~~~~~~~~~^^^^^^^^KeyError: 'href'href 관련 오류가 나옵니다. 왜그러는걸까요?