선미 파이썬 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() # 브라우저 종료 ''' 내가 관심있는 '''