묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
최신 셀레니움 테스트 소프트에 의해 제어...
안녕하세요~예전에 셀레니움좀 하다가 다시 최근에 만지작 하고 있습니다.최신 셀레니움의 경우 크롬드라이버 버전 다운로드 필요없이 되더라구요! 아무튼 셀레니움 options값을 통해서 자동화제어창 문구 안뜨게 하고,user agent 값에 정상적인걸 나오게 해놓으면 상대방 서버에 접속했을 때 티가 안날까요?나쁜짓 하려는건 아니고,네이버랑 다음에서그냥 단순반복 작업을 셀레니움으로 시킬까 하는데 이게 이상하게 보일까 싶어서 궁금합니다.과도하게 요청하는것도 아니고 그냥 느릿느릿하게 작업하게 했거든요. 근데 이렇게 숨겨도 맘먹고 찾아내서 조치를 취할 수 있을까요?
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
텔레그램 센드 메세지 API 4,096바이트 넘을시 전송 불가
안녕하세요유튜브도 보고, 강의도 결제해서 보고 있는 이광희라고 합니다.강의 정말 감사드립니다. 강의대로 코드 짰더니 봇에 전송도 잘 되는데문제는 메세지가 길어져서 (업무특성상 뉴스 검색량이 많음)4,096바이트를 넘어가니 전송이 아얘 되지를 않네요. 일반적인 텔레그램 1:1채팅이나 단체방 채팅에서는 장문을 입력하면 자동으로 나눠져서 전송되는데API는 4,096바이트가 넘어가니 아얘 전송이 되질 않네요.1) 이걸 코딩에서 해결해서 전송해야 한다면 어떤 방법이 있을지2) 아니면 텔레그램 API상 다른 방법이 있는지요궁금합니다
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
xpath 질의
강사님 매번 강의로 도움많이받고있습니다 감사합니다. 개인적으로 일전에 구글을 예를 들어 다양한 키워드에 따라 생성 텝메뉴들이 달라져서 고민을 많이하던때가있었는데'View탭 클릭하여 페이지넘어가기'강의와 같이 xpath 지정하였을때 '//*[text()="VIEW"]' 입력하면 되는것일까요?음 현재 네이버가 뷰 서비스를 폐지했는데 만약 블로그를 클릭한다면 '//*[text()="블로그"]' 를 입력하면 클릭이되나요?안되서여ㅜㅜ혹시 도움이될만한 고견주시면 감사드리겠습니다.
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
title["href"] 가져올 때
import requests from bs4 import BeautifulSoup url = "https://search.naver.com/search.naver?where=view&sm=tab_jum&query=" keyword = input("검색어를 입력하세요: ") url = url + keyword print(url) #개발자 도구 > 네트워크 > www.naver.com > 요청 헤더 > user-gent headers = { "User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } req = requests.get(url, headers=headers) html = req.text soup = BeautifulSoup(html, "html.parser") # 게시물별 view 구역 total_area = soup.select(".view_wrap") rank_num= 1 for area in total_area: ad = area.select_one(".link_ad") if ad: continue print(f"<<<{rank_num}>>>") title = area.select_one(".title_area") name = area.select_one(".name") href = area.select_one(".title_link") print(title.text) print(name.text) # print(title["href"] print(href["href"]) print() rank_num += 1 <에러 문구>line 41, in <module> print(title["href"]) File "/User/opt/anaconda3/envs/edu/lib/python3.9/site-packages/bs4/element.py", line 1573, in getitem return self.attrs[key]KeyError: 'href' 안녕하세요, 수업 잘 듣고 있습니다.저도 블로그 링크를 바로 가져오고 싶어서 print(title["href"]로 가져오려 했으나 keyError가 발생합니다. 우선 대안으로, href 변수를 반들고 따로 링크만 가져올 수 있는 코드를 추가하긴 하였으나 왜 키 에러가 발생하여 print(title["href"]로 링크를 바로 못 가져 오는 것인지가 궁금합니다.
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
멜론 : response406
멜론 강의 실습중 계속 406 리스폰스가 뜨는데 우회나 다른방법이없을까요?
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
질문드려요
강의 녹화 시점때와 다르게 현재 뷰 메뉴 태그값들이 모두 바뀐것같아서 강사님 강의에 따라 위 코드를 작성하였는데 v['href']를 사용하면 오류가 나와요...v.select_one('a')['href'] 을 입력하면 #으로 나오고요...확인좀부탁드릴게여.. # 라이브러리 호출 import requests from bs4 import BeautifulSoup # 검색어 입력 search_word = input('검색어를 입력해주세요\t:\t') # 크롤링 페이지 입력 target_url = 'https://search.naver.com/search.naver?where=view&sm=tab_jum&query=' + search_word print(f'접속페이지\t:\t{target_url}') # 데이터 요청 req_get_url = requests.get(target_url) get_html = req_get_url.text parser_soup = BeautifulSoup(get_html, 'html.parser') # select를 활용하여 태그값에 해당하는 모든 값을 리스트화로 가져옴 raw_data = parser_soup.select('div.view_wrap') for index, v in enumerate(raw_data): index += 1 user_data = v.select_one('a.name').text #▶▷▶▷▶▷ 뷰 게시글 작성자 추출 try: #제목 태그를 의미하는 .title_link._cross_trigger 가 None이면, 제목을 의미하는 다른 태그인 .title_link 로 데이터 추출. 그 외 다른 태그값으로 인하여 None 발생을 통한 오류가 생기면 '제목없음'으로 오류 예외처리 진행 title_data = v.select_one('.title_link._cross_trigger').text.replace('\n','').replace('\t',' ') #▶▷▶▷▶▷ 뷰 게시글 제목① 추출 if title_data == None: title_data = v.select_one('.title_link').text.replace('\n','').replace('\t',' ') #▶▷▶▷▶▷ 뷰 게시글 제목② 추출 except: title_data = '제목없음' print(f'{index} 번째글\n사용자명\t:\t{user_data}\n게시글 제목\t:\t{title_data}')
-
해결됨실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
zip 메서드를 활용해서 view 제목 및 작성자 불러오기
안녕하세요, 수업 잘 듣고 있습니다. 수업 녹화 당시와 현재와 웹페이지 클래스 명이 달라져서 작성자는 제 생각엔 .user_info 클래스를 사용하는 것 같아 사진과 같이 코드를 작성하고 실행하였으나출력문이 조용(?)합니다. 강의 영상을 보면 게시글 제목과 작성자 명이 함께 나오는데 제 코드는 "검색어를 입력하세요:" 외에 뜨는 출력 문이 없어어떤 것이 문제 인지 문의 드립니다.
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
네이버가 보니까 첫 화면이 리액트로 된 듯 한데요. ㅠㅠ
안녕하세요. 수업 잘 듣고 있습니다.다름이 아니라 네이버가 리액트를 메인에 적용한 듯 한데요혹시 제가 코드를 잘 못 넣은 건지 살펴봐 주실 수있는지요아직 다른 강좌는 듣지 않은 상태인 점 양해 바랍니다.좋은 하루되세요.import requests from bs4 import BeautifulSoup url = "https://naver.com" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } req = requests.get(url, headers=headers) html = req.text soup = BeautifulSoup(html, "html.parser") print(soup.title)
-
해결됨업무 자동화 첫걸음: Python으로 이메일 대량 전송하기와 크롤링 프로젝트 완성하기
토큰 문제가 발생했어요
안녕하세요. 좋은 강의 감사합니다.수강하면서 실습 중 토큰 문제가 발생하였습니다.에러는 아래와 같습니다.google.auth.exceptions.RefreshError: ('invalid_grant: Token has been expired or revoked.', {'error': 'invalid_grant', 'error_description': 'Token has been expired or revoked.'}) 기존에 작동하던 코드들도 동일한 문제가 발생하는데, 혹시 해결방법이 있을까요?? 강의 처음으로 돌아가서 진행하는데, 해결이 안되었습니다. 감사합니다.
-
해결됨실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
네이버 뷰 페이지에서 제목 클래스 print할 때
안녕하세요, 잘 듣고 있습니다. 네이버 view탭 검색 결과 크롤링1을 보고, 따라하고 있습니다. 강사님 녹화하실 당시의 네이버와 현재 네이버 페이지가 구조가 좀 달라져서 제 나름대로 적용을 하려고 했으나 이해가 안되는 부분이 있어 문의 드립니다. 강사님이 쓰신 class명이 현재는 안 쓰이는 듯하여 현재 페이지 기준에 맞춰 class명을 작성한 후 출력을 했는데 '[]' 이렇게 빈 리스트 값이 나타났는데 왜 그런지 모르겠습니다.위 내용이 궁금하여 문의 드립니다.result = soup.select(".title_link.cross_trigger") print(result)
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
쿠팡 크롤링 상품 순서 질문
강의 들으며 똑같이 코드를 작성했습니다.다만, 로캣배송 badge_rocket 까지 작성했을 때, 막상 홈페이지에 나와있는 순위와 비교를 하며 보니 일치하지 않고 순서가 뒤죽박죽 되어 나와 있습니다. 또한 화면 상에서는 광고 표시가 없지만, 막상 html을 살펴보면 search-product search-product__ad-badge라고 되어 있는 경우도 있습니다. 혹 새로고침 할 때 마다 조금씩 바뀌어 제공하는 것 때문에 그런 것인지, 코딩 창과 홈페이지를 동시에 새로고침 해 보아도 순위가 정확하지 않습니다. 이런 상황에서 크롤링이 정확하게 되고 있는 지 어떻게 알 수 있나요?
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
검색 창??
저 창에 제목 class를 붙여 넣으셔서 옆에 화살표로 막 살펴보시던데, 저는 그런게 없거든여. 혹시 어디서 찾을 수 있는건가여?
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
Coupang a.["href"] 정보 관련 문의
안녕하세요, 쿠팡 크롤링 영상을 보다가 궁금한 점이 있어서 문의드립니다.실습을 위하여 아래와 같이 코드를 입력하였습니다.import requests from bs4 import BeautifulSoup base_url = "https://www.coupang.com/np/search?component=&q=" keyword = input("검색할 상품을 입력하세요 : ") search_url = base_url + keyword headers = { "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } cookie = {"a" : "b"} res = requests.get(search_url, timeout=5 ,headers=headers, cookies=cookie) html = res.text soup = BeautifulSoup(html, "html.parser") items = soup.select("[class=search-product]") print(items[0]) rank = 1 for item in items: badge_rocket = item.select_one(".badge.rocket") if not badge_rocket: continue name = item.select_one(".name") price = item.select_one(".price-value") thumb = item.select_one(".search-product-wrap-img") link = item.select_one("a")["href"] # link = item.a["href"] print(f"{rank}") print(name.text) print(f"{price}원") print(thumb) print(link) print() rank += 1 그랬더니 아래와 같은 에러가 뜨더라구요.Traceback (most recent call last): File "c:\Users\LG\OneDrive\03. Resources\Python\08_1_coupang.py", line 40, in <module> link = item.a["href"] ~~~~~~^^^^^^^^ File "C:\Users\LG\AppData\Local\Programs\Python\Python312\Lib\site-packages\bs4\element.py", line 1573, in getitem return self.attrs[key] ~~~~~~~~~~^^^^^KeyError: 'href' 그래서 이 검색을 하던 도중에 items 리스트의 첫 번째 데이터를 확인하였습니다.그랬더니, items[0] 내에 'href' 속성이 존재하지 않더라구요.분명 elements에서 검색했을 때는 아래 캡쳐처럼 존재를 하였습니다..왜 이런지 궁금합니다.. <li class="search-product" data-coupon-nudge-text="" data-coupon-tag-area="true" data-freebie-vendor-item-id="null" data-handyman-area="" data-is-rocket="true" data-is-soldout="" data-product-id="7410323525" data-vendor-item-id="86316217055" data-winner-vendor-item-id="86316217055" id="7410323525" > <a class="search-product-link" data-is-soldout="" data-item-id="19198810280" data-product-id="7410323525" data-product-link="/vp/products/7410323525?itemId=19198810280&vendorItemId=86316217055" data-srp-log='{"group":"PRODUCT", "itemId":"19198810280", "productId":"7410323525", "vendorItemId":"86316217055", "page":"1", "listSize":"36", "isCcidEligible":false, "displayCcidBadge":false, "wowOnlyInstantDiscountRate": 9, "snsDiscountRate" : -1, "isLoyaltyMember": false, "hasAsHandymanBadge":false }' data-vendor-item-id="86316217055" target="_blank" ><dl class="search-product-wrap adjust-spacing coupon"> <dt class="image"> <img alt="주연테크 FHD LED 100Hz 모니터, 54.6cm, V22FX(일반)" class="search-product-wrap-img" data-src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" height="230" onerror="this.src='//img2a.coupangcdn.com/image/coupang/common/no_img_1000_1000.png'" onload="logTime(this);logImageLoadTime(this);" src="//thumbnail7.coupangcdn.com/thumbnails/remote/230x230ex/image/retail/images/671217612372165-b6d07ba8-e3fa-4a08-8fba-cb4adbedd0d0.jpg" width="230" /> </dt> <dd class="descriptions"> <div class="descriptions-inner"> <div class="badges"></div> <div class="name"> 주연테크 FHD LED 100Hz 모니터, 54.6cm, V22FX(일반) </div> <div class="price-area"> <div class="price-wrap"> <div class="price"> <span class="price-info"> <span class="instant-discount-rate">2%</span> <del class="base-price"> 91,610 </del> </span> <em class="sale discount isInstantDiscount"> <strong class="price-value">89,000</strong>원 <span class="badge rocket"> <img alt="로켓배송" height="16" src="//image6.coupangcdn.com/image/cmg/icon/ios/logo_rocket_large@3x.png" /> </span> </em> </div> <div class="coupon-wot-nudge-row"> <div class="coupon-wot-nudge-ticket"> <div class="coupon-wot-nudge-ticket_left_border"> <span class="coupon-wot-nudge-ticket_left_border_amount" >8,900</span >원 </div> <div class="coupon-wot-nudge-ticket_right_border"></div> </div> <div class="coupon-wot-nudge-text">와우회원 추가 쿠폰</div> </div> <!-- Free Shipping Badge --> <div class="delivery"> <span class="arrival-info"> <em style="color: #008c00">내일(화) </em> <em style="color: #008c00">도착 보장 </em> </span> </div> </div> <div class="used-product-info"> <span>새 상품</span><span>, </span><span>반품</span ><strong> (9)</strong> <span>최저</span><strong>73,870</strong ><span>원</span> </div> </div> <div class="other-info"> <div class="rating-star"> <span class="star" ><em class="rating" style="width: 90%">4.5</em></span > <span class="rating-total-count">(1188)</span> </div> </div> <div class="benefit-badges"> <div class="reward-cash-badge"> <div class="reward-cash-badge__inr"> <img alt="" class="reward-cash-ico" src="//image6.coupangcdn.com/image/badges/cashback/web/list-cash-icon@2x.png" /> <span class="reward-cash-txt">최대 3,694원 적립</span> </div> </div> </div> </div> </dd> </dl> <span class="number no-1">1 </span> <div class="mask"></div ></a> </li> PS C:\Users\LG\OneDrive\03. Resources\Python>
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
네이버 로고가 없어졌습니다. ^^
선생님 네이버 로고가 없어졌어요... 다른것을 불러오니, 되네요 ^^
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
수업 노트
안녕하세요?라고 했는데 수업 노트는 어디에 있나요?아무리 찾아도 없습니다.
-
해결됨업무 자동화 첫걸음: Python으로 이메일 대량 전송하기와 크롤링 프로젝트 완성하기
샘플 코드가 다른거 같아요.
안녕하세요, 수강생 여러분학습 관련 내용을 질문해주세요! 영상에나온 Gmail Api python 샘플 코드와 현재 구글에서 제공하는 샘플 코드가 다른거같아요.영상에서 나온 코드를 직접 타이핑 하면될까요?참고로 구글에서 제공하는 샘플코드는 아래와 같아요.import os.path from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build from googleapiclient.errors import HttpError # If modifying these scopes, delete the file token.json. SCOPES = ["https://www.googleapis.com/auth/gmail.readonly"] def main(): """Shows basic usage of the Gmail API. Lists the user's Gmail labels. """ creds = None # The file token.json stores the user's access and refresh tokens, and is # created automatically when the authorization flow completes for the first # time. if os.path.exists("token.json"): creds = Credentials.from_authorized_user_file("token.json", SCOPES) # If there are no (valid) credentials available, let the user log in. if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file( "credentials.json", SCOPES ) creds = flow.run_local_server(port=0) # Save the credentials for the next run with open("token.json", "w") as token: token.write(creds.to_json()) 개인적으로 스크래핑/크롤링하는 사이트에 대한 질문에 대해서는 답변을 드리지 않아요!
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
학습 자료
안녕하세요.수업에 사용하신 코드는 어디서 받을 수 있을까요?
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
업데이트 된 API 를 기존 강의 내용에 맞게 따라하던 중 문제가 발생하였습니다.
from openai import OpenAI client = OpenAI( api_key = "----" ) message = [] while True : user_cotent = input("user : ") message.append({"role": "system", "content": f"{user_cotent}"}) completion = client.chat.completions.create(model="gtp=3.5-turbo", messages=message) assisant_content = completion.choices[0].message["content"] message.append({"role": "assiant", "content": f"{assisant_content}"}) print(f"GPT : {assisant_content}") 업데이트 된 API로 인하여 강의에서 막혔던 부분을 유튜브를 통해 해결하고 API Key에서 막혔던 부분은 결제를 통하여 해결하였습니다. 그리고 유튜브에서 업데이트 된 Assistant 내용이 있어 그 부분까지는 따라했습니다.그런데 58강(openai API 사용법(ChatGPT gpt-3.5-turbo 모델) 강의 내용을 제 나름대로 업데이트된 API 코딩에 맞게 수정하여 실행해 봤는데 에러가 발생하네요기존 강의와 업데이트 된 API 는 접목이 되지 않는건가요? 그렇다면 API와 대화하듯이 질문을 주고 받는 것은 업데이트 된 Assisant 코딩에서 수정을 하여 만들어야 하는건가요? 이 뒷 강의들을 내용을 아직 보지는 않았으나 만일 현재 업데이트된 API와 맞지 않다면 어떻게 공부하는게 맞을까요?
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
open api 사용 강의 중 질문이 있습니다.
알려주신 업데이트된 openapi 강의를 유튜브에서 보고 따라하였는데 에러가 발생하여 문의드립니다. 발생한 에러는 이렇습니다. 혹시 크레딧이 없어서 발생하는 문제일까요?현재 크레딧 창을 보면 이렇게 되어 있네요..
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
chat gpt api 사용법관련 문의드립니다.
현재 강의 후 openai API 내용이 업데이트 되었는지 모르겠지만 강의 내용과 좀 다른 부분이 있어서 문의드립니다.사이트 코딩강의 코딩import 부분과 api_key 넣는 부분 등 코딩이 대체적으로 좀 다르네요.