안경잡이개발자

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request
from bs4 import BeautifulSoup


def main():

    sourcecode = urllib.request.urlopen("https://news.sbs.co.kr/news/newsflash.do?plink=GNB&cooper=SBSNEWS").read()
    soup = BeautifulSoup(sourcecode, "html.parser")

    list_href = []
    list_content = []

    for href in soup.find_all("div", class_="mfn_inner"):
        list_href.append("https://news.sbs.co.kr" + href.find("a")["href"])

    for i in range(0, len(list_href)):
        url = list_href[i]
        sourcecode = urllib.request.urlopen(url).read()
        soup = BeautifulSoup(sourcecode, "html.parser")
        list_content.append(soup.find("div", class_="text_area").get_text())

    print(list_href)
    print(list_content)


if __name__ == "__main__":
    main()






728x90
반응형

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request
from bs4 import BeautifulSoup


def main():

    for i in range(0, 10):

        url = "http://sports.donga.com/Enter?p=" + str((i * 20) + 1) + "&c=02"
        soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")

        spans = soup.find_all("span", class_="tit")
        for j in range(0, 20):
            print((i * 20) + j + 1, "번째 글:", spans[j + 3].get_text())

if __name__ == "__main__":
    main()


  또한 혹은 특정한 뉴스 기사 목록 페이지에서, 각 뉴스 기사 상세 페이지의 링크를 얻고 싶다면 다음과 같이 할 수 있습니다.


import urllib.request
from bs4 import BeautifulSoup


def main():

    url = "http://sports.donga.com/Enter?p=1&c=02"
    soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")

    spans = soup.find_all("span", class_="tit")
    for i in range(0, 20):
        print(spans[i + 3].find("a")["href"])

if __name__ == "__main__":
    main()


728x90
반응형

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request
from bs4 import BeautifulSoup


def main():

    url = "https://pann.nate.com/talk/344403021"
    soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")

    comments = []

    for i in soup.find_all("dd", class_="usertxt"):
        comments.append(i.get_text().strip("\n\t "))

    print(comments)


if __name__ == "__main__":
    main()


728x90
반응형

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request
from bs4 import BeautifulSoup

def main():
    url = "https://movie.naver.com/movie/bi/mi/review.nhn?code=156464"
    soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")

    ul = soup.find("ul", class_="rvw_list_area")
    for i in ul.find_all("li"):
        print(i.strong.get_text())

if __name__ == "__main__":
    main()



728x90
반응형

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request
from bs4 import BeautifulSoup

def main():
    soup = BeautifulSoup(urllib.request.urlopen("https://www.clien.net/service/group/community").read(), "html.parser")

    list_title = []
    list_nickname = []

    for i in soup.find_all("span", class_="subject_fixed"):
        list_title.append(i.get_text())

    for i in soup.find_all("span", class_="nickname"):
        list_nickname.append(i.get_text())

    print(list_title)
    print(list_nickname)

if __name__ == "__main__":
    main()


728x90
반응형

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request from bs4 import BeautifulSoup def main(): url = "http://www.kyeonggi.com/news/articleList.html?sc_section_code=S1N2&view_type=sm" soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser") list_title = [] list_content = []

# 기사 제목 파싱 for news_title in soup.find_all("div", class_="list-titles"): list_title.append(news_title.get_text())

# 기사 요약 파싱 for news_content in soup.find_all("p", class_="list-summary"): list_content.append(news_content.get_text()) print(list_title) print(list_content) if __name__ == "__main__": main()





728x90
반응형

728x90
반응형

  아래 소스코드를 이용하면 네이버 인기 검색어를 파싱할 수 있습니다. 왜냐하면 인기 검색어는 공통적으로 "ah_k"라는 클래스로 묶여 있기 때문입니다.


import urllib.request
from bs4 import BeautifulSoup

def main():
    sourcecode = urllib.request.urlopen("http://www.naver.com").read()
    soup = BeautifulSoup(sourcecode, "html.parser")
    list = []
    for naver_text in soup.find_all("span", class_="ah_k"):
        list.append(naver_text.get_text())
    print(list)

if __name__ == "__main__":
    main()


728x90
반응형

728x90
반응형

  파이썬(Python)의 Matplotlib 라이브러리는 선 그래프 말고도 정말 다양한 형태의 그래프를 지원합니다. 


※ 막대 그래프 ※


  막대 그래프틑 bar() 함수를 이용해서 그릴 수 있습니다.


import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-9, 10)
plt.bar(x, x ** 2)
plt.show()


  누적 막대 그래프 형태도 사용할 수 있습니다.


import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(10) # 아래 막대
y = np.random.rand(10) # 중간 막대
z = np.random.rand(10) # 위 막대
data = [x, y, z]
x_array = np.arange(10)
for i in range(0, 3): # 누적 막대의 종류가 3개
    plt.bar(
        x_array, # 0부터 10까지의 X 위치에서
        data[i], # 각 높이(10개)만큼 쌓음
        bottom=np.sum(data[:i], axis=0)
    )
plt.show()


