묻고 답해요
148만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[자동화 완전 정복] 인스타그램 휴대폰, 웹 자동화 프로그램 개발
insta_mobile.py 링크만 무한루프 뜹니다. 왜 그런가요?
def insta_mobile_work(device, max_work): links = read_links() print(links) cnt = 1 for link in links: if cnt >= max_work: print(link) print("이제 작업 종료하겠습니다") break try: visited_links = [] # 이미 좋아요, 댓글, 팔로우를 신청한 링크 리스트 with open('visited.txt', 'r') as f: while True: line = f.readline() if not line: break _link = line.rstrip() visited_links.append(_link) if link in visited_links: print("이미 방문한 링크입니다.") continue print(f"{cnt} 번째 링크 방문 {link}") # link = link.replace("https://","") device.press('home') device.open_url(link) time.sleep(0.2) if device(text="작업을 수행할 때 사용하는 애플리케이션").exists(timeout=2): # 삭제되었거나, 잘못된 URL 저장된 경우에 continue continue ''' visited_account check 목표 : 최대 3회까지 계정 방문하는 기능 ''' visited_accounts = [] with open('./visited_account.txt', "r") as f: while True: line = f.readline() if not line: break account = line.rstrip() visited_accounts.append(account) # 몇 번 방문했는지 정보 획득 account_id = device(resourceId="com.instagram.android:id/row_feed_photo_profile_name").get_text() visited_count = visited_accounts.count(account_id) if visited_count >= 3: # 3회 이상 방문일 때는 다음 링크를 방문하도록 한다 # continue가 실행되면 여기 밑에있는 코드가 실행이 안됨 (for 문 안에서 사용가능) continue ''' 1. 좋아요 누르기 - 단, 좋아요가 이미 눌러져 있으면 Pass ''' # 좋아요 버튼 나타나는것 기준으로 5초까지 대기 if not device(resourceId="com.instagram.android:id/row_feed_button_like").exists(timeout=3): device.swipe_ext("up", scale=0.75) time.sleep(3) alreadyLiked = False if device(resourceId="com.instagram.android:id/row_feed_button_like").exists( timeout=5): # 만약 ,좋아요 버튼이 안 눌러져있으면 좋아요 버튼을 누른다 if device(resourceId="com.instagram.android:id/row_feed_button_like", selected=False): device(resourceId="com.instagram.android:id/row_feed_button_like").click() time.sleep(1) if check_bot_detection(device): print("[봇 탐지] - 좋아요 시도 실패") raise Exception("[봇 탐지] - 좋아요 시도 실패") else: alreadyLiked = True time.sleep(3) # ''' # 2. 댓글 달기 - 랜덤 멘트를 미리 작성해놓고, 랜덤으로 뽑아서 댓글 달기''' # if not alreadyLiked: # device(resourceId="com.instagram.android:id/row_feed_button_comment").click() # time.sleep(3) # # 기본 키보드가 활성화 되어있는 경우 back버튼을 눌러줌 # if device(resourceId="com.samsung.android.honeyboard:id/bee_item_icon").exists(): # device.press('back') # time.sleep(1) # if not device(text="이 게시물에 대한 댓글 기능이 제한되었습니다.").exists(): # print("커멘트 작성 가능 exists") # device(resourceId="com.instagram.android:id/layout_comment_thread_edittext").click() # # 실제 사람이 작성하는 것처럼 문장 사이의 타이핑 딜레이가 들어감 # comments = ["♡", "❤️", "❤️❤️", "♥"] # comment = random.choice(comments) # for word in comment: # device.send_keys(word) # time.sleep(random.uniform(0.03, 0.08)) # print("댓글 작성 완료") # time.sleep(3) # if device( # resourceId="com.instagram.android:id/layout_comment_thread_post_button_click_area").exists(): # device( # resourceId="com.instagram.android:id/layout_comment_thread_post_button_click_area").click() # elif device(resourceId="com.instagram.android:id/layout_comment_thread_post_button").exists(): # device(resourceId="com.instagram.android:id/layout_comment_thread_post_button").click() # time.sleep(1) # if check_bot_detection(device): # print("[봇 탐지] - 댓글 달기 시도 실패") # raise Exception("[봇 탐지] - 댓글 달기 시도 실패") # print("게시 버튼 꾸욱.") # time.sleep(2) # device.press('back') # time.sleep(2) # device.press('back') # else: # device.press('back') # time.sleep(3) # 방문 1회 추가 ! with open('./visited_account.txt', "a") as f: f.write(f"{account_id}\n") # 3. 팔로우 신청 - 단, 이미 팔로잉 상태면 Pass # 사진 사이즈가 너무 크면, 위로 스와이프 해줘야함 device.swipe_ext("down", scale=0.8) time.sleep(3) account_ids = [] # 이미 팔로우를 신청한 계정 리스트 with open('accounts.txt', "r") as f: while True: line = f.readline() if not line: break account_id = line.rstrip() account_ids.append(account_id) if not device(resourceId="com.instagram.android:id/row_feed_photo_profile_name").exists(): device.press('back') time.sleep(1) target_account_id = device(resourceId="com.instagram.android:id/row_feed_photo_profile_name").get_text() # 딱 1번만 팔로우 하겠다. if not target_account_id in account_ids: # 팔로우할 유저의 계정을 기록 with open('accounts.txt', "a") as f: account_id = device(resourceId="com.instagram.android:id/row_feed_photo_profile_name").get_text() f.write(f"{account_id}\n") device(resourceId="com.instagram.android:id/row_feed_photo_profile_name").click() time.sleep(3) if device(description="맞팔로우 하기", text="맞팔로우").exists(): device(description="맞팔로우 하기", text="맞팔로우").click() elif device(text="팔로우", className="android.widget.Button"): device(text="팔로우", className="android.widget.Button").click() else: # 이미 맞 팔로우가 되어 있으므로 실행시키지 않아도 됨 pass time.sleep(1) if check_bot_detection(device): print("[봇 탐지] - 팔로우, 맞팔로우 신청 시도 실패") raise Exception("[봇 탐지] - 팔로우, 맞팔로우 신청 시도 실패") time.sleep(2) device.press("back") time.sleep(2) device.press("back") time.sleep(3) else: print("이미 팔로우된 계정입니다") cnt += 1 random_time = random.randrange(60, 90) print(random_time, '초만큼 대기하겠습니다') time.sleep(random_time) '좋아요, 팔로우, 댓글 작성까지 완료된 게시글' with open('visited.txt', 'a') as f: f.write(f"{link}\n") except: pass 1 번째 링크 방문 https://www.instagram.com/p/C2DUpJJBWI1/1 번째 링크 방문 https://www.instagram.com/p/C3SMeJSyIRC/1 번째 링크 방문 https://www.instagram.com/p/C3fDCYiM4gt/1 번째 링크 방문 https://www.instagram.com/p/C2hjVjmxPEg/왜그런가요?
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
텔레그램 센드 메세지 API 4,096바이트 넘을시 전송 불가
안녕하세요유튜브도 보고, 강의도 결제해서 보고 있는 이광희라고 합니다.강의 정말 감사드립니다. 강의대로 코드 짰더니 봇에 전송도 잘 되는데문제는 메세지가 길어져서 (업무특성상 뉴스 검색량이 많음)4,096바이트를 넘어가니 전송이 아얘 되지를 않네요. 일반적인 텔레그램 1:1채팅이나 단체방 채팅에서는 장문을 입력하면 자동으로 나눠져서 전송되는데API는 4,096바이트가 넘어가니 아얘 전송이 되질 않네요.1) 이걸 코딩에서 해결해서 전송해야 한다면 어떤 방법이 있을지2) 아니면 텔레그램 API상 다른 방법이 있는지요궁금합니다
-
미해결[자동화 완전 정복] 인스타그램 휴대폰, 웹 자동화 프로그램 개발
폰에 atx라는 자동차 모양 아이콘의 앱이 설치되었어요.
폰에 atx라는 자동차 모양 아이콘의 앱이 설치되었어요.얘가 전화 허용이라는 권한을 요청하기도 했고폰 상단 알림창에 계속 uiautomator 이라는 이름과 ip주소가 써진 알람을 계속 보내요 . 알람을 지우고 몇 분 뒤에 보면 또 알람창에 떠 있고. 이 앱을 폰에 계속 설치되어 있는 상태로 있어야 하는지 궁금합니다. 앱 들어가보면 weditor처럼 중국어(?)로 써져 있어서 불안해서요.
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
xpath 질의
강사님 매번 강의로 도움많이받고있습니다 감사합니다. 개인적으로 일전에 구글을 예를 들어 다양한 키워드에 따라 생성 텝메뉴들이 달라져서 고민을 많이하던때가있었는데'View탭 클릭하여 페이지넘어가기'강의와 같이 xpath 지정하였을때 '//*[text()="VIEW"]' 입력하면 되는것일까요?음 현재 네이버가 뷰 서비스를 폐지했는데 만약 블로그를 클릭한다면 '//*[text()="블로그"]' 를 입력하면 클릭이되나요?안되서여ㅜㅜ혹시 도움이될만한 고견주시면 감사드리겠습니다.
-
미해결[신규 개정판] 이것이 진짜 엑셀자동화다 - 기본편
pip명령이 vscode 명령프롬프트에서만 않되네요
그냥 명령프롬프트 띄우면 잘되는데vscode의 터미널 명령프롬프트에서만 안되네요 vs내에 인터프리트 경로까지 잡아줬는데도 안되요 'pip'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는배치 파일이 아닙니다. 라고 뜹니다 왜일까요?
-
미해결파이썬 셀레니움 고급편 (python selenium - 크롤링, 크롤러)
uc를사용할때 유저 에이전트 변경이 불가능합니다.
undetected chromedriver 를 사용할때UA_Data = make_user_agent(UA, True) self.driver.execute_cdp_cmd("Network.setUserAgentOverride", UA_Data)를 이용하여도 userAgentData의 변경이 되지 않습니다.버전의 문제일까요?
-
미해결[자동화 완전 정복] 인스타그램 휴대폰, 웹 자동화 프로그램 개발
팔로워 리스트 추출완료 count 관련 문의드립니다.
main.py에 count 10을 했는데 계속 진행되고 있습니다.keyword_list = ["식당인테리어","식당"] for keyword in keyword_list: #해시태그 띄어쓰기 사용 불가, 필터링 기능 keyword = keyword.replace(" ","") count = 10 insta_web.insta_web_work(driver,keyword,count) insta_mobile.insta_mobile_work(device,30) print("[작업 완료] - 자동화 프로그램 동작이 완료되었습니다.") 그리고 파일이 저장이 되지 않습니다.뭐가 문제일까요?테스트용으로 count 10을 했는데 말입니다.저장되지 않는 것 같습니다. 포스팅 링크 추출 완료팔로워 리스트 추출 완료 70 - 1팔로워 리스트 추출 완료 69 - 2팔로워 리스트 추출 완료 56 -3팔로워 리스트 추출 완료 59 -4팔로워 리스트 추출 완료 52 -5[에러] 팔로워 버튼 클릭 에러팔로워 리스트 추출 완료 0팔로워 리스트 추출 완료 72 -6팔로워 리스트 추출 완료 60 -7팔로워 리스트 추출 완료 64 -8팔로워 리스트 추출 완료 54 -9팔로워 리스트 추출 완료 30 -10팔로워 리스트 추출 완료 71 -11
-
미해결[자동화 완전 정복] 인스타그램 휴대폰, 웹 자동화 프로그램 개발
휴대폰 로그인 패턴
안녕하세요. 강의 잘듣고 있습니다. uiautomator2에서 핸드폰 초기 lock화면의 패턴을 입력하는 방법은 지원하지 않나요. 아니면 다른 식의 방법이 있는것인가요확인한번 부탁드립니다.
-
미해결파이썬 셀레니움 고급편 (python selenium - 크롤링, 크롤러)
강의 코드는 어디서 볼 수 있나요?
안녕하세요. 자꾸 질문드려서 죄송합니다. 혹시 강의 진행에 사용된 코드 깃허브 주소같은거나 첨부파일은 없나요? 맨 마지막 파트에 있는건 추가된 강의에 대한 코드 자료들만 있어서요..
-
미해결파이썬 셀레니움 고급편 (python selenium - 크롤링, 크롤러)
문서에서 어떤걸 찾아야 하고 어떻게 읽어야하는지도 알려주시면 좋겠습니다
안녕하세요. 4. CDP Command 종류 많죠? 잘 정리된 사이트 소개해드림부분 강의 듣고있습니다. 파란 사이트, 초록 사이트 주소 알려주신다고 했는데 어디에 나와있나요? 그리고 문서에서 어떤 걸 저희가 능동적으로 찾아야 하고 어떻게 읽고 적용하는지도 알려주시면 좋겠습니다. 필요한 걸 저희가 직접 찾고 적용하는 방법을 알려주셔야 하는데 그냥 코드만 알려주시니까 저희 상황에 맞게 수정하는 방법을 모르겠습니다. 문서를 활용해서 저희에게 어떤 속성이 필요한지 찾는 방법도 자세히 알려주시면 감사하겠습니다. Emulation 이랑 Network랑 뭐가 다른지도 모르겠어요. setDeviceMetricsOverride 가 왜 필요한건진 알겠는데 이 속성이 필요하다는 걸 아는 방법은 모르겠어요. 즉 물고기를 잡아주기만 하는 게 아니라 잡는 방법을 알려주셨으면 합니다.
-
미해결파이썬 셀레니움 고급편 (python selenium - 크롤링, 크롤러)
ch 2-2 User Agent Data 변경하는법) 내 눈으로 본것만 믿읍시다 자막 부분 이해가 안갑니다.
안녕하세요.ch 2-2 User Agent Data 변경하는법 강의에서 10:00, 10:09 에'내 눈으로 본것만 믿읍시다' 자막 부분 이해가 안갑니다. Not?A_Brand는 version 끝자리 숫자로 바뀌었네요 이게 무슨 뜻인가요?version last string 값을 넣어주시죠 version 110 되었을때는 0이 될지 10이 될지 그거는 그때 확인해야할듯함이거는 무슨 뜻일까요?? 강의 보다보면 이렇게 추가적으로 중간중간 자막 달아주신것들이 이해가 안되는 것들이 많습니다. 맥락을 충분히 설명 안해주시고 말씀하시는 느낌이 든달까... 조금만 더 자세히 설명해주시면 감사하겠습니다 ㅜㅜ ---------------추가로, 이 강의에선 undetected_chromedriver 를 사용하지 않고 일반 웹드라이버를 사용하셨는데 undetected 드라이버랑 함께 사용하지 않으신 이유가 뭘까요??
-
미해결파이썬 셀레니움 고급편 (python selenium - 크롤링, 크롤러)
게임 매크로에서 영감얻으셨다는 영상보고
궁금한게 있습니다.게임 매크로가 어려운게 맥 어드레스(?)도 가져가고 복잡하다고 하셨는데, 그럼 네이버나 구글 같은데서는 맥 어드레스 정보를 안가져갈까요? 이 강의를 토대로 구글이나 네이버 자동화 프로그램을 만들어도 효용이 있을까요?
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
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)
-
미해결[신규 개정판] 이것이 진짜 엑셀자동화다 - 기본편
매출데이터 생성 price 오류
강사님 안녕하세요 :)강의 코드와 똑같이 작성하였는데 if문에서 price가 정의되지않았다고 뜨면서 실행이안되는데 .. 혹시 이유를 알 수 있을까요?
-
해결됨실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
네이버 뷰 페이지에서 제목 클래스 print할 때
안녕하세요, 잘 듣고 있습니다. 네이버 view탭 검색 결과 크롤링1을 보고, 따라하고 있습니다. 강사님 녹화하실 당시의 네이버와 현재 네이버 페이지가 구조가 좀 달라져서 제 나름대로 적용을 하려고 했으나 이해가 안되는 부분이 있어 문의 드립니다. 강사님이 쓰신 class명이 현재는 안 쓰이는 듯하여 현재 페이지 기준에 맞춰 class명을 작성한 후 출력을 했는데 '[]' 이렇게 빈 리스트 값이 나타났는데 왜 그런지 모르겠습니다.위 내용이 궁금하여 문의 드립니다.result = soup.select(".title_link.cross_trigger") print(result)
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
쿠팡 크롤링 상품 순서 질문
강의 들으며 똑같이 코드를 작성했습니다.다만, 로캣배송 badge_rocket 까지 작성했을 때, 막상 홈페이지에 나와있는 순위와 비교를 하며 보니 일치하지 않고 순서가 뒤죽박죽 되어 나와 있습니다. 또한 화면 상에서는 광고 표시가 없지만, 막상 html을 살펴보면 search-product search-product__ad-badge라고 되어 있는 경우도 있습니다. 혹 새로고침 할 때 마다 조금씩 바뀌어 제공하는 것 때문에 그런 것인지, 코딩 창과 홈페이지를 동시에 새로고침 해 보아도 순위가 정확하지 않습니다. 이런 상황에서 크롤링이 정확하게 되고 있는 지 어떻게 알 수 있나요?