본문 바로가기

Python

Python - 웹크롤링 (BeautifulSoup/ Selenium)

html = '''
 <html><body>
  <div id ='potal'>
  <h1>포털 목록</h1>
  <u1 class = 'items'>
  <li><a href='http://www.naver.com'>naver</a></li>
  <li><a href='http://www.daum.net'>daum</a></li>
 </ul></div></body></html>
'''

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
links = soup.find_all("a")
for a in links :
    # attrs : 속성값
    # 이름이 href인 속성의 값을 리턴 
    href = a.attrs["href"] #http://www.naver.com
    text = a.string #a 태그의 내용 #daum
    print(text,">",href)

# select_one : 선택된 태그 1개

div#potal > h1 : id속성의 값이 potal인 div 태그의
                 하위태그 중 태그의 이름이 h1 태그 선택
                 => 선택자. 
# potal : id = 'potal' 태그 
 > : 하위태그. 자식노드 (바로 하위)
   : 하위태그. 자손노드 (하위)
.string : 선택된 태그의 값 (Text노드의 값)
'''
h1 = soup.select_one("div#potal > h1").string
print('h1=',h1)
'''
div#potal : id='potal'인 div 태그 
ul.items : class='items'인 ul 태그
'''
li_list = soup.select("div#potal > ul.items > li")
print(type(li_list))
for li in li_list:
    print(li)
    print("li=",li.string)


# 인터넷에서 데이터 가져오기
from bs4 import BeautifulSoup
import urllib.request as req

url = "https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp"
res = req.urlopen(url)


# url이 전달해준 데이터
print(res)
soup = BeautifulSoup(res,'html.parser')
title = soup.find('title').string
wf = soup.find('wf').string
print(title)
print(wf)


for w in wf.split("br />"):
    print(w)

 

# "https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp"
# 내용을 받아서 forecast.xml 파일로 저장하기
import os.path
# forecast.xml 파일이 없으면
if not os.path.exists("forecast.xml") :
    req.urlretrieve(url,"forcast") #파일에 저장

 

 

# BeautifulSoup 객체를 이용해서 작성된 날짜와 시간 정보
# 출력하기 
pubDate = soup.select_one("rss pubDate").string
print(pubDate)

pudDate = soup.find("pubDate")
print(pubDate)

# 모든 location 태그의 하위태그중 city 태그를 조회하기
for location in soup.find_all("location"):
    name = location.find("city").string
    weather = location.find("wf").string
    print(name, weather)

 

#books.html 파일에 저장된 html 내용 분석
from bs4 import BeautifulSoup
fp = open("books.html")
soup = BeautifulSoup(fp,"html.parser")

 

#li 태그들 중 4번째 태그의 값 출력
print(soup.select("li")[3].string) #Numbers
print(soup.find_all("li")[3].string) #Numbers

#태그 중 id=nu인 태그의 값 출력
print(soup.select_one('#nu').string)
print(soup.select('#nu')[0].string)

#li 태그 중 id=nu인 태그의 값 출력 
print(soup.select_one('li#nu').string)

#ul 태그의 하위 태그인 li 태그 중 id=nu인 태그의 값 출력 
print(soup.select_one('ul > li#nu').string)

#id 속성이 bible인 태그의 하위 태그인 li 태그 중 id=nu인 태그의 값 
print(soup.select_one('#bible > li#nu').string)

#람다식을 이용하여 출력하기
sel = lambda q : print(soup.select_one(q).string)
sel("#nu")

#li 태그중 4번째 태그의 값을 출력
sel("li:nth-of-type(4)")

#id 속성이 nu인 li태그의 값을 출력
sel("li[id='nu']")

 

# 네이버에 공시된 환율 정보를 출력하기
from bs4 import BeautifulSoup
import urllib.request as req
url="https://finance.naver.com/marketindex/?tabSel=exchange"
res = req.urlopen(url)
soup = BeautifulSoup(res,"html.parser",from_encoding="euc-kr")
sel = lambda q : soup.select(q)
# class 속성이 head_info div태그 들. 환율, 상승/하락 값, 상승/하락
hlist = sel("div.head_info")
# class 속성이 h_lst인 h3 태그 들. 통화량
htitle = sel("h3.h_lst")
print(htitle)
for tag, title in zip(hlist,htitle):
    # 통화명 
    print(title.select_one("span.blind").string, end='\t')
    # 환율 정보 
    value = tag.select_one("span.value").string
    print(value, end=" ")
    # 환율 변동값 
    change = tag.select_one("span.change").string
    # 상승, 하락
    print(change, end='\t')
    blinds = tag.select("span.blind") #상승 하락
    b = tag.select("span.blind")[-1].string
    print(b, end="*******\n")

 

# 셀레니움 예제
#pip install selenium
from selenium import webdriver

'''
chromedriver.exe 파일 다운로드
1. https://chromedriver.chromium.org/downloads
2. 크롬의 버전확인하기
    크롬 도움말 > 크롬 정보