※ 스캐터(Scatter) 그래프 ※


  이제 스캐터(Scatter) 그래프를 먼저 알아보도록 하겠습니다. 그래프를 그릴 때 3번째 인자로 마커의 종류를 입력하면, 알아서 스캐터 그래프로 인식합니다.


import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-9, 10)
y1 = x ** 2
y2 = -x
plt.plot(
    x, y1, "*",
    markersize=10,
    markerfacecolor="blue",
    markeredgecolor="red"
)
plt.show()


  혹은 바로 scatter() 함수를 이용해서 스캐터를 그릴 수 있습니다.


import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(10)
y = np.random.rand(10)
colors = np.random.randint(0, 100, 10)
sizes = np.pi * 1000 * np.random.rand(10)
plt.scatter(x, y, c=colors, s=sizes, alpha=0.7)
plt.show()


※ 히스토그램 그래프 ※


  히스토그램 그래프 또한 그릴 수 있습니다. 정규분포 그래프를 나타낼 때에도 많이 사용됩니다.


import matplotlib.pyplot as plt
import numpy as np

data = np.random.randn(10000)
plt.hist(data, bins=1000)
plt.show()


  이 때 bins 속성은 어느 정도 X 간격으로 히스토그램을 출력할 지를 설정하도록 해줍니다. 1000을 넘어서면 다소 그래픽 처리에 시간이 소요될 수 있습니다.

728x90
반응형

728x90
반응형

  파이썬(Python)에서 Matplotlib 라이브러리는 다양한 데이터를 시각화할 수 있도록 도와주는 라이브러리입니다.


  가장 간단한 예제로 (1, 1), (2, 2), (3, 3)을 선으로 잇는 그래프를 만들어보도록 하겠습니다.

import matplotlib.pyplot as plt x = [1, 2, 3] y = [1, 2, 3] plt.plot(x, y) plt.title("My Plot") plt.xlabel("X") plt.ylabel("Y") plt.show()


  그래프를 그림 형태로 저장하기 위해서는 plt.savefig(그림 파일) 명령어를 이용하여 저장할 수 있습니다. 또한 하나의 그림 파일에 여러 개의 그래프가 들어가도록 코딩을 할 수도 있습니다.


import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, np.pi * 10, 500) # PI * 10 넓이에, 500개의 점을 찍기 fig, axes = plt.subplots(2, 1) # 2개의 그래프가 들어가는 Figure 생성 axes[0].plot(x, np.sin(x)) # 첫 번째 그래프는 사인(Sin) 그래프 axes[1].plot(x, np.cos(x)) # 두 번째 그래프는 코사인(Cos) 그래프 fig.savefig("sin&cos.png")


※ 선 그래프 ※


  이제 선 그래프를 그리는 방법에 대해서 알아보도록 하겠습니다. 가장 간단한 예제부터 알아봅시다.


import matplotlib.pyplot as plt import numpy as np x = np.arange(-9, 10) y = x ** 2 plt.plot(x, y, linestyle=":", marker="*") plt.show()


  라인 스타일로는 '-', ':', '-.', '--' 등이 사용될 수 있습니다. 또한 X축 및 Y축에서 특정 범위를 자를 수도 있습니다.


import matplotlib.pyplot as plt import numpy as np x = np.arange(-9, 10) y = x ** 2 plt.plot(x, y, linestyle="-.", marker="*") plt.xlim(-5, 5) plt.show()


  하나의 사진에 두 개의 라인 그래프를 그려 보겠습니다.


import matplotlib.pyplot as plt import numpy as np x = np.arange(-9, 10) y1 = x ** 2 y2 = -x plt.plot(x, y1, linestyle="-.", marker="*", color="red", label="y = x * x") plt.plot(x, y2, linestyle=":", marker="o", color="blue", label="y = -x") plt.xlabel("X") plt.ylabel("Y") plt.legend( shadow=True, borderpad=1 ) plt.show()




728x90
반응형

728x90
반응형

※ Data Frame의 마스킹 ※


  Pandas의 Data Frame 라이브러리는 Numpy처럼 마스킹 연산이 가능합니다.


import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(1, 10, (2, 2)), index=[0, 1], columns=["A", "B"])
print(df) # 데이터 프레임 출력하기
print(df["A"] <= 5) # 컬럼 A의 원소가 5보다 작거나 같은 데이터 추출
print(df.query("A <= 5 and B <= 8")) # 컬럼 A의 원소가 5보다 작고, 컬럼 B의 원소가 8보다 작은 데이터 추출


※ 함수로 데이터 변경하기 ※


  apply()라는 함수를 이용하면 특정한 함수를 공통적으로 적용할 수 있습니다.


import numpy as np
import pandas as pd

df = pd.DataFrame([[1, 2, 3, 4], [1, 2, 3, 4]], index=[0, 1], columns=["A", "B", "C", "D"])
print(df)
df = df.apply(lambda x: x + 1)
print(df)

def addOne(x):
    return x + 1

df = df.apply(addOne)
print(df)


  또한 replace() 함수도 원소의 값을 바꿀 때 매우 많이 사용됩니다.


