선언
import
from bs4 import BeautifulSoup
page = open("../../data/03.web_data/03.testfile.html","r").read()
page
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 requestsimport requests
from urllib.requests.Request
from bs4 import BeautifulSoupurl = "주소"
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.status2)
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, Requesthtml = "https://ko.wikipedia.org/wiki/{search_words}"
req = Request(html.format(searchwords=urllib.parse.quote("여명의눈동자")))
response=urlopen(req)
response.statusurllib.parse.quote()
글자를 url로 인코딩하는 매서드
상대주소 절대주소로 만들기
from urllib.parse import urljoinurljoin(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으로 웹 크롤링하고 원하는 데이터를 추출, 그걸 다시 피봇테이블로 만들어 시각화까지 하니 너무 재미있었다. 이런 실습이 계속 되었으면 하는데, 다음주 테스트 생각하니 걱정이 앞선다.......😂