3. 사용중인 크롬에 가장 가까운 버전의 드라이버 다운받기
    운영체제에 맞는 크롬드라이버 다운받기
4. 압축풀기
    chromedriver.exe 파일을 복사하기
'''

 

#크롬 브라우저 제어 기능 객체 

driver = webdriver.Chrome("chromedriver")

driver.get("http://python.org")

'''
  #top ul.menu li
    #top : id 속성값이 top인 태그 선택
    ul.menu : #top 하위 ul 태그 중 class='menu'인 태그
    li : ul.menu 하위의 li 태그들 
'''

 

menus = driver.find_elements_by_css_selector('#top ul.menu li')
print(type(menus))
pypi = None #pypi 객체값이 없음.
for m in menus :
    # m : li 태그의 문자값이 PyPI 태그 선택
    if m.text == "PyPI":
        pypi = m
    print(m.tag_name,m.text)
pypi.click() #프로그램으로 클릭하기.
import time
time.sleep(5) #5초동안 대기.
driver.quit() #크롬 브라우저 닫기.

 

## 네이버에 로그인 하기
driver = webdriver.Chrome("chromedriver")

driver.get("https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com")

id = input("네이버 아이디를 입력하세요.")
'''
execute_script : 자바스크립트 함수 사용
getElementsByName : html 페이지에서 name = 'id' 태그 선택
 document.getElementsByName('id')[0].value = ...
현재 페이지에서 name='id'인 첫번째 태그 선택  
'''

driver.execute_script("document.getElementsByName('id')[0].value='"+id+"'")
pw = input("네이버 비밀번호를 입력하세요 : ")
time.sleep(1)
driver.execute_script("document.getElementsByName('pw')[0].value='"+pw+"'")
tiem.sleep(1)
driver.find_element_by_xpath('//*[@id="log.login"]').click()
# //*[@id="log.login"]
# // : 루트노드. 화면에 처음
# * : 모든태그
# @id : id 속성
# [@id="log.login"] : id = "log.login"인 태그 선택
#                   : 로그인 버튼 태그 선택됨.
driver.find_element_by_xpath('//*[@id="log.login"]').click()

 

#다음 페이지에서 이미지를 다운받아 저장하기
from selenium import webdriver
import time
import urllib.request as req
import os
driver = webdriver.Chrome("chromedriver")

driver.get("https://search.daum.net/search?w=img&nil_search=btn&DA=NTB&enc=utf8&q=%EC%9E%A5%EB%AF%B8")

time.sleep(3)
images = driver.find_elements_by_css_selector("#imgList > div > a > img")
img_url = [] #이미지 url 정보를 리스트로 저장하는 있는 리스트.
for image in images:

    # image : 이미지태그

    # get_attribute('src') : img 태그의 src 속성의 값

    # url : https~ 
    url = image.get_attribute('src')
    img_url.append(url)
print(img_url)
driver.quit()
img_folder = './img' #이미지를 저장할 폴더 선택.

# isdir : 해당 폴더가 존재?

# 해당 폴더가 없으면 폴더를 새로 생성하는 조건문 
if not os.path.isdir(img_folder):
    os.mkdir(img_folder) #폴더를 생성해주는 함수 

# enumerate : 리스트 값과 인덱스를 조회 (zip)

# index : 리스트의 인덱스

# link : 리스트의 값 

for index, link in enumerate(img_url) :
    req.urlretrieve(link, f'./img/{index}.jpg')

 

# 네이버 홈화면을 이미지 파일로 저장하기
from selenium import webdriver
url = "http://www.naver.com/"
driver = webdriver.Chrome("chromedriver")
driver.get(url)
driver.save_screenshot("naverhome.png")
driver.quit()