이번 장에서는 뷰티풀솝의 중요한 부분을 설명드리겠습니다.

 

바로 소스코드를 보겠습니다. 여기서 중요한 것은 .find입니다. 

import bs4
html_str = "<html><div>hello</div></html>"  

bs_obj = bs4.BeautifulSoup(html_str, "html.parser")

print(type(bs_obj))  #bs_obj 변수 타입 출력
print(bs_obj)  #<html> <div> ~~ 이부분 출력
print(bs_obj.find("div")) # 여기서 .find는 찾는다라는 뜻으로 해석하시면 됩니다. 즉, div를 찾는다.  

결과 

print의 결과

다음 예시를 보겠습니다. 

import bs4 html_str =
""" <html>
<body>
      <ul> <li>hello</li>
             <li>bye</li>
             <li>welcome</li>
       </ul>
</body
</html> """


bs_obj = bs4.BeautifulSoup(html_str ,"html.parser")
ul = bs_obj.find("ul")  #ul를 찾습니다.
li = ul.find("li") print(li)  # ul안에 li라는 것을 찾습니다.

#결과는 어떨까요?  분명 <li>hello</li>라는 것이 뜰겁니다. 
#저기서 li라는 곳이 거슬리지 않나요? 지구에서 소멸하는 방법^^을 알려드리겠습니다.
# .text속성을 사용하면 됩니다. 

print(li.text)

#findAll을 써보겠습니다. findAll은 모든 요소를 리스트[] 형태로 추출해주는 기능입니다.
li1 = ul.findAll("li")
print(li1[1]) # bye를 뽑기위한 인덱스 li1[0]은 뭐죠? <hello>입니다. 

# 분명 위의 print는 <li> bye</li>라는 결과가 나올 것입니다. <li>라는 부분을 없앨려면 어떻게 해야되죠? 

print(li[1].text) 

결과 

결과 

 

이런 식으로 결과가 뜨게 됩니다. 좀 지루하죠? 개념부터 차근차근이 하기에는 너무 많기 때문에 다음 절에는 점프해서 재밌는 것을 해보겠습니다. 하지만, beautifulsoup의 속성만 알아두면 좋을 것 같습니다. 

 

  • .find() 특정 한 곳을 찾는다.
  • .text  ex) print(li.text) html태그를 지워버린다. 위에 참조
  • .findAll()  모든 요소를 리스트[] 형태로 추출해주는 기능
  • 뷰티풀솝을 사용하려면 HTML지식이 있어야 일단 재미를 위해서 해봅시다. 

BeautifulSoup은 뭘까요?

뷰티풀솝데이터를 추출하는 데 필요한 기능이 들어 잇는 라이브러리입니다. 
그러면 라이브러리? 저건 뭔데 ? 

라이브러리(Library)

이미 만들어져 있는 것을 가져다 사용한다라고 보시면 됩니다. 예를 들어서 마우스를 조립한다는 가정하에 마우스를 처음부터 조립하고 만들어서 사용하는 게 아니라 누가 만들어놓은 것을 판매한다고 생각하시면 좋을 것 같습니다.

BeautifulSoup 설치

처음에 윈도우(모양) + R 을 눌릅니다. 눌른후 cmd를 입력합니다.

윈도우(모양) + R 
pip install beautifulsoup4 설치 

pip install beautifulsoup4 를 합니다. 저는 이미 설치해놔서 설치할 것이 없습니다. 

 

#오류 만약 오류가 뜨게 된다면 파이썬을 설치를 안 했다던가, 환경변수를 설정 안 하셨거나 둘 중에 하나입니다.

 

이상으로 beautifulsoup설치에 대해 마치겠습니다. 

써 보면서 공부하는 걸 추천드립니다. 

 

이 장에서는 네이버 첫 페이지의 데이터를 받아오는 크롤링을 한 번 보여드리겠습니다. 

 

파이썬을 실행해 봅시다. 파이썬을 설치 안 하신 분들은 파이썬 3.x 버전을 설치하시고 오시길 바랍니다. 파이참도 가능합니다. 

 

크롤링을 하는 프로그램을 '크롤러'라고 합니다. 

 

네이버 전체 크롤링 하기 

 

결과는 다음과 같습니다. 

네이버 크롤링

이 텍스트를 웹 브라우저에서 해석해서 초록색으로 배치가 잘 된 네이버의 화면을 우리에게 보여주는데요 웹은 대부분 HTML형태로 되어 있씁니다. HTML 텍스트를 받아온 다음에 여기에서 우리가 필요한 정보들을 파싱할 수 있습니다. 

 

