Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- extraParams
- c#코딩의기술실전편
- dbContext
- 라도무스dvd
- 명시적외래키
- 코드프로그래머스
- EFCore
- JSON
- ORM
- 상속
- .net
- intellij
- Request
- extjs
- minimalAPI
- LINQ
- c#
- Config
- 에스가든스냅
- 스냅잘찍음
- lazy loading
- JavaScript
- vscode
- React
- Store
- scanner
- 대전본식영상
- error
- mac
- ViewModel
Archives
- Today
- Total
ejyoo's 개발 노트
python 웹 크롤링을 사용한 데이터 추출하기 본문
사전 준비사항
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
예제코드
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 |