본문 바로가기

데이터/데이터사이언스입문

5.3 필요한 데이터 골라내기

해당 글은 코드잇 강의를 참고하여 작성되었습니다.

- 웹 페이지 스타일링 원리

  • HTML 태그를 선택하는 코드
  • 스타일을 지정하는 코드

 

- CSS 선택자

  • 태그이름
  • id
  • class
  • 속성(attribute)

 

- 파싱1

  • 파싱 : 문자의 구조를 분석해서 원하는 정보를 얻어내는 것
  • BeautifulSoup타입 만들기
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html_code, 'html.parser')
     
  • 특정 태그 선택하기
    li_tags = soup.select('li')
    # 첫 번째 <li> 태그 출력하기
    print(li_tags[0])
     
  • 태그에서 문자열 추출하기
    # 모든 <li> 태그 선택하기
    li_tags = soup.select('li')
    
    # 빈 리스트 만들기
    beverage_names = []
    
    # 텍스트 추출해서 리스트에 담기
    for li in li_tags:
        beverage_names.append(li.text)
    
    # 결과 출력
    print(beverage_names)​
     

- 파싱2

  • 태그의 속성값 추출하기
    # BeautifulSoup 타입으로 변환
    soup = BeautifulSoup(html_code, 'html.parser')
    
    # 모든 <img> 태그 선택하기
    img_tags = soup.select('img')
    
    # 빈 리스트 만들기
    img_srcs = []
    
    # 이미지 주소 추출해서 리스트에 담기
    for img in img_tags:
        img_srcs.append(img["src"])
    
    # 결과 출력
    print(img_srcs)​

 

- CSS 선택자 더 알아보기

  • OR연산
    .two, .four {
      color: red;
    }​
  • AND연산
    .favorite.private {
      color: red;
    }​
  • 중첩된 요소 : 띄어쓰기
    p i {
      color: red;
    }​

 

- 크롬 개발자 도구로 선택자 알아내기

  • 개발자 도구에서 특정 HTML 요소를 오른쪽 클릭하고 Copy 메뉴의 Copy Selector를 클릭하면, CSS 선택자가 클립보드에 복사됩니다.

- 파싱 3

  1.  HTML코드 받아오기
  2. BeautifulSoup 타입으로 바꾸기
  3. 태그 구조 파악하기
  4. 태그 골라내기
    import requests
    from bs4 import BeautifulSoup
    
    # HTML 코드 받아오기
    response = requests.get("https://workey.codeit.kr/music/index")
    
    # BeautifulSoup 타입으로 변환
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # "popular__order" 클래스를 가진 태그에 중첩된 모든 <li> 태그 선택
    li_tags = soup.select(".popular__order li")
    
    # 빈 리스트 생성
    popular_artists = []
    
    # 텍스트 추출해서 리스트에 담기
    for li in li_tags:
        popular_artists.append(li.text.strip())
    
    # 결과 출력
    print(popular_artists)​​

- 실습과제

문제 :
'인기 아티스트' 아래에 있는 '검색어 순위'의 1위~10위 데이터를 파싱해서 리스트에 담아 print 해 보세요.
정답 :
import requests
from bs4 import BeautifulSoup

# 코드를 작성하세요
response = requests.get("https://workey.codeit.kr/music/index")

# BeautifulSoup 타입으로 변환
soup = BeautifulSoup(response.text, 'html.parser')

# "popular__order" 클래스를 가진 태그에 중첩된 모든 <li> 태그 선택
li_tags=soup.select(".rank__order li ")
search_ranks=[]

for li in li_tags:
    search_ranks.append((li.text.strip()).split(" ")[2])
# 결과 출력
print(search_ranks)​

 

 

- 필요한 페이지만 가져오기

import time
import requests
from bs4 import BeautifulSoup

# 빈 리스트 생성
pages = []

# 첫 페이지 번호 지정
page_num = 1

# headers 지정
headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
}

while True:
    # HTML 코드 받아오기, 위에서 지정해 준 headers 설정해 주기
    response = requests.get("http://www.ssg.com/search.ssg?target=all&query=nintendo&page=" + str(page_num), headers=headers)

    # BeautifulSoup 타입으로 변환하기
    soup = BeautifulSoup(response.text, 'html.parser')

    # ".csrch_tip" 클래스가 없을 때만 HTML 코드를 리스트에 담기
    if len(soup.select('.csrch_tip')) == 0:
        pages.append(soup)
        print(str(page_num) + "번째 페이지 가져오기 완료")
        page_num += 1
        time.sleep(3)
    else:
        break

# 가져온 페이지 개수 출력하기
print(len(pages))

 

- 웹 페이지를 DataFrame으로

import time
import pandas as pd
import requests
from bs4 import BeautifulSoup

# 빈 리스트 생성
records = []

# 시작 페이지 지정
page_num = 1

while True:
    # HTML 코드 받아오기
    response = requests.get("http://www.ssg.com/search.ssg?target=all&query=nintendo&page=" + str(page_num))

    # BeautifulSoup 타입으로 변형하기
    soup = BeautifulSoup(response.text, 'html.parser')

    # "prodName" 클래스가 있을 때만 상품 정보 가져오기
    if len(soup.select('.csrch_tip')) == 0:
        product_names = soup.select('.cunit_info > div.cunit_md.notranslate > div > a > em.tx_ko')
        product_prices = soup.select('.cunit_info > div.cunit_price.notranslate > div.opt_price > em')
        product_urls = soup.select('.cunit_prod > div.thmb > a > img')
        page_num += 1
        time.sleep(3)
        
        # 상품의 정보를 하나의 레코드로 만들고, 리스트에 순서대로 추가하기
        for i in range(len(product_names)):
            record = []
            record.append(product_names[i].text)
            record.append(product_prices[i].text.strip())
            record.append("https://www.ssg.com" + product_urls[i].get('src'))
            records.append(record)
    else:
        break

# DataFrame 만들기
df = pd.DataFrame(data = records, columns = ["이름", "가격", "이미지 주소"])

# DataFrame 출력
df.head()

'데이터 > 데이터사이언스입문' 카테고리의 다른 글

5.2 웹 페이지 가져오기  (0) 2021.07.14
5.1 데이터를 만드는 방법  (0) 2021.07.14
4.2 데이터 클리닝  (0) 2021.07.13
4.1 좋은 데이터의 기준  (0) 2021.07.13
3.5 새로운 인사이트 발견하기  (0) 2021.07.12