일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Modal
- AWS
- 웹크롤링
- Redux
- component
- 웹팩
- 포트포워딩
- express
- npx
- go
- Recoil
- 성능최적화
- sequelize
- react
- socket.io
- graphql
- typescript
- 회고
- javascript animation
- 정규표현식
- 반응형웹
- scrapping
- route
- cicd
- CDN
- styled-component
- docker
- Today
- Total
프로그래밍 공부하기
[Python] 웹크롤링 2 - 로그인 본문
웹의 정보는 모든 사람에게 공개된 것 뿐만 아니라 회원에게만 공개되는 데이터들이 있다. 예를 들어 네이버에서 나의 쇼핑목록 가져오기 같은 것들 말이다. 이러한 경우 로그인을 하여 정보를 가져와야 한다.
1. 세션
정보를 가져오고 싶은 웹페이지가 세션을 이용해 로그인을 한다면 로그인 데이터를 세션을 통해 보내주면 된다. 한빛출판네트워크에서 나의 마일리지 정보를 한 번 가져와보자.
한빛출판네트워크에서 F12의 네트워크 탭을 킨 상태로 로그인을 하여 확인해 보면 로그인 데이터가 POST방식으로 login_proc.php로 이동하는 것을 확인할 수 있다. 이를 이용하여 다음과 같이 코드를 작성해보자.
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
USER=" "
PASS = " "
session = requests.session()
login_info = {
"m_id": USER,
"m_passwd": PASS
}
#POST로 데이터 보내기
url_login = "http://hanbit.co.kr/member/login_proc.php"
res = session.post(url_login, data = login_info)
res.raise_for_status() #오류 발생하면 예외 발생
url_mypage = "http://www.hanbit.co.kr/myhanbit/myhanbit.html"
res = session.get(url_mypage)
res.raise_for_status()
soup = BeautifulSoup(res.text, "html.parser")
mileage = soup.select_one(".mileage_section1 span").get_text()
ecoin = soup.select_one(".mileage_section2 span").get_text()
print("마일리지:" + mileage)
print("이코인: " + ecoin)
위와 같이 requests 모듈을 이용하여 로그인 정보를 담은 세션을 POST로 login_proc.php로 보내면 로그인이 되고 나의 마일리지 정보를 가져올 수 있다.
2. Selenium
Selenium이란 웹브라우저를 원격으로 조작하는 방식이다. 보안 상의 이유로 웹브라우저를 통해서만 데이터를 가져올 수 있는 경우가 있다. 이 때 Selenium을 이용하여 웹브라우저를 조작하여 웹 데이터에 접근하면 된다. 아래 코드는 네이버에서 나의 쇼핑목록을 가져오는 코드이다.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import pyperclip
chrome_path = "...\\chromedriver_win32\\chromedriver.exe"
url_login = "https://nid.naver.com/nidlogin.login"
url_shopping = "https://order.pay.naver.com/home?tabMenu=SHOPPING"
driver = webdriver.Chrome(chrome_path)
driver.get(url_login)
time.sleep(1)
# id, pw 입력할 곳을 찾기
tag_id = driver.find_element_by_name('id')
tag_pw = driver.find_element_by_name('pw')
tag_id.clear()
tag_pw.clear()
time.sleep(1)
# id 입력
tag_id.click()
pyperclip.copy('내id')
tag_id.send_keys(Keys.CONTROL, 'v')
time.sleep(1)
# pw 입력
tag_pw.click()
pyperclip.copy('내비밀번호')
tag_pw.send_keys(Keys.CONTROL, 'v')
time.sleep(1)
# 로그인 버튼을 클릭합니다
login_btn = driver.find_element_by_id('log.login')
login_btn.click()
#바로 하면 페이지 이동이 안될 수 있다.
time.sleep(3)
#쇼핑페이지 데이터 가져오기
driver.get(url_shopping)
#쇼핑목록 출력
products = driver.find_elements_by_css_selector("p.name")
for product in products:
print("-", product.text)
브라우저는 내 크롬에 맞는 버전의 크롬드라이버를 다운받아 사용하며 chrome_path는 크롬 드라이버의 실행파일 위치를 입력한 것이다. (참고한 책에서는 PhantomJS를 썼는데 이게 유지보수가 더이상 안된다고 해서 크롬으로 변경하였다. )
또한 네이버의 경우 로그인하는 것이 사람인지 컴퓨터인지 구분하기 위해 캡챠라는 것이 있다. 이는 pyperclip으로 아이디, 패스워드를 복사, 붙여넣기 방식으로 입력하는 것으로 해결할 수 있다.
'Web > [Other] Language' 카테고리의 다른 글
Go (0) | 2021.03.12 |
---|---|
[Python] 웹크롤링 1 - BeautifulSoup와 requests (0) | 2021.01.09 |
[Python] 아스키코드변환: ord, chr (0) | 2021.01.08 |
[Python] //연산과 %연산의 결과는 다른 언어와 다르다. (0) | 2020.12.19 |