Study Web Development

3월 29일

이전으로

Python

웹 크롤링

BeautifulSoup

뉴스
  1. 새 파일 s03_crawling3.py 생성
import urllib.request as ur
from bs4 import BeautifulSoup as bs

# 데이터를 읽어들일 URL
news = 'https://news.daum.net'
soup = bs(ur.urlopen(news).read(), 'html.parser')
print(soup)
print('-'*3)

# 머리 기사 제목 추출하기
print(soup.find_all('div',{'class':'item_issue'}))
print('-'*3)

# 반복문으로 기사 제목 모두 추출하기
for i in soup.find_all('div',{'class':'item_issue'}):
    print(i.text)
print('-'*3)

# <img> 태그에 접근
for i in soup.find_all('img')[:5]:
    # get(): 지정한 속성의 값 반환
    print(i.get('src'))
print('-'*3)

# <a> 태그만 추출
for i in soup.find_all('a')[:5]:
    print(i.get('href'))

# 웹에서 읽어온 정보를 파일에 저장
f = open('links.txt','w')
# 이슈 기사의 링크만 추출
for i in soup.find_all('div',{'class':'item_issue'}):
    f.write(i.find_all('a')[0].get('href') + '\n')
print('작업을 완료했습니다')
f.close()
  1. 새 파일 s04_crawling4.py 생성
import urllib.request as ur
from bs4 import BeautifulSoup as bs

article1 = 'https://v.daum.net/v/20220329101906471'
soup = bs(ur.urlopen(article1).read(),'html.parser')

# 기사 본문을 파일로 저장하기
f = open('article_1.txt', 'w', encoding='UTF-8')
for i in soup.find_all('p'):
    f.write(i.text)
print('작업을 완료했습니다')
f.close()
  1. 새 파일 s05_crawling5.py 생성
import urllib.request as ur
from bs4 import BeautifulSoup as bs

url = 'https://news.daum.net'
soup = bs(ur.urlopen(url).read(), 'html.parser')

# 기사 제목, 본문, 하이퍼 링크를 파일로 저장하기
f = open('article_total.txt', 'w', encoding='UTF-8')
for i in soup.find_all('div',{'class':'item_issue'}):
    try:
        # 제목을 추출해서 파일을 씀
        f.write(i.text + '\n')
        # URL 주소를 추출해서 파일에 씀
        link = i.find_all('a')[0].get('href')
        f.write(link + '\n')
        # URL 주소에 해당하는 웹 문서를 열어 새 BeautifulSoup 객체로 저장
        soup2 = bs(ur.urlopen(link).read(), 'html.parser')
        # p 태그에서 본문만 추출
        for j in soup2.find_all('p'):
            f.write(j.text)
    except:
        pass
print('작업을 완료했습니다')
f.close()

분석

NumPy

pip install numpy
ndarray
생성, 초기화, 재구성
  1. 새 PyDev 프로젝트 ch11-numpynpandas 생성하고 새 파일 s01_num.py 생성
import numpy as np

data = np.array([10,20,30,40,50])
print(type(data))
print(data)
print('-'*3)

print(data.dtype) # int32는 32비트 정수형을 의미
print(data[1])
print('-'*3)

data = np.random.randn(2,3)
print(data)

print(data.shape)
print(data.dtype)

data1 = np.zeros(10)
print(data1)
print(data1.dtype)
print('-'*3)

data2 = np.zeros((2,3))
print(data2)
print(data2.dtype)
print('-'*3)

data3 = np.zeros((2,3),dtype=np.int32)
print(data3)
print(data3.dtype)
print('-'*3)
  1. 새 파일 s02_num2.py 생성
import numpy as np

data1 = np.ones(8)
print(data1)
print(data1.dtype)
print('-'*3)

data = np.arange(10,121,10) # 10부터 120까지, 10씩 증가
print(data)
print(data.dtype)
print(data[2])
print(data[5:8]) # 인덱스 5부터 7까지 출력
print('-'*3)

data[7:10] = 800 # 인덱스 7부터 9에 800을 저장
print(data)
print('-'*3)

data2 = data.reshape(2,6)
print(data2)
  1. 새 파일 s03_num3.py 생성
import numpy as np

# 2차원 배열 생성
data = np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]])
print(data)
print('-'*3)

print(data[2][3])
print('-'*3)

print(data[0][1:])
print('-'*3)

print(data[0])
print('-'*3)

# data[[1,2]]는 data에서 인덱스 1,2인 행의 데이터 값을 가짐
print(data[[1,2]])
print('-'*3)

# data[1]은 인덱스 1의 행 데이터를 의미
data[1] = 100
print(data)
print('-'*3)

# data[:]은 data의 모든 요소를 의미
data[:] = 200
print(data)
연산
  1. 새 파일 s04_num4.py 생성
import numpy as np

data = np.array([[80,78,90,93],[65,87,88,75],[98,100,68,80]])
print(data.sum())
print(data.mean())
print(data.max())
print(data.min())
print('-'*3)

# 각 열(axis=0)의 요소 값 중 최댓값을 구해서 얻은 배열을 반환
print(data.max(axis=0))
# 각 행(axis=1)의 요소 값 중 최댓값을 구해서 얻은 배열을 반환
print(data.max(axis=1))
print('-'*3)

# 배열 객체 data에서 각 열에 대해 요소가 최댓값을 가지는 인덱스 배열 반환
index1 = np.argmax(data,axis=0)
print(index1)
# 배열 객체 data에서 각 행에 대해 요소가 최솟값을 가지는 인덱스 배열 반환
index2 = np.argmin(data,axis=1)
print(index2)
가공
  1. 새 파일 s05_num5.py 생성
import numpy as np

a = np.arange(10) # 0~9를 요소로 하는 배열 객체 생성
print(a)
print('-'*3)

# 배열 a의 인덱스 3의 요소에 10의 값을 삽입
b = np.insert(a,3,10)
print(a)
print(b)
print('-'*3)

x = np.array([[1,1,1],[2,2,2],[3,3,3]])
print(x)
print('-'*3)

# 배열 x의 열 방향으로 인덱스 1의 요소에 모든 요소 값이 10인 행을 하나 삽입
y = np.insert(x,1,10,axis=0)
print(y)
print('-'*3)

# 배열 x의 행 방향으로 인덱스 1의 요소에 모든 요소 값이 10인 행을 하나 삽입
z = np.insert(x,1,10,axis=1)
print(z)
print('-'*3)

pandas

pip install pandas
Series
  1. 새 파일 s06_pandas.py 생성
import pandas as pd

obj = pd.Series([5,-4,7,0,10])
print(obj)
print('-'*3)

obj = pd.Series([8,-20,-3,13,2])
print(obj.values)
print(obj.index)

# 인덱스 2에 해당되는 요소 값 호출
print(obj[2])
print('-'*3)

# 0부터 시작하는 숫자 인덱스 외에 문자열 인덱스를 설정
obj = pd.Series([10,20,30,40,50],index=['a','b','c','d','e'])
print(obj)
print(obj.index)

print(obj['c'])
print('-'*3)

print(obj[['d','a']])
print('-'*3)

print(obj[1:4]) # 내부적으로 숫자 인덱스가 있어서 숫자로도 호출 가능

다음으로