선미 파이썬 0405 19일차

azuremei
이동: 둘러보기, 검색

#web

'''
[파이썬 설치 시 자동으로 같이 포함되는 모듈이 아닌 외부 모듈을 설치하는 방법]

1)실행-emd

2) pip install beatifulsoup4
'''
#2.5) python -m pip install --upgrade pip #업그레이드가 필요하다고 뜨는 경우

#import bs4
#원래 설치되어있던 모듈이 아닌데

#3) pip install selenium

#import selenium

#pip install : 파이썬에 설치되지 않은 모듈을 파이썬의 서버에서 불러와 설치하는 것

'''
    웹 크롤링 web crawling
     - 인터넷 특정 페이지에서 데이터를 가져와 가공하는것
     - 파이썬에서의 크롤링 : 어떤 모듈을 사용해서 만드나요?
         1. request 모듈 : 크롬에서 페이지소스보기 > 원하는 정보를 그 안에서 찾을 수 있으면 간단하게 사용할 수 있는 모듈이다. 이 모듈도 사용하려면 pip install request 해아함
         2. selenium : 페이지 소스보기에 원하는 정보가 없을 때 > 데이터가 숨겨져 있는 경우 사용. 가상의 웹 브라우저를 이용하여 마치 사용자가 페이지에 접근하듯 사용
             >>가상의 웹 브라우저<<를 이용할 수 있는 모듈
        >>리퀘스트는 프로그램적으로만 페이지에 결과를 요ㅛ청함(프로그램이 페이지에 결과를 요청하는게 티가 남-->이럴 경우 결과를 재대로 주지 않는 페이지들도 있다.)
            (우리가 특정 사이트에 접속하는 것은 브라우저가 서버에 접근을 요청해서 서버가 허용한 값을 불러오는 것. 그러나 리퀘스트는?? 요청한 결과를 받을 때 요청하는 주체에 대한 정보전달도 같이 함.-나는 익플입니다/나는 크롬입니다>>리퀘스트는 -)

        위 두 개 모듈은 페이지에 결과를 요청해서 데이터를 받아오는 기능을 하는 모듈
         3. beautifulsoup4 : html코드를 파싱하기 편한 모듈
             >파싱이란?
              - 어떤 데이터에서 내가 원하는 데이터를 '특정 패턴'이나 '순서'같은 걸로 추출하여 가공하는 것
            >>html같은 코드를 우리가 접근하기 편한 방식으로 보여주는것
         
        


'''

from bs4 import BeautifulSoup # bs4에서 뷰티플수퓨만 임포트함 >> bs4라는 이름 싱략
from selenium import webdriver

driver = webdriver.Chrome() #드라이버는 웹드라이버 안에 있는 크롬, >>크롴 클래스의 인스턴스 생성

#크롬() 인스턴스 생성 시크롬드라이버 실행파일을 실행시켜서 가상의 크로믑라우저를 실행 >>드라이버 변수(인스턴스)는 새로 뜬 크롬브라우저 그 자체이다.
#>드라이버 변수를 이용해서 우리가 직접 클릭하고 페이지 이동하고 하는 것처럼 모든 행위를 코드화할 수 있다.

#다나와 메인 페이지에서 쇼핑 특가혜택의 32개 제품 정보를 출력

#get(url)
driver.get( "http://danawa.com" ) #url로 이동

#2. 현재 페이지의 모든 내용을 가져와서 뷰티플숲 객체로 만들기(파싱하기 위해서

soup = BeautifulSoup( driver.page_source.encode( "utf-8", "ignore" ) , "html.parser") #매서드
# driver.page_source : driver : 현재 내 페이지의 모든 소스
# 생성자에 전달한 driver.page_source.incode( "utf-8", "ignore" )의 두 ??인 유티엪/이그노어

#print(soup) # 재대로 전달됐는지 시험

#원하는 데이터 파싱
#필요한 지식 : 1. html 코드 형태, 2) bs4 함수 다루는 방법
#가장 중요한 것 : 웹페이지는 페이지마다 html 구조가 다!!! 다르기 때문에 특정 페이지를 크롤링하여 파싱하려면 그 페이지를 '선 분석'하고 분석한 것을 코드화해야함

#오타 주의하기(문자열은 오타나도 프로그램 실행에는 문제가 안돼서 발견 힘듦)
main = soup.find( "div" , {"class":"main_middle_content"})
#숲이라는 변수가 페이지 내용을 다 불러왔다는 전제 하에 find는 태그(앞에는 무조건 태그가 온다.)=div main...에 속한 내용 전체를 다 가져온 것.

count = 0 # 몇 번째 제품인지

for ul in main.find_all("ul") : # 이전의 태그 내 ul태그를 모두 찾아서 리스트화하는것>유엘변수에 대입/퐈인드올 : 같은 이름의 태그가 여러개일 때 사용.>>포문에서 반복대입 가능>> 첫 번째 유엘을 해서 이 내용을 모두 유엘이라는 변수에 담는것
    for li in ul.find_all("li") : # ul태그 안의 모든 li태그를 반복대입
        print(li.text) #하나의 li 태그 안에서 모든 텍스트필드를 문자열로 반환

        count+=1
        print(li.text.strip().replace("\n", " "))
#div class~~ [쇼킹특가혜택[ ]] 이것들을 모두 가져옴
        #유엘태그는 하나의 탭을 의미, 탭의 소스가 담겨있다. (총 4개)
        #li는 하나의 제품의 소스가 담겨있음 (1개의 유엘 안에 8개의 li가 있음) >>>li 8* ul 4 =32의 제품정보
#문자열로 반환이 된 출력물을 가공
 #strip : 공백 제거 / replace : a에서 찾은 모든 문자열을 b로 바꾼다.


#카운트 변수를 추가함 // 카운트 어디썼는지 노트에서 찾아보기

'''
html 소스
    tag : <a></a>태그 이름이 a, 열고닫기
    태그의 속성 : <a class="abcd" /> #태그의 추가 내용이 없으면 바로 닫아도 됨 >>클래스가 속성, abcd는 값
    text 필드 : <a>나는 텍스트필드임</a> 태그를 표현하는 <> 바깥에 있는 모든 글자(일반적으로 검정색)
    
    
'''


driver.close() # 브라우저 종료

'''
내가 관심있는 

'''