import pandas as pd

df = pd.DataFrame([
    ['Apple', 'Apple', 'Carrot', 'Banana'],
    ['Durian', 'Banana', 'Apple', 'Carrot']],
    index=[0, 1],
    columns=["A", "B", "C", "D"])
print(df)
df = df.replace({"Apple": "Airport"})
print(df)


※ 데이터 그룹화 ※


  Pandas는 데이터를 그룹화할 수 있도록 groupby() 함수를 제공하고 있습니다.


import pandas as pd

df = pd.DataFrame([
    ['Apple', 7, 'Fruit'],
    ['Banana', 3, 'Fruit'],
    ['Beef', 5, 'Meal'],
    ['Kimchi', 4, 'Meal']],
    columns=["Name", "Frequency", "Type"])
print(df)
print(df.groupby(['Type']).sum())


  더불어 aggregate() 함수를 이용하면 보다 자유자재로 그룹화를 다룰 수 있습니다.


import numpy as np
import pandas as pd

df = pd.DataFrame([
    ['Apple', 7, 5, 'Fruit'],
    ['Banana', 3, 6, 'Fruit'],
    ['Beef', 5, 2, 'Meal'],
    ['Kimchi', 4, 8, 'Meal']],
    columns=["Name", "Frequency", "Importance", "Type"])
print(df)
print(df.groupby(["Type"]).aggregate([min, max, np.average]))


  그룹에 대한 필터링(Filtering)을 걸고자 한다면 다음과 같이 filter() 함수를 이용할 수 있습니다. 저는 빈도수(Frequency) 평균이 5 이상인 타입(Type)만 추출하도록 소스코드를 작성해보았습니다.


import pandas as pd

df = pd.DataFrame([
    ['Apple', 7, 5, 'Fruit'],
    ['Banana', 3, 6, 'Fruit'],
    ['Beef', 5, 2, 'Meal'],
    ['Kimchi', 4, 8, 'Meal']],
    columns=["Name", "Frequency", "Importance", "Type"])

def my_filter(data):
    return data["Frequency"].mean() >= 5

df = df.groupby("Type").filter(my_filter)
print(df)


  또한 가장 단순한 형태의 필터링은 다음과 같이 임의의 속성으로 데이터를 추출하는 것입니다.


import pandas as pd

df = pd.DataFrame([
    ['Apple', 7, 5, 'Fruit'],
    ['Banana', 3, 6, 'Fruit'],
    ['Beef', 5, 2, 'Meal'],
    ['Kimchi', 4, 8, 'Meal']],
    columns=["Name", "Frequency", "Importance", "Type"])

df = df.groupby("Type").get_group("Fruit")
print(df)


  더불어 apply() 함수를 이용해 임의의 함수를 적용할 수도 있습니다. 저는 각 데이터가 평균 값에 비해서 어느 정도 격차가 나오는지 그룹별로 확인해보는 소스코드를 작성했습니다.


import pandas as pd df = pd.DataFrame([ ['Apple', 7, 5, 'Fruit'], ['Banana', 3, 6, 'Fruit'], ['Beef', 5, 2, 'Meal'], ['Kimchi', 4, 8, 'Meal']], columns=["Name", "Frequency", "Importance", "Type"]) df["Gap"] = df.groupby("Type")["Frequency"].apply(lambda x: x - x.mean()) print(df)


※ 다중화 ※


  Pandas에서는 데이터를 다중화할 수도 있습니다. 인덱스를 여러 개로 구성하는 방법은 다음과 같습니다. 열 또한 마찬가지의 방법을 이용해서 다중 인덱스를 구성할 수 있습니다.


import numpy as np
import pandas as pd

df = pd.DataFrame(
    np.random.randint(1, 10, (4, 4)),
    index=[['1차', '1차', '2차', '2차'], ['공격', '수비', '공격', '수비']],
    columns=['1회', '2회', '3회', '4회']
)

print(df)
print(df[["1회", "2회"]].loc["2차"])


※ 피벗 테이블 ※


  피벗 테이블(Pivot Table)은 흔히 엑셀에서 표 데이터를 재구성할 때 사용하는 기능입니다. Pandas는 이러한 피벗 테이블 기능을 제공합니다. 저는 기존의 데이터에서 인덱스로 'Importance'를, 열로 'Type'을 두고 빈도수를 출력하는 프로그램을 작성하고자 합니다. 동일한 Importance 값이 있다면 가장 큰 빈도수가 출력되도록 합니다.


import numpy as np
import pandas as pd

df = pd.DataFrame([
    ['Apple', 7, 5, 'Fruit'],
    ['Banana', 3, 6, 'Fruit'],
    ['Coconut', 2, 6, 'Fruit'],
    ['Rice', 8, 2, 'Meal'],
    ['Beef', 5, 2, 'Meal'],
    ['Kimchi', 4, 8, 'Meal']],
    columns=["Name", "Frequency", "Importance", "Type"])

df = df.pivot_table(
    index="Importance", columns="Type", values="Frequency",
    aggfunc=np.max
)
print(df)



728x90
반응형