반응형

 

파이썬 - 웹 크롤링, 정적 웹 데이터 수집 (requests와 BeautifulSoup)

 

 

   목차

  1. 정적 웹 페이지 데이터 수집 예제
  2. 웹 데이터 선택 방법 (find vs select 사용법 및 CSS selector 적용방법)
    1. 웹에서 받아온 contents 데이터에서 <a> 태그 데이터 추출 예제
    2. 웹에서 받아온 contents 데이터 내용
    3. 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 사용방법

  1. .find( ) : 한 개의 데이터를 반환합니다. 
  2. .find_all( ) : 모든 데이터를 리스트에 담아서 반환합니다. 
  3. .select_one( ) : 한 개의 데이터를 반환합니다. 
  4. .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>]
#--------------------------------------------#

 

 

반응형

+ Recent posts