EDA_ 웹데이터

이새롬·2023년 3월 2일
0
post-thumbnail

BeautifulSoup

선언
import
from bs4 import BeautifulSoup

page = open("../../data/03.web_data/03.testfile.html","r").read()
page

html 문서 열기

read()로 읽어오면 문자를 막 뿌려줌.

html 방식 그대로 보려면
1) print()

2)
soup = BeautifulSoup(page, "html.parser")
print(soup.prettify())

오픈 파일 상태 확인

변수로 많이 쓰는 page, response,res

response = urlopen(url)
response.status

파일 오픈 시 문제가 생기면 response.status를 통해
HTML 상태코드 검색하면 위키백과에 어떤 오류인지 확인 가능함.

request 모듈 이용시
!pip install requests

import requests
from urllib.requests.Request
from bs4 import BeautifulSoup

url = "주소"
response = requests.get(url,headers=headers)
soup = BeautifulSoup(response.text,"html.parser")
response

🚫파일소환 시 403에러 대책

접속 방법
1)
req = Request(url, headers={"User-Agent":"Chrome"})
response = urlopen(req)
response.status

2)

pip install fake-useragent 설치 후

from fake_useragent import UserAgent

ua = UserAgent()
ua.ie
req = Request(url, headers={"User-Agent":ua.ie})
response= urlopen(req)
response.status
로 우회접속도 가능

주소지가 영어일때
인코딩 하는 법

import urllib
from urllib.request import urlopen, Request

html = "https://ko.wikipedia.org/wiki/{search_words}"

req = Request(html.format(searchwords=urllib.parse.quote("여명의눈동자")))
response=urlopen(req)
response.status

urllib.parse.quote()
글자를 url로 인코딩하는 매서드

상대주소 절대주소로 만들기
from urllib.parse import urljoin

urljoin(url_base,상대주소)

기본주소+상대주소로 반환해줌
기본주소가 있을 시 무시하고 정상 구동시켜줌


데이터 읽어오기

.코드명

e.g> soup.head
가장 상위에 있는 head 코드가 나온다

.find("코드")

위에랑 실행결과가 같음

.find_all("코드")

안에 있는 모든 해당 코드를 가져온다

조건 좁히기
.find("태그", class_="클래스명")
.find("태그","클래스명")
.find("태그",{"class":"클래스명"})

id 찾기
.find("태그",id="아이디")
.find("태그", {"id":"아이디"})

텍스트만 가져오고 싶을때.
좁혀 놓은 구간에서 .text.strip() 붙인다.

.text 텍스트 추출
.strip() 불필요한 문자 제거

e.g> soup.find("p",{"id":"second"}).text.strip()

  • 다중조건
    .find("p",{"class":"inner-text first-item","id":"first"})

a 태그에서 href 속성값에 있는 값 추출

1> links[0].get("href")
2> links[1]["href"]

💡 조건에 맞춰 여러개를 읽어온 후에는 꼭!!
len()으로 감싸 정상적으로 다 읽어왔는지 확인한다!

💡 웹 크롤링시 이상 작동이라고 판단되어 차단 될 수 있으니
time.sleep(0.5) 넣어주기

import time
from tqdm import tqdm

movie_data = []
movie_name = []
movie_point = []

for today in tqdm(date):
    url = "주소.date={date}"
    response = urlopen(url.format(date=today.strftime("%Y%m%d")))
    soup = BeautifulSoup(response,"html.parser")
    
    end = len(soup.find_all("td","point"))
    movie_data.extend([today for _ in range(0,end)])
    movie_name.extend(soup.select("div.tit5")[n].a.text for n in range(0,end))
    movie_point.extend(soup.find_all("td","point")[n].string for n in range(0, end))
    
    time.sleep(0.5)

li 태그가 클래스없이 막 섞여 있을 때 위치를 찾기 위해
for문으로 순번 찾기

n = 0
for each in soup.find_all("ul"):
print("=>"+str(n)+"=================")
print(each.text)
n += 1

가게이름 출력 후 다른 문자열이 섞여 있을 시

import re 모듈을 열어
re.split("나눌문자기준",문자열)

e.g>
import re
tmpstring = tmp_one.find(class="sammyListing").get_text()
re.split(("\n|\r\n"),tmp_string)

출력
['BLT', 'Old Oak Tap', 'Read more ']

날짜 가져오기
date = pd.date_range("2021.01.01", periods=100, freq="D")
21년 1월 1일 기준으로 100일치를 가져옴

날짜 표현 형식 지정
.strftime("%Y-%m-%d")

'2021-01-01'

matplotlib의 한글설정

from matplotlib import font_manager, rc

path = "C:/Windows/Fonts/malgun.ttf"

if platform.system() == "Darwin":
    rc("font", family="Arial Unicode MS")
   
elif platform.system() == "Windows":
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc("font",family=font_name)
   
else:
    print("Unknown sysyem.sorry")

💬코멘트

배운 수업 중 가장 재밌고 쉽게 따라갈 수 있는 수업이였던 편
BeautifulSoup으로 웹 크롤링하고 원하는 데이터를 추출, 그걸 다시 피봇테이블로 만들어 시각화까지 하니 너무 재미있었다. 이런 실습이 계속 되었으면 하는데, 다음주 테스트 생각하니 걱정이 앞선다.......😂

0개의 댓글