다음 내용은 뷰티풀솝 사용 해서 파싱하는 것을 보여드리겠습니다. 

1. 크롬을 설치합니다. 

-> 크롬을 설치하는 이유는 크롬에 있는 개발자 도구가 크롤러를 만들 때 필요한 도구이기 때문입니다. 만약 다른 브라우저를 사용하신다고 하셔도 무관합니다. 

 

2. Urllib 설치합니다. 

->> urllib는 기본적으로 설치 되어 있습니다. 그래서 파이썬이 설치 되어 있다면 바로 import를 할 수 있습니다. 

 

3. 네이버 첫 페이지 받아오기 

naver.com에 접속을 합니다. 오른쪽 마우스 -> 페이지 소스 보기를 합니다. 그러면 밑에 사진 처럼 나옵니다.

네이버 페이지 소스 보기

이런 게 HTML형식 입니다. 웹 브라우저는 텍스트 형태로 되어 있는 HTML문서를 읽어서 우리가 보기 좋게 그려 주는 렌더링 (rendering)기능을 하는 프로그램입니다.

 

크롤링을 한다는 것은 HTML형태의 데이터를 받아오는 것을 말합니다. 받아온 데이터에서 내가 필요한 것을 뽑아내는 것을 '파싱'이라고 합니다. 

 

즉, 크롤링, 파싱, 스크래핑이 '인터넷에서 무언가 데이터를 받아서 필요한 정보만 뽑아 내는 것'이라고 생각하시면 됩니다. 

 

그러면 무슨 말을 쓰라는거야? 라는 생각을 하실 수 있습니다.

 

-> 저는 데이터를 받아오는 것을 '크롤링' 

-> 받아온 데이터에서 필요한 정보를 뽑아내는 것을 '파싱' 

 

이라고 결론 짓겠습니다. 

HTTP(Hyper Text Transfer Protocol)란? 

쉽게 말해서 '약속, 규칙, 규약' 이라는 뜻입니다. 
예를 들어서 A라는 친구와 B라는 친구와 전화를 할 때 이름, 전화번호 등을 이용해 전화를 걸 거나 받을 때입니다. 

URL(Uniform Resource Locator)란? 

인터넷 주소입니다. 저희가 https://www.naver.com라는 곳을 들어갈 때 https://www.naver.com라는 게 URL입니다. 

HTML(Hyper Text Markup Language)란?

네이버로 예를 들겠습니다. 네이버를 보시면 연관검색어, 검색어, 뉴스 등이 보이실겁니다. 그런 자체가 HTML입니다. 더 정확하게 말씀드려서 인터넷 속성에서-> 개발자 도구 -> 소스 보기 or 오른쪽 클릭해서 소스보기가 보이실겁니다. 그런 자체가 HTML입니다.

이상포스터를 마치겠습니다.

안녕하세요~~ 코딩을 하면서 어떻게 하면 더 재밌 게 할 수 있을까? 라는 생각을 했다가 야구게임을 만들면 재밌을 것 같다는 생각을 해서 야구게임을 만들게 되었습니다.

 

소스코드입니다.

 

#include <iostream>

#include <time.h>  // 랜덤 함수  사용

 

using namespace std;

 

int main(void)

{

int baseball[10] = { };

 

 

 

}#include 
#include  // 랜덤함수 사용
using namespace std;

int main()
{
int baseball[10] = {};

for(int i=0; i<9; i++)
{
baseball[i] = i+1;
}

srand((unsigned int) time(0));
int itemp, idx1, idx2;
for(int i=0; i<100; i++)
{
idx1[i] = rand %9;
idx2[i] = rand % 9;
itemp = basball[idx1];
baseball[idx1] = baseball[idx2];
baseball[idx2] = itemp;
}
int istrlike = 0;
int count = 0;
int iBall = 0;
in iplayer[3] = {};
while(true) 
{
cout<<"3개의 숫자를 입력하시오 <<endl;
cin >> iplayer[0] >> iplayer[1] >> iplayer[2];
if(iplayer[0] < 1 || iplayer[0] > 9 || iplayer[1] < 1 || iplayer[1] > 9 || iplayer[2] < 1 || iplayer[2] > 9)
{ break; }
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
if(baseball[i] == iplayer[j]){
if( i == j) { stlike++; }
else { iBall++; } 


} // end i 
} // end j 
}
count++;
if(istrlike == 3) { cout<<count<<"번 만에 맞췄씁니다"<<endl;  
else{cout << "strlike : "<<istrlike<<"ball : "<<iBall<<endl;  }

istlike = 0; iBall =0; 
}
return 0;

}

 

이상포스터를 마치겠습니다.

 

