안드로이드 단말기의 설정 앱에서 프록시를 설정하는 방법이 아닌, shell 에서 명령어를 이용하여 설정하는 방법 입니다.
adb shell settings put global http_proxy <ip>:<port>
ex) adb shell settings put global http_proxy localhost:8080
ex) adb shell settings put global http_proxy 192.168.0.1:9999
from bs4 import BeautifulSoup
from selenium import webdriver
2. driver라는 이름의 변수에 webdriver 객체를 만들어 저장한다.
from bs4 import BeautifulSoup
from selenium import webdriver
# 위치 지정
driver = webdriver.Chrome("(~저장경로)/chromedriver")
저장경로 살피세요
3. Selenium은 기본적으로 웹 자원들이 모두 로드될 때까지 기다려주지만, 암묵적으로 기다리는 시간을 조정할 수 있다.
from bs4 import BeautifulSoup
from selenium import webdriver
# 위치 지정
driver = webdriver.Chrome("(~저장경로)/chromedriver")
# 웹 자원 로드를 위해 암묵적으로 딜레이
delay_time = 3
driver.implicitly_wait(delay_time)
4. 이제 URL을 지정하여 접근하자.
from bs4 import BeautifulSoup
from selenium import webdriver
# 위치 지정
driver = webdriver.Chrome("(~저장경로)/chromedriver")
# 웹 자원 로드를 위해 암묵적으로 딜레이
delay_time = 3
driver.implicitly_wait(delay_time)
# URL 접근
driver.get('https://nid.naver.com/nidlogin.login')
5. 네이버 로그인 화면에서 아이디와 패스워드의 값을 넘기는 폼의 name 값이 각각 id, pw인 것을 확인할 수 있다.
6. webdriver의 find_element_by_name() 함수를 통해 태그를 지정하여 값을 넣어주자.
from bs4 import BeautifulSoup
from selenium import webdriver
# 위치 지정
driver = webdriver.Chrome("(~저장경로)/chromedriver")
# 웹 자원 로드를 위해 암묵적으로 딜레이
delay_time = 3
driver.implicitly_wait(delay_time)
# URL 접근
driver.get('https://nid.naver.com/nidlogin.login')
# ID, PW 입력
id = "본인_네이버_아이디"
pw = "본인_네이버_패스워드"
driver.find_element_by_name('id').send_keys(id)
driver.find_element_by_name('pw').send_keys(pw)
7. 이제 로그인 버튼을 눌러 로그인이 정상적으로 실행되는지 확인한다.
from bs4 import BeautifulSoup
from selenium import webdriver
# 위치 지정
driver = webdriver.Chrome("(~저장경로)/chromedriver")
# 웹 자원 로드를 위해 암묵적으로 딜레이
delay_time = 3
driver.implicitly_wait(delay_time)
# URL 접근
driver.get('https://nid.naver.com/nidlogin.login')
# ID, PW 입력
id = "본인_네이버_아이디"
pw = "본인_네이버_패스워드"
driver.find_element_by_name('id').send_keys(id)
driver.find_element_by_name('pw').send_keys(pw)
# 로그인 버튼 클릭
driver.find_element_by_xpath('//*[@id="frmNIDLogin"]/fieldset/input').click()
8. 로그인 후 실시간 검색어 추출을 위해 네이버 메인으로 이동한다.
driver.get("https://www.naver.com")
9. BeautifulSoup 객체를 이용해 페이지를 분석한다.
driver.get("https://www.naver.com")
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
10. 5번에서와 같이 개발자 도구를 통해 실시간 검색어가 어느 태그에 있는지 확인한다.
11. 마지막으로 추출된 값들을 프린트 한다.
driver.get("https://www.naver.com")
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
realtime_search_word = soup.select('div.ah_roll_area > ul.ah_l > li > a > span.ah_k')
for list in realtime_search_word:
print(list.text.strip())
이로써 파이썬과 BeautifulSoup, Selenium, ChromeDriver 등과 같은 라이브러리를 사용하여 네이버에 로그인 후, 실시간 검색어를 추출하는 프로그램을 작성해보았다.
from bs4 import BeautifulSoup
from selenium import webdriver
""" 네이버 로그인 웹 크롤링 """
# 위치 지정
driver = webdriver.Chrome("(~저장경로)/chromedriver")
# 웹 자원 로드를 위해 암묵적으로 딜레이
delay_time = 3
driver.implicitly_wait(delay_time)
# URL 접근
driver.get('https://nid.naver.com/nidlogin.login')
# ID, PW 입력
id = "본인_네이버_아이디"
pw = "본인_네이버_패스워드"
driver.find_element_by_name('id').send_keys(id)
driver.find_element_by_name('pw').send_keys(pw)
# 로그인 버튼 클릭
driver.find_element_by_xpath('//*[@id="frmNIDLogin"]/fieldset/input').click()
""" 로그인 후 실시간 검색어 추출 """
driver.get("https://www.naver.com")
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
realtime_search_word = soup.select('div.ah_roll_area > ul.ah_l > li > a > span.ah_k')
for list in realtime_search_word:
print(list.text.strip())
# 드라이버 종료
driver.close()
링크드 리스트(linked list)의 머리 노드(head node)와 정수 N이 주어지면, 끝에서 N번째 노드(node)를 제거하고 머리 노드(head node)를 리턴하라.
단, 리스트를 한번만 돌면서 풀어야 한다. N은 리스트 길이보다 크지 않다.
예제 }
Input : 1 -> 2 -> 3 -> 4 -> 5, N = 2
Output : 1 -> 2 -> 3 -> 5
Input : 1 -> 2 -> 3, N = 3
Output : 2 -> 3
Input : 1, N = 1
Output : null
이 문제는 두 개의 포인터를 쓰면 쉽게 풀린다.
첫 번째 포인터를 먼저 N만큼 보낸다.
그리고 첫 번째 포인터와 두 번째 포인터를 동시에 하나씩 움직인다.
첫 번째 포인터의 다음 노드가 null의 값을 가지게 되면, 두 번째 포인터의 다음 노드는 끝에서 N 번째 노드가 된다.
그 노드를 제거 한 뒤 머리 노드를 리턴하면 된다.
중요한 엣지 케이스는, 첫 번째 노드를 N 번째 옮긴 후 노드의 값이 null이라면 끝에서 N 번째 노드는 첫 번째 노드임으로 헤드를 업데이트 한 후 리턴해준다.
Node solution(Node head, int n) {
if (head == null) {
return null;
}
Node first = head;
Node second = head;
for (int i = 0; i < n; i++) {
first = first.next;
}
if (first == null) {
head = head.next;
return head;
}
while (first.next != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
return head;
}