goodthings4me.tistory.com
네이버에서 로그인이 필요한 웹 페이지에 대해 스크래핑(크롤링)을 하려면 세션을 유지해야 하는데, 셀레니움(selenium)으로 쿠키를 얻은 후, selenium이 아닌 requests.Session 모듈로 쿠키를 보내서 세션을 유지할 수가 있다.
로그인 없이 접속한 경우의 헤더(headers)와 쿠키(cookies)
import requests
from bs4 import BeautifulSoup
def requests_cookie(url):
response = requests.get(url, headers={'User-Agent':'Mozila/5.0'})
print(response.headers) # 응답 headers
print(response.cookies) # <RequestsCookieJar[]>
soup = BeautifulSoup(response.text, 'html.parser')
print(soup) # 결과는 로그인 페이지
requests_cookie('https://mail.naver.com/')
네이버 메일에 접근 시, 로그인 페이지로 redirect 된다.
응답 헤더(headers)는
쿠키(cookies)는 # <RequestsCookieJar[]>
BeautifulSoup(response.text, 'html.parser') 인스턴스 객체는 네이버 로그인 페이지의 소스가 출력된다.
<html lang="ko">
<head>
<meta charset="utf-8"/>
<meta content="IE=edge, chrome=1" http-equiv="X-UA-Compatible"/>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"/>
<meta content="website" property="og:type"/>
<meta content="[네이버: 로그인]" property="og:title"/>
<meta content="안전한 로그인을 위해 주소창의 URL과 자물쇠 마크를 확
인하세요!" property="og:description"/>
<meta content="https://ssl.pstatic.net/sstatic/search/common/og_v3.png" property="og:image"/>
<meta content="image/png" property="og:image:type"/>
<meta content="1200" property="og:image:width"/>
<meta content="1200" property="og:image:height"/>
<title>네이버 : 로그인</title>
<link href="/login/css/global/desktop/w_202105.css?20210812" rel="stylesheet" type="text/css"/>
</head>
<body>
<div class="wrap" id="wrap">
<div class="u_skip"><a href="https://www.naver.com">본문 바로가기</a></div>
<header class="header" role="banner">
<div class="header_inner">
<a class="logo" href="https://www.naver.com">
<h1 class="blind">NAVER</h1>
</a>
.....
셀레니움으로 네이버 로그인 접속
def reuse_cookies_test(url):
## selenium & chrome webdriver 사용
options = Options()
# options.add_argument('--headless') # 실행 화면 안 보이게 처리 (Background(CLI))
options.add_argument('--no-sandbox') # Bypass OS security model
options.add_argument('--disable-dev-shm-usage')
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome('./chrome_driver/chromedriver.exe', chrome_options=options)
driver.implicitly_wait(5)
driver.get(url)
time.sleep(10) # id & password 입력 시간 (직접 입력)
print(driver.get_cookies)
## <bound method WebDriver.get_cookies of <selenium.webdriver.chrome.webdriver.WebDriver (session="5a3368dddcbb4ea27fa6e1717f9a0d3b")>>
_cookies = driver.get_cookies()
cookie_dict = {}
for cookie in _cookies:
cookie_dict[cookie['name']] = cookie['value']
print(cookie_dict)
driver.quit()
- 셀레니움을 이용할 때, id와 password를 자동으로 입력하지 않고 수동으로 입력하기 위해 입력 대기 시간 (time.sleep(10))을 부여한다. (네이버 이외의 로그인 페이지에 활용할 수 있음)
- 네이버 로그인 페이지가 로딩되면 아이디와 패스워드를 입력한다.
- 셀레니움 driver로 네이버 쿠키( driver.get_cookies())를 얻은 후, dict 변수(cookie_dict)에 저장한다.
- selenium으로 관련 데이터를 수집해도 되지만, 셀레니움 웹 드라이버를 종료(drivet.quit())하고 dict 변수에 저장되어있는 응답 cookies를 이용해서 selenium보다 속도가 빠른 requests.Session()으로 스크래핑(클롤링)을 계속 진행한다.
requests.Session() 사용하기
session = requests.Session()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62',
}
print(session.headers)
print(session.cookies)
session.headers.update(headers) # User-Agent 변경
print(session.headers)
## {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
session.cookies.update(cookie_dict) # 응답받은 cookies로 변경
print(session.cookies)
- requests.Session() 객체를 생성한 후 session.headers와 session.cookies를 출력하면,
{'User-Agent': 'python-requests/2.26.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
<RequestsCookieJar[]>
- 요청 시 온전한 User-Agent를 위해 headers를 추가(업데이트)한다.
- 세션 유지를 위해 selenium 로그인으로 응답받아 저장한 cookies를 추가(업데이트)하고, 출력된 내용을 보면,

headers & cookies가 추가된 session 객체 활용하여 get() 처리해보기
res = session.get(url)
soup = BeautifulSoup(res.text, 'html.parser')
with open('pay.txt', 'w', encoding='utf-8') as f: # 확인해보기 위해 저장
f.write(soup.text)
unread_find = len(soup.find_all('span', id='unreadMailCount'))
print(unread_find) # 2
- https://mail.naver.com 에 대해 session.get() 처리한 경우, 처음과 달리 로그인 페이지가 아닌 메일 페이지로 이동되고,
- 읽지 않은 메일 숫자를 가져오니 '2'라는 숫자가 출력되는 것을 확인할 수 있었다.
위 소스 코드를 활용하면, 다른 로그인 웹 사이트에 대해서도 세션을 유지하여 스크래핑(크롤링)할 수 있을 거 같다.
블로그 인기글
Windows 10 탐색기 느려지는 증상과 해결하는 방법
잘 작동하던 Windows 10 탐색기가 갑자기 느려지는 증상이 발생했을 때 어떻게 조치를 하는지 구글에서 찾아보니 많은 해결책들이 있었으나 어떤 것이 정확한 해결책인지는 알 수가 없었다. 그래서 해결방법이라고 제시한 것들을 정리해 보았다. 윈도우 탐색기가 느려지는 증상 해결 방법 어느 순간부터 응용프로그램(VS Code 등)에서 폴더 열기나 파일 불러오기를 했을 때 검색 팝업창이 안 뜨거나 열리는 시간이 엄청 느려지는 증상과, 더불어서 탐색기도 실행이 많이 느려지는 증상이 있었다. 기존에 사용하던 VS Code에 openpyxl 설치 후 실행이 느려지는 증상이 발생하더니 윈도우10 탐색기도 느려져서 사용할 수가 없었다. 노트북에 OS(Windows10)를 설치한지 1년이 다 되어가긴 했지만, 1개월 전..
goodthings4me.tistory.com
엑셀 시트 분리 저장 - 엑셀 파일의 시트를 분리하여 저장하기
엑셀을 사용하다 보면 엑셀 시트를 분리해서 저장해야 할 때가 있다. 최근에도 이런 경우가 발생하여 구글링 후 엑셀 시트 분리 업무를 수행하고 내친김에 다른 사람들도 사용할 수 있도록 파이썬 tkinter로 프로그램으로 만들어 보았다. Excel Sheets 분리 저장하는 프로그램(with 파이썬 Tkinter) ※ 프로그램 다운로드(네이버 MYBOX에서 공유) : ExcelSeparateSheets.zip ▶ 프래그램을 실행하면 다음과 같이 초기 화면이 보인다. 찾아보기 : 엑셀 파일이 있는 폴더를 선택한다. (프로그램이 있는 최상위 디렉터리가 열린다) 실행하기 : 프로그램 실행 버튼 상태 변경 순서 : 실행전 → 실행 중 → Sheet "OOO" 분리 저장 중 → 실행 완료 실행 결과 확인 : 엑셀 파..
goodthings4me.tistory.com
[국세청] 현금영수증가맹점으로 가입바랍니다. 메시지 해결방법(개인사업자)
▶ 현금영수증 가맹점 가입 메시지를 받고... 온라인 쇼핑몰 사업을 시작하려고 사업자등록증을 발급받고 난 후 얼마 안 있어서 국세청으로부터 어느 시점까지 '현금영수증 가맹점'으로 가입하라는 문자메시지가 받았었다. 그 메시지 기한이 오늘 도래했는데, 인터넷에서 찾아보니 홈택스에서 현금영수증 발급 사업자 신청을 할 수가 있었다. [관련내용] 홈>국세정책/제도>전자(세금)계산서/현금영수증/신용카드>현금영수증∙신용카드>가맹점가입 ▶ 홈택스 사이트에서 신청하는 절차는 다음과 같다. 우선, 홈택스에 로그인을 해야 합니다. 세상이 좋아져서 공인인증서 없이도 손쉽게 간편인증 로그인이 가능하다. 여러 인증방법 중 카카오톡 인증이 가장 편리한 거 같다. 간편인증 로그인 후 상단 '조회/발급' 탭 클릭 후 '현금영수증>현금..
goodthings4me.tistory.com
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
11번가 실시간 쇼핑 검색어 추출해서 저장하기(python tkinter) (0) | 2022.01.10 |
---|---|
단축 URL 스크래핑에 파이썬 비동기 처리 개념 적용해보기 (0) | 2022.01.07 |
웹 브라우저 페이지를 자동으로 스크롤 해보기 (with 파이썬) (0) | 2021.12.28 |
블로그 글 내용 저장 중 이모지 '\U0001f970' 에러 발생 (파이썬) (0) | 2021.12.26 |
파이썬 selenium 라이브러리 - find_elements_by_* commands are deprecated. (0) | 2021.12.25 |
댓글