강의를 보면 ActionChain(driver).scroll( 이라는 함수를 사용하셨는데 스크롤을 위한 시작점을 선택해서 스크롤 시키는것 같습니다.) 하지만 저도 이 함수를 쓰려고 했지만 해당 함수가 ActionChain 에 안나오는걸로 보여서 나중에 보니 scroll_by_amount로 바뀐거로 보입니다. scroll 을 써야 좀더 사람같은?걸까요? 그리고 ActionChain에 TouchAction 이라는게 보이긴 하는데 터치를 시뮬레이션 할 수 있다면 더 좋을것 같은데 혹시 방법이 있을까요?
[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
선생님 강의에서는 공공api에서 파이썬2를 이용한 예제가 제공되었는데요. 제가 이 글을 쓰는 시점에는 파이썬 3로 되었더라구요. # Python3 샘플 코드 # import requests url = 'http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getMinuDustFrcstDspth' params ={'serviceKey' : '서비스키', 'returnType' : 'xml', 'numOfRows' : '100', 'pageNo' : '1', 'searchDate' : '2020-11-14', 'InformCode' : 'PM10' } response = requests.get(url, params=params) print(response.content) 예제 코드를 보면 강의코드처럼 한줄로 쓸 필요없이 , 네이버 open api처럼 params로 묶어서 처리하면 되는것 같은데요. 문제는 예제코드 자리에 서비스키를 넣어도 데이터가 로드 되지 않습니다. 에러코드를 구글링해보니 서비스키 재발급 또는 한시간정도를 기다려보라고 해서 둘다 실행해봤지만 계속 에러가납니다 .. b'<OpenAPI_ServiceResponse>\n\t<cmmMsgHeader>\n\t\t<errMsg>SERVICE ERROR</errMsg>\n\t\t<returnAuthMsg>SERVICE_KEY_IS_NOT_REGISTERED_ERROR</returnAuthMsg>\n\t\t<returnReasonCode>30</returnReasonCode>\n\t</cmmMsgHeader>\n</OpenAPI_ServiceResponse>' 예제코드에서 서비스키에 제 서비스키를 넣는거 말고 다른것을 수정해야하는 부분이 있나요?
[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
타입 변환에 관한 질문이며 문자열을 정수로, 정수를 문자열로 변환하는 과정 중에 int(), str() 함수를 사용하여 데이터 타입 변환 후 변수에 할당하였을 때는 print(type())을 출력하면 변환된 타입이 출력되어 결과값이 확인되지만, 그렇지않고 print()함수 안에서 int(),str() 함수를 사용하여 변환시에는 위의 사진과 같이 type()함수로 확인 시 int(), str()함수를 썻음에도 불고하고, 출력값이 변환되지않고 나오게됩니다. type을 변환하기 위해서는 따로 변수를 만들어서 int(), str() 함수를 써서 변수에 할당해주어야하나요??
안녕하세요! 다른분꺼 내용 보고 해답을 찾을 뻔 했다가 무한스크롤이 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')
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로 처리 했었는대 이코드 뿐만 아니라 추 후에 이런 비슷한거 나왔을떄 저렇게 짜면 문제가 될가능성이 있을까용 ?
pyautogui 설치시 이번에는 오류 메시지가 바뀌었네요... 그리고 다른 방법들도 다 해봤는데 안되네요 방화벽을 끄는 방법과 직접 다운로드 받아서 설치하는 것까지 다 해봤는데아래에 이미지 처럼 WinError 5 액세스 거부가 되었네요. 이 에러가 윈도우 운영체제 버전과 상관이 있나요? 제가 사용하는 윈도우가 11인데 요즘 윈도우가 버전이 높아지면서 안되는게 제법 많아진 것 같아서요..어떻게 해결해야 될지 정말 막막하네요... 아니면 pyautogui를 빼고 진행을 해야 할지 고민을 해봐야 겠네요.. ㅠㅠ 꼭 좀알려주세요...
안녕하세요. 뷰티풀수프 기초 사용법 수강 중에 잘 안되는 부분이 있어서 질문 남깁니다. 네이버 메인 화면 개발자 모드에서 <span class="service_name">메일</span> 라는 태그를 찾아서 이 태그를 찾기 위해 span = soup.find(class_="service_name", string="메일") print(span) 이렇게 작성했는데 왜 결과값이 none 이 나오는지 이유를 모르겠습니다 ㅠㅠ 그리고 앞의 강의에서 개발자 모드의 element가 아니라 소스보기에서 보이는 코드에서 태그를 검색해서 찾아내는 것(?)이라고 말씀하셨던 것 같은데 제대로 이해한게 맞나요? 소스 보기로 보면 코드가 너무 지저분하게 보이는데 혹시 깔끔하게 볼 수 있는 방법이 있을까요?
잘 따오다가 갑자기 오류가 나더니 그 뒤로 계속 이 오류창이 뜹니다ㅠㅠ 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')
저는 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 err selenium.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
제가 프롬프트 창에서 pip install pyautogui 를 입력해서 실행을 시켰는데 '파일에 바이러스 또는 기타 사용자 동의 없이 실치된 소프트웨어가 있기 때문에 작업이 완료되지 않았습니다' 라는 오류메시지가 뜨면서 설치가 안되네요. 왜그런지 알려주세요 오류 이미지도 같이 올릴게요
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를 제외하고는 강의 내용과 동일한거 같은데 어디에 문제가 있는 걸까요..?
브라우저가 꺼지는데 어느부분이 문제일까요?? 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")
Chapter03에서 Beautifulsoup라이브러리를 실습을 해보는데 결과가 <div class="talk_area" id="topTalkArea"></div>이렇게 div 밖에 안나오는데 뭔가 잘 못된건가요? 물론 id를 사지고 해봤네요..word = soup.select _one('#topTalkArea') 라고 했는데 <div class="talk_area" id="topTalkArea"></div> 이렇게밖에 안나왔네요...