해당 글은 코드잇 강의를 참고하여 작성되었습니다.
- 웹 페이지 스타일링 원리
- 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
- HTML코드 받아오기
- BeautifulSoup 타입으로 바꾸기
- 태그 구조 파악하기
- 태그 골라내기
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 |