묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
무한스크롤 관련 내용입니다.
안녕하세요! 다른분꺼 내용 보고 해답을 찾을 뻔 했다가 무한스크롤이 50번째에서 멈추는 현상을 발견했습니다 ㅠㅠ 저는 크롬 브라우저를 띄우지 않고 진행하니까 500개까지 크롤링이 되었는데, 크롬 브라우저를 띄우고 진행하고싶은데 어떻게 해결해야할까요,,? 로딩시간 2초정도 할당했는데 진행이 안되서 질문 남깁니다!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 urllib.request # 크롬 드라이버 자동 업데이트 from webdriver_manager.chrome import ChromeDriverManager import time import pyautogui import os # 브라우저 꺼짐 방지 chrome_options = Options() chrome_options.add_experimental_option("detach", True) # 크롬창 안뜨게 함 chrome_options.add_argument('--headless') # headless 모드 활성화 chrome_options.add_argument('--disable-gpu') # GPU 가속 비활성화 # Mozilla 웹 브라우저에서 온 것처럼 인식 / 자동화된 요청을 감지하고 차단하는 것을 우회 chrome_options.add_argument("--user-agent=Mozilla/5.0") # 불필요 메세지 없애기 chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) # 드라이버 업데이트 service = Service(executable_path=ChromeDriverManager().install()) # 옵션 적용 browser = webdriver.Chrome(service=service, options=chrome_options) keyword = pyautogui.prompt('검색어를 입력하세요.') # 폴더 만들기 if not os.path.exists(f'크롤링/심화2/{keyword}모음'): os.mkdir(f'크롤링/심화2/{keyword}모음') # path = f'https://www.google.co.kr/search?tbm=isch&hl=ko&source=hp&biw=&bih=&q={keyword}' # 구글 path = f'https://search.naver.com/search.naver?where=image&sm=tab_jum&query={keyword}' # 네이버 browser.implicitly_wait(5) browser.maximize_window() browser.get(path) before_h = browser.execute_script("return window.scrollY") # 무한스크롤 while True: time.sleep(2) # 맨 아래로 스크롤을 내림 browser.find_element(By.CSS_SELECTOR,"body").send_keys(Keys.END) # 스크롤 후 높이 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): # 각 이미지 태그의 주소 추출 link = img.get_attribute('src') # 이미지 저장 urllib.request.urlretrieve(link, f'크롤링/심화2/{keyword}모음/{i}.png') print(f'img {i}개: {link}') print('\nDvlp.H.Y.C.Sol\n')
-
미해결[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
주의요함 data;
잘되다가 여기서 멈춰서 error가 뜨네요
-
미해결[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
강의보기전에 짠코드 질문있습니당
import requests,openpyxl from bs4 import BeautifulSoup from openpyxl.styles import Font wb = openpyxl.Workbook() wb.create_sheet('증권') del wb['Sheet'] ws = wb['증권'] ws.append(['순번','종목','PER','ROE','DATE']) path = 'C:/Users/user/DESKTOP/' count = 10 x =1 requests.get('https://finance.naver.com/sise/field_submit.naver?menu=market_sum&returnUrl=http%3A%2F%2Ffinance.naver.com%2Fsise%2Fsise_market_sum.naver%3F%26page%3D1&fieldIds=per&fieldIds=roe&fieldIds=high_val&fieldIds=low_val&fieldIds=pbr&fieldIds=reserve_ratio') for t in range(1,count + 1,1) : respone = requests.get(f'https://finance.naver.com/sise/sise_market_sum.naver?sosok=0&page={t}') html = respone.text soup = BeautifulSoup(html,'html.parser') for i in range(1,100,1): first_link = f"#contentarea > div.box_type_l > table.type_2 > tbody > tr:nth-child({i+1})" links = soup.select(first_link) for link in links : try: name = link.select_one(f"{first_link} > td:nth-child(2)").text per = link.select_one(f"{first_link} > td:nth-child(9)").text roe = link.select_one(f"{first_link} > td:nth-child(11)").text dae = link.select_one(f"{first_link} > td:nth-child(12)").text ws.append([x,name,per,roe,dae]) x += 1 except: pass wb.save(f'{path}증권.xlsx')강의 듣기 전 과제 내주셨을때 짠 코드인대용아직도 살짝 이해가 안되는대 처음 짤 때 reqsuetst.get 부분에 요청 보내고 난 후 url은 변경없이 동일해서 새로운 변수에 기존 url 저장했었거든용 아래처럼respone = requests.get(f'https://finance.naver.com/sise/sise_market_sum.naver?sosok=0&page={t}')기존 url사용했을때 체크박스 저장했던 내용이 계속 보이던대 뭐때문인지 알수있을까용.. 그리구 td부분 저장 도중에 바부분 처리 할줄몰랐어 저런씩으로 try와 except로 처리 했었는대 이코드 뿐만 아니라 추 후에 이런 비슷한거 나왔을떄 저렇게 짜면 문제가 될가능성이 있을까용 ?
-
미해결[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
gui로 검색어 변경 시 다른 내용이 나와요!
안녕하세요! 크롤링 진행중입니다!제가 keyword 변수에 gui 를 사용해서 검색어를 input하는 방식으로 이용중입니다. 그냥 경로를 넣었을 때는 검색어가 잘 나오는데, gui를 사용하면 다른 내용이 나옵니다. 저의 결과로는 책을 크롤링해오고 있습니다.. 무엇이 문제일까요 ㅠㅠ import requests from bs4 import BeautifulSoup import time import pyautogui keyword = pyautogui.prompt('검색어를 입력하세요.') path = 'https://www.coupang.com/np/search?q={keyword}&channel=recent' # 헤더에 User-Agent, Accept-Language 를 추가하지 않으면 멈춤 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_1 = requests.get(path, headers=header) html = response_1.text soup_1 = BeautifulSoup(html, 'html.parser') links = soup_1.select('a.search-product-link') for link in links: # 광고상품 제거 if len(link.select('span.ad-badge-text')) > 0: print('광고 상품 입니다.') else: sub_path = 'https://www.coupang.com/' + link.attrs['href'] # print(sub_path) response_2 = requests.get(sub_path, headers=header) html = response_2.text soup_2 = BeautifulSoup(html, 'html.parser') # 회사 - 있을 수도 있고, 없을 수도 있음. # 중고상품은 태그가 달라짐 try: brand_name = soup_2.select_one('a.prod-brand-name').text except: brand_name = "" # 제품명 product_name = soup_2.select_one('h2.prod-buy-header__title').text # 가격 try: product_price = soup_2.select_one('span.total-price > strong').text except: product_price = 0 print(brand_name, product_name, product_price) print('\nDvlp.H.Y.C.Sol\n')
-
미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
pyautogui 설치시 이번에는 오류 메시지가 바뀌었네요... 그리고 다른 방법들도 다 해봤는데 안되네요
pyautogui 설치시 이번에는 오류 메시지가 바뀌었네요... 그리고 다른 방법들도 다 해봤는데 안되네요 방화벽을 끄는 방법과 직접 다운로드 받아서 설치하는 것까지 다 해봤는데아래에 이미지 처럼 WinError 5 액세스 거부가 되었네요. 이 에러가 윈도우 운영체제 버전과 상관이 있나요? 제가 사용하는 윈도우가 11인데 요즘 윈도우가 버전이 높아지면서 안되는게 제법 많아진 것 같아서요..어떻게 해결해야 될지 정말 막막하네요... 아니면 pyautogui를 빼고 진행을 해야 할지 고민을 해봐야 겠네요.. ㅠㅠ 꼭 좀알려주세요...
-
해결됨실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
find로 찾을 때 계속해서 none이 나옵니다.
안녕하세요. 뷰티풀수프 기초 사용법 수강 중에 잘 안되는 부분이 있어서 질문 남깁니다. 네이버 메인 화면 개발자 모드에서 <span class="service_name">메일</span> 라는 태그를 찾아서이 태그를 찾기 위해 span = soup.find(class_="service_name", string="메일") print(span) 이렇게 작성했는데 왜 결과값이 none 이 나오는지 이유를 모르겠습니다 ㅠㅠ 그리고 앞의 강의에서 개발자 모드의 element가 아니라 소스보기에서 보이는 코드에서 태그를 검색해서 찾아내는 것(?)이라고 말씀하셨던 것 같은데 제대로 이해한게 맞나요?소스 보기로 보면 코드가 너무 지저분하게 보이는데 혹시 깔끔하게 볼 수 있는 방법이 있을까요?
-
미해결[웹 개발 풀스택 코스] Node.js 프로젝트 투입 일주일 전 - 기초에서 실무까지
mysql 챕터에 있는 테이블은 도대체 어디에 있는가??
수업자료 라고 링크 걸려 있는 곳에도 없고..테이블을 화면 보고 알아서 만들라는 건가..내가 못 찾는 건가..
-
미해결[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
뉴스기사크롤링중 이런 오류가 나올 경우엔 어떻게 해야 하나요?
잘 따오다가 갑자기 오류가 나더니 그 뒤로 계속 이 오류창이 뜹니다ㅠㅠ isLastPage = soup.select_one("a.btn_next").attrs['aria-disabled'] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^AttributeError: 'NoneType' object has no attribute 'attrs' 코드는 이렇게 작성했어요9월뉴스 결과가 필요한데400페이지까지 밖에 못 긁어온다고 그래서 대충 여러번에 나눠서 작업중입니다ㅠㅠ#네이버기사 크롤링 엑셀저장 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 = 60 ws.column_dimensions['C'].width = 30 #행 번호 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=%EC%95%94&sm=tab_opt&sort=1&photo=0&field=0&pd=3&ds=2023.09.01&de=2023.09.07&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") #리스트 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') 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") #만약 스포츠 뉴스라면 elif "sports" in response.url: title = soup_sub.select_one("h4.title") 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") print("=======링크======= \n", url) print("=======제목======= \n", title.text.strip() if title else "제목을 찾을 수 없습니다.") print("=======날짜======= \n", date.text if date else "날짜를 찾을 수 없습니다.") # 'else' 블록에서 'date' 변수 정의는 여기서 끝나도록 수정 ws['A1'] = 'URL' ws['B1'] = '기사제목' ws['C1'] = '업로드날짜' ws[f'A{row}'] = url ws[f'B{row}'] = title.text.strip() if title else "제목을 찾을 수 없습니다." if date: ws[f'C{row}'] = date.text.strip() else: ws[f'C{row}'] = "날짜를 찾을 수 없습니다." row=row+1 #마지막 페이지 여부 확인하기 isLastPage = soup.select_one("a.btn_next").attrs['aria-disabled'] if isLastPage == 'true': print("마지막 페이지 입니다.") break pageNum = pageNum+1 wb.save(r'/Users/eunkyungsong/Desktop/코딩/10월 셀레니움 크롤링/실전/9월뉴스기사크롤링/' + f'{keyword}_result.9월.본문x.9.07.xlsx')
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
service 관련코드를 지우면 실행이 안되요
저는 selenium 4.14 버전 사용중인데 service 관련 내용들을 지우면 실행이 되지 않는데 뭐가 문제일까요? 아래 오류가 뜹니다. driver = webdriver.Chrome() ^^^^^^^^^^^^^^^^^^ File "c:\users\user\appdata\local\packages\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\localcache\local-packages\python311\site-packages\selenium\webdriver\chrome\webdriver.py", line 45, in __init__ super().__init__( File "c:\users\user\appdata\local\packages\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\localcache\local-packages\python311\site-packages\selenium\webdriver\chromium\webdriver.py", line 51, in __init__ self.service.path = DriverFinder.get_path(self.service, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\users\user\appdata\local\packages\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\localcache\local-packages\python311\site-packages\selenium\webdriver\common\driver_finder.py", line 41, in get_path raise NoSuchDriverException(msg) from errselenium.common.exceptions.NoSuchDriverException: Message: Unable to obtain driver for chrome using Selenium Manager.; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location
-
미해결R로 하는 텍스트마이닝 (Top keyword부터 감성분석까지)
top Keword 추출 강의 질문
Top Keword 추출 강의에서 수업자료에 commnts와 score 파일이 없는데 어디서 받을 수 있을까요?
-
미해결[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
뉴스기사크롤링시 날짜 범위 지정하는 방법 알려주세요
안녕하세요 선생님파이썬 자체를 처음 깔아봤는데 선생님 덕분에 여기까지 왔습니다...감사드려요ㅠㅠㅠㅠ 뉴스기사들을 엑셀화 하는 거 까지는 따라갔는데기간의 범위를 정하고 싶어요 머리가 안 돌아가네요ex) 3분기 기사만 가져오고 싶다 / 8월달 기사만 가져오고 싶다어느 부분을 어떻게 바꿔주면 되는지 코드 부탁드립니다+네이버 기사 가져올때 400페이지까지 밖에 못 가져오던데 혹시 다른 방법은 없을까요?#네이버기사 크롤링 엑셀저장 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 = 60 ws.column_dimensions['C'].width = 120 ws.column_dimensions['D'].width = 60 #행 번호 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?sm=tab_hty.top&where=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") #리스트 if len(links) >= 2: #링크가 2개 이상이면 url = links[1].attrs['href'] #두번째 링크의 href를 추출 response = requests.get(url, headers={'User-agent': 'Mozila/5.0'}) html = response.text soup_sub = BeautifulSoup(html, 'html.parser') #만약 연예 뉴스라면 if "entertain" in response.url: title = soup_sub.select_one(".end_tit") content = soup_sub.select_one("#articeBody") date = soup_sub.select_one("div.article_info > span > em") #만약 스포츠 뉴스라면 elif "sports" in response.url: title = soup_sub.select_one("h4.title") content = soup_sub.select_one("#newsEndContents") #본문 내용안에 불필요한 div, p제거 divs = content.select("div") for div in divs: div.decompose() paragraphs = content.select("p") for p in paragraphs: p.decompose() else: title = soup_sub.select_one(".media_end_head_headline") content = soup_sub.select_one("#newsct_article") date = soup_sub.select_one("span.media_end_head_info_datestamp_time._ARTICLE_DATE_TIME") print("=======링크======= \n", url) print("=======제목======= \n", title.text.strip()) print("=======본문======= \n", content.text.strip()) print("=======날짜======= \n", date) ws['A1'] = 'URL' ws['B1'] = '기사제목' ws['C1'] = '기사본문' ws['D1'] = '업로드날짜' ws[f'A{row}'] = url ws[f'B{row}'] = title.text.strip() ws[f'C{row}'] = content.text.strip() ws[f'D{row}'] = date.text.strip() row=row+1 pageNum = pageNum+1 wb.save(f'{keyword}_result.date.xlsx')
-
미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
pyautogui 설치시 오류가 뜨네요
제가 프롬프트 창에서 pip install pyautogui 를 입력해서실행을 시켰는데 '파일에 바이러스 또는 기타 사용자 동의 없이 실치된 소프트웨어가 있기 때문에 작업이 완료되지 않았습니다'라는 오류메시지가 뜨면서 설치가 안되네요. 왜그런지 알려주세요 오류 이미지도 같이 올릴게요
-
미해결파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
beautiful soup 명령 실행 오류 관련 문의
안녕하세요 파이썬 입문과크롤링 기초 부트캠프 수강 중 beautiful soup 명령 (크롤링) 실행 오류 발생하여 문의드립니다. beautiful soup 명령 실행 시 아래와 같은 오류가 발생하네요. (아나콘다 및 bs 재설치 해도 동일 문제 발생) 개인 노트북으로 학습 할 때는 잘되는데 회사 pc로 하니 이런 오류가 발생하네요..사정상 회사pc로도 학습을 해야하는데 난감하네요 도움 부탁드립니다. [명령문]import requestsfrom bs4 import BeautifulSoupres = requests.get('https://davelee-fun.github.io/blog/crawl_test_css.html')soup = BeautifulSoup(res.content, 'html.parser')[오류내용]SSLCertVerificationError Traceback (most recent call last) File ~\AppData\Local\anaconda3\Lib\site-packages\urllib3\connectionpool.py:714, in HTTPConnectionPool.urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw) 713 # Make the request on the httplib connection object. --> 714 httplib_response = self._make_request( 715 conn, 716 method, 717 url, 718 timeout=timeout_obj, 719 body=body, 720 headers=headers, 721 chunked=chunked, 722 ) 724 # If we're going to release the connection in ``finally:``, then 725 # the response doesn't need to know about the connection. Otherwise 726 # it will also try to release it and we'll have a double-release 727 # mess. File ~\AppData\Local\anaconda3\Lib\site-packages\urllib3\connectionpool.py:403, in HTTPConnectionPool._make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw) 402 try: --> 403 self._validate_conn(conn) 404 except (SocketTimeout, BaseSSLError) as e: 405 # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. File ~\AppData\Local\anaconda3\Lib\site-packages\urllib3\connectionpool.py:1053, in HTTPSConnectionPool._validate_conn(self, conn) 1052 if not getattr(conn, "sock", None): # AppEngine might not have `.sock` -> 1053 conn.connect() 1055 if not conn.is_verified: File ~\AppData\Local\anaconda3\Lib\site-packages\urllib3\connection.py:419, in HTTPSConnection.connect(self) 417 context.load_default_certs() --> 419 self.sock = ssl_wrap_socket( 420 sock=conn, 421 keyfile=self.key_file, 422 certfile=self.cert_file, 423 key_password=self.key_password, 424 ca_certs=self.ca_certs, 425 ca_cert_dir=self.ca_cert_dir, 426 ca_cert_data=self.ca_cert_data, 427 server_hostname=server_hostname, 428 ssl_context=context, 429 tls_in_tls=tls_in_tls, 430 ) 432 # If we're using all defaults and the connection 433 # is TLSv1 or TLSv1.1 we throw a DeprecationWarning 434 # for the host. File ~\AppData\Local\anaconda3\Lib\site-packages\urllib3\util\ssl_.py:449, in ssl_wrap_socket(sock, keyfile, certfile, cert_reqs, ca_certs, server_hostname, ssl_version, ciphers, ssl_context, ca_cert_dir, key_password, ca_cert_data, tls_in_tls) 448 if send_sni: --> 449 ssl_sock = _ssl_wrap_socket_impl( 450 sock, context, tls_in_tls, server_hostname=server_hostname 451 ) 452 else: File ~\AppData\Local\anaconda3\Lib\site-packages\urllib3\util\ssl_.py:493, in _ssl_wrap_socket_impl(sock, ssl_context, tls_in_tls, server_hostname) 492 if server_hostname: --> 493 return ssl_context.wrap_socket(sock, server_hostname=server_hostname) 494 else: File ~\AppData\Local\anaconda3\Lib\ssl.py:517, in SSLContext.wrap_socket(self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, session) 511 def wrap_socket(self, sock, server_side=False, 512 do_handshake_on_connect=True, 513 suppress_ragged_eofs=True, 514 server_hostname=None, session=None): 515 # SSLSocket class handles server_hostname encoding before it calls 516 # ctx._wrap_socket() --> 517 return self.sslsocket_class._create( 518 sock=sock, 519 server_side=server_side, 520 do_handshake_on_connect=do_handshake_on_connect, 521 suppress_ragged_eofs=suppress_ragged_eofs, 522 server_hostname=server_hostname, 523 context=self, 524 session=session 525 ) File ~\AppData\Local\anaconda3\Lib\ssl.py:1108, in SSLSocket._create(cls, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, context, session) 1107 raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets") -> 1108 self.do_handshake() 1109 except (OSError, ValueError): File ~\AppData\Local\anaconda3\Lib\ssl.py:1379, in SSLSocket.do_handshake(self, block) 1378 self.settimeout(None) -> 1379 self._sslobj.do_handshake() 1380 finally: SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1006) During handling of the above exception, another exception occurred: MaxRetryError Traceback (most recent call last) File ~\AppData\Local\anaconda3\Lib\site-packages\requests\adapters.py:486, in HTTPAdapter.send(self, request, stream, timeout, verify, cert, proxies) 485 try: --> 486 resp = conn.urlopen( 487 method=request.method, 488 url=url, 489 body=request.body, 490 headers=request.headers, 491 redirect=False, 492 assert_same_host=False, 493 preload_content=False, 494 decode_content=False, 495 retries=self.max_retries, 496 timeout=timeout, 497 chunked=chunked, 498 ) 500 except (ProtocolError, OSError) as err: File ~\AppData\Local\anaconda3\Lib\site-packages\urllib3\connectionpool.py:798, in HTTPConnectionPool.urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw) 796 e = ProtocolError("Connection aborted.", e) --> 798 retries = retries.increment( 799 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2] 800 ) 801 retries.sleep() File ~\AppData\Local\anaconda3\Lib\site-packages\urllib3\util\retry.py:592, in Retry.increment(self, method, url, response, error, _pool, _stacktrace) 591 if new_retry.is_exhausted(): --> 592 raise MaxRetryError(_pool, url, error or ResponseError(cause)) 594 log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) MaxRetryError: HTTPSConnectionPool(host='davelee-fun.github.io', port=443): Max retries exceeded with url: /blog/crawl_test_css.html (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1006)'))) During handling of the above exception, another exception occurred: SSLError Traceback (most recent call last) Cell In[3], line 4 1 import requests 2 from bs4 import BeautifulSoup ----> 4 res = requests.get('https://davelee-fun.github.io/blog/crawl_test_css.html') 5 soup = BeautifulSoup(res.content, 'html.parser') File ~\AppData\Local\anaconda3\Lib\site-packages\requests\api.py:73, in get(url, params, **kwargs) 62 def get(url, params=None, **kwargs): 63 r"""Sends a GET request. 64 65 :param url: URL for the new :class:`Request` object. (...) 70 :rtype: requests.Response 71 """ ---> 73 return request("get", url, params=params, **kwargs) File ~\AppData\Local\anaconda3\Lib\site-packages\requests\api.py:59, in request(method, url, **kwargs) 55 # By using the 'with' statement we are sure the session is closed, thus we 56 # avoid leaving sockets open which can trigger a ResourceWarning in some 57 # cases, and look like a memory leak in others. 58 with sessions.Session() as session: ---> 59 return session.request(method=method, url=url, **kwargs) File ~\AppData\Local\anaconda3\Lib\site-packages\requests\sessions.py:589, in Session.request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json) 584 send_kwargs = { 585 "timeout": timeout, 586 "allow_redirects": allow_redirects, 587 } 588 send_kwargs.update(settings) --> 589 resp = self.send(prep, **send_kwargs) 591 return resp File ~\AppData\Local\anaconda3\Lib\site-packages\requests\sessions.py:703, in Session.send(self, request, **kwargs) 700 start = preferred_clock() 702 # Send the request --> 703 r = adapter.send(request, **kwargs) 705 # Total elapsed time of the request (approximately) 706 elapsed = preferred_clock() - start File ~\AppData\Local\anaconda3\Lib\site-packages\requests\adapters.py:517, in HTTPAdapter.send(self, request, stream, timeout, verify, cert, proxies) 513 raise ProxyError(e, request=request) 515 if isinstance(e.reason, _SSLError): 516 # This branch is for urllib3 v1.22 and later. --> 517 raise SSLError(e, request=request) 519 raise ConnectionError(e, request=request) 521 except ClosedPoolError as e: SSLError: HTTPSConnectionPool(host='davelee-fun.github.io', port=443): Max retries exceeded with url: /blog/crawl_test_css.html (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1006)')))
-
해결됨실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
네이버 쇼핑 크롤링 문의
from bs4 import BeautifulSoup import requests keyword = input("검색할 제품을 입력하세요 : ") url = f"https://search.shopping.naver.com/search/all?query={keyword}" user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36" headers = {"User-Agent" : user_agent} req = requests.get(url, headers = headers) html = req.text soup = BeautifulSoup(html, 'html.parser') items = soup.select(".product_item__MDtDF") print(items) print(len(items))네이버 쇼핑 크롤링 중 문의사항이 있어 글 남깁니다위의 코드 처럼 네이버 쇼핑에서 검색 시 상품 정보 중 product_item__MDtDF를 받아와서 리스트를 만드려고 하는데 크롬 개발자도구에서는 11개로 검색되지만 위의 코드를 실행하여 '모니터'를 검색해보면 len가 1밖에 나오지 않습니다.product_item__MDtDF를 제외하고는 강의 내용과 동일한거 같은데 어디에 문제가 있는 걸까요..?
-
미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
브라우저가 꺼지는데 어느부분이 문제일까요??
브라우저가 꺼지는데 어느부분이 문제일까요?? 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) #불필요한 에러 메시지 없애기 chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) service = Service(executable_path=ChromeDriverManager().install()) driver = webdriver.Chrome(service=service) #웹페이지 해당 주소 이동 driver.get("https://www.naver.com")
-
미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
Chapter03에서 Beautifulsoup에서 원하는 결과가 안나오네요
Chapter03에서 Beautifulsoup라이브러리를 실습을 해보는데 결과가 <div class="talk_area" id="topTalkArea"></div>이렇게 div 밖에 안나오는데 뭔가 잘 못된건가요? 물론 id를 사지고 해봤네요..word = soup.select_one('#topTalkArea') 라고 했는데 <div class="talk_area" id="topTalkArea"></div> 이렇게밖에 안나왔네요...
-
미해결[2024 개정판] 이것이 진짜 크롤링이다 - 기본편
1페이지만 가져와집니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 두 코드 모두 1페이지만 불러와집니다ㅠㅠ어디가 잘못된걸까요 1페이지입니다.================== "암 걸리면 서울로"…5년간 100만명 방문 http://www.wowtv.co.kr/NewsCenter/News/Read?articleId=A202310050023&t=NN 두경부암 환자 괴롭히는 ‘구강점막염’ 새 치료법은 http://www.fnnews.com/news/202310040921133037 조기 유방암 환자, 유전자 재발 예측 점수 낮더라도 방심은 금물 http://www.edaily.co.kr/news/newspath.asp?newsid=01715446635770296 ‘이곳’ 사는 여성, 비만 관련 암 위험 낮아 https://health.chosun.com/site/data/html_dir/2023/10/05/2023100502500.html GC셀, 고형암 표적 CAR-NK세포치료제 다국가 1상 진행 http://www.medisobizanews.com/news/articleView.html?idxno=110729 인천 학교 급식실 노동자 폐암 발병 지속…"지원책은 미비" https://www.yna.co.kr/view/AKR20231005074500065?input=1195m 제주 암 환자 3만여 명, 5년간 '서울 원정 치료' http://www.jibs.co.kr/news/articles/articlesDetail/34499?feed=na 암 백신 청신호까지 켰다… 커리코 ‘30년 집념’ https://www.seoul.co.kr/news/newsView.php?id=20231004006003&wlog_tag3=naver 젠큐릭스, 갑상선암 동반진단 UAE 승인 …폐암 이어 두 번째 https://www.hankyung.com/article/202310057966i [약손+] 폐암의 진단과 치료 ⑩폐암의 유전과 가족력 https://dgmbc.com/article/fwzGgK5QFfpv 2페이지입니다.================== "암 걸리면 서울로"…5년간 100만명 방문 http://www.wowtv.co.kr/NewsCenter/News/Read?articleId=A202310050023&t=NN 두경부암 환자 괴롭히는 ‘구강점막염’ 새 치료법은 http://www.fnnews.com/news/202310040921133037 조기 유방암 환자, 유전자 재발 예측 점수 낮더라도 방심은 금물 http://www.edaily.co.kr/news/newspath.asp?newsid=01715446635770296 ‘이곳’ 사는 여성, 비만 관련 암 위험 낮아 https://health.chosun.com/site/data/html_dir/2023/10/05/2023100502500.html GC셀, 고형암 표적 CAR-NK세포치료제 다국가 1상 진행 http://www.medisobizanews.com/news/articleView.html?idxno=110729 인천 학교 급식실 노동자 폐암 발병 지속…"지원책은 미비" https://www.yna.co.kr/view/AKR20231005074500065?input=1195m 제주 암 환자 3만여 명, 5년간 '서울 원정 치료' http://www.jibs.co.kr/news/articles/articlesDetail/34499?feed=na 암 백신 청신호까지 켰다… 커리코 ‘30년 집념’ https://www.seoul.co.kr/news/newsView.php?id=20231004006003&wlog_tag3=naver 젠큐릭스, 갑상선암 동반진단 UAE 승인 …폐암 이어 두 번째 https://www.hankyung.com/article/202310057966i [약손+] 폐암의 진단과 치료 ⑩폐암의 유전과 가족력 https://dgmbc.com/article/fwzGgK5QFfpv 3페이지입니다.================== "암 걸리면 서울로"…5년간 100만명 방문 http://www.wowtv.co.kr/NewsCenter/News/Read?articleId=A202310050023&t=NN 두경부암 환자 괴롭히는 ‘구강점막염’ 새 치료법은 http://www.fnnews.com/news/202310040921133037 조기 유방암 환자, 유전자 재발 예측 점수 낮더라도 방심은 금물 http://www.edaily.co.kr/news/newspath.asp?newsid=01715446635770296 ‘이곳’ 사는 여성, 비만 관련 암 위험 낮아 https://health.chosun.com/site/data/html_dir/2023/10/05/2023100502500.html GC셀, 고형암 표적 CAR-NK세포치료제 다국가 1상 진행 http://www.medisobizanews.com/news/articleView.html?idxno=110729 인천 학교 급식실 노동자 폐암 발병 지속…"지원책은 미비" https://www.yna.co.kr/view/AKR20231005074500065?input=1195m 제주 암 환자 3만여 명, 5년간 '서울 원정 치료' http://www.jibs.co.kr/news/articles/articlesDetail/34499?feed=na 암 백신 청신호까지 켰다… 커리코 ‘30년 집념’ https://www.seoul.co.kr/news/newsView.php?id=20231004006003&wlog_tag3=naver 젠큐릭스, 갑상선암 동반진단 UAE 승인 …폐암 이어 두 번째 https://www.hankyung.com/article/202310057966i [약손+] 폐암의 진단과 치료 ⑩폐암의 유전과 가족력 https://dgmbc.com/article/fwzGgK5QFfpv import requests from bs4 import BeautifulSoup import pyautogui keyword = pyautogui.prompt("검색어를 입력하세요>>>") pageNum = 1 for i in range(1,30,10):#페이지넘기기 print(f"{pageNum}페이지입니다.==================")#페이지안내 response = requests.get(f"https://search.naver.com/search.naver?where=news&sm=tab_jum&query={keyword}&start{i}") #start숫자가페이지 html = response.text soup = BeautifulSoup(html, 'html.parser') links = soup.select(".news_tit") #결과는 리스트로 for link in links: title = link.text #태그 안에 텍스트요소를 가져온다 url = link.attrs['href'] #href의 속성값을 가져온다 print(title, url) pageNum = pageNum+1import requests from bs4 import BeautifulSoup import pyautogui keyword = pyautogui.prompt("검색어를 입력하세요>>>") lastpage = pyautogui.prompt("마지막 페이지번호를 입력해 주세요") pageNum = 1 for i in range(1,int(lastpage)*10,10): print(f"{pageNum}페이지입니다.==================") response = requests.get(f"https://search.naver.com/search.naver?where=news&sm=tab_jum&query={keyword}&start{i}") html = response.text soup = BeautifulSoup(html, 'html.parser') links = soup.select(".news_tit") #결과는 리스트로 for link in links: title = link.text #태그 안에 텍스트요소를 가져온다 url = link.attrs['href'] #href의 속성값을 가져온다 print(title, url) pageNum = pageNum + 1
-
미해결파이썬 셀레니움 고급편 (python selenium - 크롤링, 크롤러)
5.Bot Detection 피하기(고급편) 질문입니다.
options = uc.ChromeOptions()가져와서 아래쪽에 uc.Chrome() 실행할때 options가 안넣어져 있는데 안넣고 실행하는건가요???깃허브에 설명에는driver = uc.Chrome(options=options) 이렇게 되어 있어 보이는데요?
-
해결됨실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
selenium으로 연 크롬창 안꺼짐
셀레니움 버전도 3.14?였나 최신걸로 업데이트 하고 써서웹드라이버 설치하는 것도 안해도 되는 상태인데요.강의에서는 driver.get(url) 하면 창이 켜졌다 자동으로 꺼지던데제꺼는 창이 자동으로 안꺼집니다... 뭔가 업데이트로 변경된 부분인가요? 창 안꺼지도록 하는 방법 강의 들으려는데제꺼는 원래 안꺼져서 당황스럽네요
-
미해결초간단 초스피드 데이터 수집 (파이썬 크롤링)
안녕하세요 파이썬 관련 문의드립니다
안녕하세요 파이썬 공부하다가 도저히 모르겠어서 문의 드립니다.다름이 아니라 api 쪽은 공부해본적이 없어서 기본적인 걸 모르는것같은데http://ipss1.interpark.com/openapi/product/ProductAPIService.do?_method=UpdateProductAPIStatTpQty&citeKey={citeKey}&secretKey={secretKey}&dataUrl=https://shop.interpark.com/api/new.ver2/sample/sample9.xml사이트에서는 이방식으로 api 요청하라고 하는데코드는 챗gpt랑 하면서 짜봤는데import requests# API 엔드포인트 및 인증 정보 설정citeKey = "citeKey"secretKey = "secretKey"url = f"http://ipss1.interpark.com/openapi/product/ProductAPIService.do?_method=UpdateProductAPIStatTpQty&citeKey={citeKey}&secretKey={secretKey}"# 요청 데이터 설정 (상품 정보 업데이트)payload = { "prdNo": "12344452", # 인터파크 상품번호 (as a string) "saleStatTp": "03", # 판매중:01, 품절:02, 판매중지:03, 일시품절:05, 상품삭제:98}# API 요청 보내기response = requests.post(url, data=payload)# 응답 확인if response.status_code == 200: print(response.text)else: print("상품 정보 업데이트에 실패했습니다.") print("응답 코드:", response.status_code) print("응답 내용:", response.text)제가 짠 코드에선 url 맨뒤에 예시처럼&dataUrl=https://shop.interpark.com/api/new.ver2/sample/sample9.xml이부분이 빠진것같은데patload 부분을 예시처럼 url을 만들어서 저렇게 하는방식이 가능한가요?