1. 블록의 구조와 식별자

블록은 링크 구조를 가지며, 새로 추가된 블록은 이 링크의 끝에 위치하게 된다. 각 블록은 자신의 앞에 위치한 블록(부모 블록)으로 연결되는 링크를 갖고 있고, 이 링크를 거슬러 올라가면 첫 번째 블록인 genesis 블록에 다다를 수 있다.

블록에는 거래나 부모 블록으로 이어지는 링크 같은 정보가 저장되어 있다.

 

[표1. 블록의 구조]

 

필드

필드 크기(바이트)

설명

Block Size

4

다음 필드부터 블록 끝가지 데이터 크기(바이트)

Block Header

80

블록 헤더 정보

Transaction Counter

1~9

블록에 포함된 거래의 수

Transaction

가변적

거래의 목록

[표2. 블록 헤더의 구조]

 

필드

필드 크기(바이트)

설명

Version

4

소프트웨어 혹은 프로토콜 버전 정보

Previous Block Hash

32

부모 블록의 해시값

Merkle Root

32

머클 트리 루트의 해시값

Timestamp

4

블록을 생성한 시간(Unixtime)

Difficulty Target

4

블록을 생성할 때 PoW의 난이도

Nonce

4

PoW에서 사용하는 카운터

블록체인 안에서 어떤 블록을 특정하려면 블록 해시와 블록 높이라는 값을 사용하는데, 이들 값을 블록 식별자라고 한다.

 

블록 해시는 블록 헤더를 SHA-256 알고리즘으로 2번 연속 해싱한 값으로, 모든 블록이 서로 다른 값을 갖는다. 블록 해시는 필요에 따라 노드가 계산하며 블록 내에 직접 저장되지는 않는다.

 

genesis 블록의 블록 높이는 0이고 그 뒤로 블록이 덧붙을 때마다 1씩 증가한다. 블록 해시는 특정 블록을 식별할 수 있는 유일 식별자인 데 비해 블록을 특정할 수 없는 경우도 있다.

 

블록에는 부모 블록으로 이어지는 링크가 있다. 하나 이상의 자식 블록을 갖는 경우도 있다.

 

 

2. 블록 안의 거래 검색하기

블록체인 네트워크에 참여하는 노드라고 해도 과거 모든 블록을 저장하지 않는다. 스마트폰이나 태블릿 같은 노드에는 저장 용량이 부족하여 모든 블록을 저장할 수 없다.

이러한 이유를 방지하기 위한 SPV(블록 헤더만 저장하는)가 있다. 과거의 모든 블록으로 구성된 블록체인을 풀블록체인이라 부르는데, 블록헤더만 저장하면 풀블록체인에 비해 1/1000 정도로 크키가 줄어들기 때문에 필요한 저장 용량도 대폭 줄어든다.

 

SPV노드에서 특정한 거래가 블록에 포함되어 있는지 확인하려면 어떻게 해야 할까?

-> 머클트리(Merkle tree)라는 것을 사용한다.

머클트리는 다음장으로 ^___^

 

이상 포스터를 마치겠습니다.

 

머클 트리는 대규모 데이터를 효율적으로 요약하고 검증하는 이진 트리 기반의 데이터 구조로, 블록 안에 저장된 거래 모두에 대해 디지털 지문을 만들어서 어떤 거래가 블록에 저장되어 있는지 검색할 수 있도록 해준다.

 

머클 트리를 만드는 방법?

이진 트리에 포함된 잎 노드 쌍을 연결하고, 이에 대한 해시값을 계산(SHA-256 이중 해시)하는 과정을 해시값이 하나가 될 때까지 재귀적으로 반복하면 된다. 이 과정을 거쳐 마지막에 남은 해시값이 블록 헤더의 머클 루트(Merkle Root)이다.

 

먼저 [그림 1]과 같이 각 거래의 해시값을 모은다. 예를 들면 거래 A의 해시값은 HA이다. 그 다음, 인접한 잎 노드의 해시값과 연결된 해시값을 가져와서 새로운 노드를 생성한다. 이런 과정을 반복하며 마지막에 남는 노드가 머클 루트이며 그림에서 HABCD가 된다.

그림 1. 머클 트리를 구축하는 과정

머클 트리는 이진 트리이므로 거래 수가 짝수

만약 거래 수가 홀수라면 거래를 하나 복제하여 짝수로 만들면 된다 .

[그림 1.]에서 거래 Tx D가 없는 경유를 예로 들면 [그림 1]과 같이 거래 D자리를 거래 C로 바꾸는 것과 같다.

 

 

이상포스터를 마치겠습니다.

+ Recent posts