본문 바로가기
학부 자료/Python

[Python] 파이썬 기초 16/20, 웹 크롤링의 이해

by jackMK 2023. 11. 7.

<내용정리>

 

- 관련 파일

16일차_221223.py
0.00MB


- 본문

# p308 응용예제 3번
class BankError(Exception):
    def __init__(self, message):
        super().__init__(message)
class BankAccount:
    def __init__(self, acc_no, balance):
        self.acc_no = acc_no
        self.balance = balance
    def deposit(self, money):
        if money <= 0:
            raise BankError(f'{money}원 입금 불가')
    def withdraw(self, money):
        if money <= 0:
            raise BankError(f'{money}원 출금 불가')
        if money > self.balance:
            raise BankError(f'잔액 부족')
        self.balance -= money
        return money
    def transfer(self, your_acc, money):
        your_acc.deposit(self.withdraw(money))
    def inquiry(self):
        print(f'계좌번호: {self.acc_no}')
        print(f'통장 잔액: {self.balance}')

# 정상 상황
me = BankAccount('012-34-56789', 50000)
you = BankAccount('987-65-43210', 50000)
try:
    me.transfer(you, 5000)
except BankError as e:
    print(e)
finally:
    me.inquiry()
    you.inquiry()

### 섹션 18 : 웹 크롤링의 이해
## 일반 웹 페이지 정보 가져오기
import requests  # http  요청을 수행해서 웹페이지의 소스코드를 가져오는 라이브러리
url = 'https://www.naver.com'  # 가지고 올 웹페이지 주소
response = requests.get(url)
print(response.text)  # 결과를 텍스트로
print(f'응답코드 : {response.status_code}')  # 응답 코드 출력

## 검색 결과 웹 페이지 정보 가져오기
import requests
url = 'https://search.naver.com/search.naver'
param = {'query':'파이썬'}
response = requests.get(url, params=param)
print(response.text)
print(f'응답코드 : {response.status_code}')

## BeautifulSoup 메소드 사용하기 - find()
from bs4 import BeautifulSoup
html = '''
<div>
    네이버</a>
    카카오</a>
</div>
'''
soup = BeautifulSoup(html, 'html.parser')
print(soup.find('a'))  # 태그 가져오기
print(soup.find('a').text)  # 태그 내용
print(soup.find('a').get('href'))  # 속성값

## BeautifulSoup 메소드 사용하기 - find_all() >> 리스트형식
from bs4 import BeautifulSoup
html = '''
<ul>
    <li id = "movie">영화</li>
    <li>여행</li>
    <li>독서</li>
<ul>
'''
soup = BeautifulSoup(html, 'html.parser')
print(soup.find_all('li'))  # 태그(리스트형식)
print(soup.find_all('li')[0].text)  # 태그내용
print(soup.find_all('li')[1].text)
print(soup.find_all('li')[2].text)
print(soup.find_all('li')[0].get('id'))  # 속성값

## BeautifulSoup 메소드 사용하기 - class 속성
from bs4 import BeautifulSoup
html = '''
<div>
    <div class="gnb">뉴스</div>
    <div class="gnb">지도</div>
</div>
'''
soup = BeautifulSoup(html, 'html.parser')
print(soup.find_all('div', class_='gnb'))  # 태그(리스트형식)
print(soup.find_all('div', class_='gnb')[0].text)
print(soup.find_all('div', class_='gnb')[1].text)

## BeautifulSoup 메소드 사용하기 - id 속성
from bs4 import BeautifulSoup
html = '''
<div id="dontainer">
    <div id="left">왼쪽 영역</div>
    <div id="right">오른쪽 영역</div>
</div>
'''
soup = BeautifulSoup(html, 'html.parser')
print(soup.find('div', id='left'))  # 태그
print(soup.find('div', id='left').text)
print(soup.find('div', id='right').text)

# p325
import requests
from bs4 import BeautifulSoup
url = 'https://movie.naver.com/movie/bi/mi/basic.naver'
param = {'code':10016}
response = requests.get(url, params=param)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
review_list = soup.find_all('div', class_='score_reple')
for review in review_list:
    print(review.find('p').text.strip())  # strip : 공백이나 불필요한 글자 제거

# p326 1번
import requests
from bs4 import BeautifulSoup
url = 'https://movie.naver.com/movie/sdb/rank/rpeople.naver'
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
result_list = soup.find_all('div', class_='title')
movie_in = []
for result in result_list:
    movie_in.append(result.text.strip())

for person in movie_in:
    print(person)

# 2번
import requests
from bs4 import BeautifulSoup
url = 'https://movie.naver.com/movie/sdb/rank/rmovie.naver'
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
movie_list = soup.find_all('div', class_='tit3')
for idx, movie in enumerate(movie_list, start=1):
    print(f'{idx}위 : {movie.text.strip()}')

loading