ejyoo's 개발 노트

python 웹 크롤링을 사용한 데이터 추출하기 본문

BackEnd/Python

python 웹 크롤링을 사용한 데이터 추출하기

ejyoovV 2021. 5. 11. 21:13

사전 준비사항

MySQL DB를 설치하고 HeidiSQL을 설치하여 Table을 생성해야 한다.

테이블 제목 : test

컬럼 : [one_td_Title - int / one_td_txt - varchar / two_td_txt - varchar]

 

HTML 구성

HTML 파일 <table> 내 다음과 같은 코드를 작성한다.

<tr>
	<td class="one"><a href="#" title="123456789">첫번째 td</a></td>
	<td align="right">두번째 td</td>
	<td align="right"><span class="three">세번째 td</span></td>
</tr>

 

크롤링 전 도달해야하는 결과

1. '첫번째 td' 텍스트 출력

2. 첫번째 td의 title인 '123456789' 출력

3. '두번째 td' 텍스트 출력

 

크롤링 규칙

1. 1번을 출력하기 위해서는 class 가 one 인것을 찾은 뒤 텍스트를 가져온다.

2. 2번을 출력하기 위해서는 class 가 one 인것을 찾은 뒤 title 속성을 조회하여 그것의 값을 가져온다.

3. 3번을 출력하기 위해서는 class 가 one 인 첫번째 td를 찾은 뒤 그 다음 엘리먼트를 조회하여 텍스트를 가져온다.

 

크롤링 전 참고사항

크롤링할 때 HTML 을 사용하여 접근하는 경우

태그 또는 속성으로 찾기 때문에 방법이 여러가지 이다.

웬만한건 해당 기술의 document를 참고한다.

www.crummy.com/software/BeautifulSoup/bs4/doc.ko/#a-string

 

뷰티플수프 문서 — 뷰티플수프 4.0.0 문서

find_all() 메쏘드는 태그의 후손들을 찾아서 지정한 여과기에 부합하면 모두 추출한다. 몇 가지 여과기에서 예제들을 제시했지만, 여기에 몇 가지 더 보여주겠다: 어떤 것은 익숙하지만, 다른 것

www.crummy.com

 

예제코드

import urllib.request
from bs4 import BeautifulSoup
import pymysql

def insertTest(tups):
    conn = pymysql.connect(host='localhost', user='root', password='java',
                           db='python', charset='utf8')
     
    curs = conn.cursor() 
    
    sql = """insert into test(
            one_td_Title
            ,one_td_txt
            ,two_td_txt
            )
         values (%s, %s, %s)"""
    cnt = curs.executemany(sql, tups)
    
    conn.commit()
    conn.close()
    return cnt

conn = pymysql.connect(host='localhost', user='root', password='java',
                       db='python', charset='utf8')

url = "웹 사이트 경로 입력"
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
    curs = conn.cursor()
    response_body = response.read()
    
    html = response_body.decode('euc-kr') 
    soup = BeautifulSoup(html, 'html.parser') 
    
    items = soup.select(".one")
    tuts = []
    for i,item in enumerate(items):
        print(item)
        one_td_Title = item.a['title']
        print(one_td_Title)
        one_td_txt = item.a.get_text()
        print(one_td_txt)
        two_td_txt = item.find_next_sibling("td").get_text().replace(",","")
        print(two_td_txt)
    
        tuts.append((
            one_td_Title,
            one_td_txt,
            two_td_txt,
        ))

    cnt = insertTest(tuts)
    print("cnt : ",cnt)
else:
    print("Error Code:" + rescode)

 

원하는 태그에 도달하기 위한 여러가지 예제

	# one_td_txt : tag
    #items = soup.select_one(".st2")
    #one_td_txt_item = items.a
    #one_td_txt = one_td_txt_item.get_text()
    #print(one_td_txt)
    
    # one_td_txt : contents
    #items = soup.select_one(".st2")
    #one_td_txt_item_tag_arr = items.contents
    #one_td_txt_item_tag = one_td_txt_item_tag_arr[0]
    #one_td_txt_item_arr = one_td_txt_item_tag.contents
    #one_td_txt = one_td_txt_item_arr[0]
    #print(one_td_txt)
    
    # one_td_txt : children
    #items = soup.select_one(".st2")
    #one_td_txt_item_tag_arr = items.contents
    #one_td_txt_item_tag = one_td_txt_item_tag_arr[0]
    #for one_td_txt_item in one_td_txt_item_tag.children:
    #    print(one_td_txt_item)
    
    # one_td_txt : descendants
    #items = soup.select_one(".st2")
    #for one_td_txt_item in items.descendants:
    #    print(one_td_txt_item)
    
    # one_td_txt : children 과 descendants 비교
    #items = soup.select_one(".st2")
    #print(len(list(items.children)))
    #print(len(list(items.descendants)))
    
    # one_td_txt : next_element [<> previous_elements]
    #items = soup.select_one(".st2")
    #one_td_txt_item_tag_arr = items.contents
    #one_td_txt_item_tag = one_td_txt_item_tag_arr[0]
    #one_td_txt = one_td_txt_item_tag.next_element
    #print(one_td_txt)
    
    # one_td_txt : next_sibling : a 태그 옆 출력 : 아무것도 없음.
    #items = soup.select_one(".st2")
    #one_td_txt_item_tag_arr = items.contents
    #one_td_txt_item_tag = one_td_txt_item_tag_arr[0]
    #one_td_txt = one_td_txt_item_tag.next_sibling
    #print(one_td_txt)
    
    # one_td_txt : find_all(tag)
    #items = soup.select_one(".st2")
    #one_td_txt_tag_arr = items.find_all("a")
    #one_td_txt_tag = one_td_txt_tag_arr[0]
    #one_td_txt = one_td_txt_tag.get_text()
    #print(one_td_txt)
    
    #one_td_txt : 태그 호출
    #items = soup.select_one(".st2")
    #one_td_txt_tag_arr = items("a")
    #one_td_txt_tag = one_td_txt_tag_arr[0]
    #one_td_txt = one_td_txt_tag.get_text()
    #print(one_td_txt)
    
    # one_td_txt : find
    #items = soup.select_one(".st2")
    #one_td_txt_tag = items.find("a")
    #one_td_txt = one_td_txt_tag.get_text()
    #print(one_td_txt)
    

    # one_td_Title
    #items = soup.select_one(".st2")
    #print(items)
    #one_td_Title_item = items.a
    #print(one_td_Title_item)
    #one_td_Title = one_td_Title_item['title']
    #print(one_td_Title)
    

    # two_td_txt : string
    #items = soup.select_one(".st2")
    #test = items.a.next_element.next_element.next_element.string
    #print(test)
    
    # two_td_txt : find_next_sibling()
    #items = soup.select_one(".st2")
    #two_td_txt_tag = items.find_next_sibling("td")
    #two_td_txt = two_td_txt_tag.get_text()
    #print(two_td_txt)

'BackEnd > Python' 카테고리의 다른 글

[OpenCV] openCV 설치 및 이미지 띄우기 예제  (0) 2021.05.18
DB 코드 조회해서 그래프 그리기  (0) 2021.05.12
Python DB 연결  (0) 2021.05.11
HeidiSQL 설치 및 DB 생성  (0) 2021.05.11
MySQL 설치  (0) 2021.05.11