반응형
파이썬 - 웹 크롤링, 정적 웹 데이터 수집 (requests와 BeautifulSoup)
목차
- 정적 웹 페이지 데이터 수집 예제
- 웹 데이터 선택 방법 (find vs select 사용법 및 CSS selector 적용방법)
- 웹에서 받아온 contents 데이터에서 <a> 태그 데이터 추출 예제
- 웹에서 받아온 contents 데이터 내용
- find vs select 및 CSS selector 사용방법
1. 정적 웹페이지 데이터 수집 예제
from bs4 import BeautifulSoup
import requests
number = 172
table_list = []
response = requests.get(f"https://kadosholy.tistory.com/{number}")
if response.status_code == 200:
contents = response.content
bs = BeautifulSoup(contents, "html.parser")
try:
table = bs.select_one("table")
rows = table.select('tr')
# rows = table.select('tr:not(:first-child)') # 첫번째 줄 제거
for row in rows:
row_list=[]
for td in row.select('td'):
row_list.append(td.text.strip())
table_list.append(row_list)
except:
pass
else:
print(response.status_code)
print(table_list)
[실행결과]
[['2023.12.16'], ['2023.12.16'], ['2023.12.16']]
2. 웹 데이터 선택 방법 (find vs select 사용법 및 CSS selector 적용방법)
아래의 contents= """ ... """ 와 같이 웹에서 받아온 html 문서의 데이터가 있을 경우, 내가 원하는 데이터를 선택하기 위해서 BeautifulSoup의 find와 select 메소드를 사용할 수 있습니다.
이 중 select 메소드를 사용하게 되면 CSS selector 형식으로 데이터에 접근하여 선택할 수 있습니다.
1) 웹에서 받아온 contents 데이터에서 <a> 태그 데이터 추출 예제
from bs4 import BeautifulSoup
bs = BeautifulSoup(contents, "html.parser")
d = bs.select("a")
print(d)
print(d[0].text)
print(d[0].get('class'))
print(d[0].get('href'))
[실행결과]
[<a class="ds dc2">AAA</a>, <a class="ds">BBB</a>]
AAA
['ds', 'dc2']
None
2) 웹에서 받아온 contents 데이터 내용
contents = """
<!doctype html>
<html>
<head>
<title> 제목 </title>
</head>
<body>
<p>
<div class="ds dc1" id="di1">111</div>
<div class="ds dc2">222</div>
<div class="ds dc2">333</div>
<div class="ds">
<a class="ds dc2">AAA</a>
<a class="ds">BBB</a>
</div>
<div class="ds dc3">444</div>
</p>
</body>
</html>"""
3) find vs select 및 CSS selector 사용방법
- .find( ) : 한 개의 데이터를 반환합니다.
- .find_all( ) : 모든 데이터를 리스트에 담아서 반환합니다.
- .select_one( ) : 한 개의 데이터를 반환합니다.
- .select( ) : 모든 데이터를 리스트에 담아서 반환합니다.
#---------------------------------------# [실행결과]
d = bs.find("a") # <a class="ds dc2">AAA</a>
d = bs.find_all("a") # [<a class="ds dc2">AAA</a>, <a class="ds">BBB</a>]
d = bs.find_all("div", {"id":"di1"}) # [<div class="ds dc1" id="di1">111</div>]
d = bs.find_all("div", {"class":"dc2"}) # [<div class="ds dc2">222</div>, <div class="ds dc2">333</div>]
d = bs.select_one("a") # <a class="ds dc2">AAA</a>
d = bs.select("a") # [<a class="ds dc2">AAA</a>, <a class="ds">BBB</a>]
d = bs.select("div#di1") # [<div class="ds dc1" id="di1">111</div>]
d = bs.select("div.dc2") # [<div class="ds dc2">222</div>, <div class="ds dc2">333</div>]
d = bs.select(".ds:first-child") # [<div class="ds dc1" id="di1">111</div>, <a class="ds dc2">AAA</a>]
d = bs.select(".ds:last-child") # [<a class="ds">BBB</a>, <div class="ds dc3">444</div>]
d = bs.select(".ds:nth-child(2)") # [<div class="ds dc2">222</div>, <a class="ds">BBB</a>]
d = bs.select("p .dc2") # [<div class="ds dc2">222</div>, <div class="ds dc2">333</div>, <a class="ds dc2">AAA</a>]
d = bs.select("p > .dc2") # [<div class="ds dc2">222</div>, <div class="ds dc2">333</div>]
d = bs.select("div > .ds:first-child") # [<a class="ds dc2">AAA</a>]
d = bs.select("div > .ds:not(:first-child)") # [<a class="ds">BBB</a>]
#--------------------------------------------#
반응형
'IT 개발 > Python' 카테고리의 다른 글
[파이썬] 네이버 OpenAPI 사용방법 (통합 검색어 트렌드 api) (0) | 2024.01.15 |
---|---|
[파이썬] 공공데이터 포털 OpenAPI 사용방법 및 예제 (4) | 2024.01.15 |
[파이썬] 웹 크롤링 개념 및 웹 데이터 수집 방법 (0) | 2024.01.11 |
[파이썬] 정규표현식 개념 및 사용방법 (0) | 2023.12.15 |
[파이썬] 오라클 데이터베이스 연결 및 사용방법 (0) | 2023.12.11 |