1.  select_one() 

🥑  find가 원하는 태그를 찾는게 목적이라면 select는 CSS selector로 tag 객체를 찾아 반환
🥑  select_one()은 원하는 태그 하나만 가져오고, 태그가 많은 경우에는 맨 앞의 것만 가져옴

 

    🐰 select 계열의 메소드는 css selector 이용 가능
    🐰  '.' -> class 속성 /  '#' -> id 속성
    🐰 class : 하나의 html 에서 여러 태그에 중복 사용 가능
    🐰 id : 하나의 html에서 한번만 사용. 권장사항

# 요소 내 text 가져오기
title = soup.select_one('title')

print(title.string)  # 선택된 요소 text만
print(title.text)
print(title.get_text())
# text, get_text는 하위 text 까지 같이

 

 

1)  select_one('태그명') 사용 예제

# 다음 > 뉴스 > IT > 오늘의 연재의 첫번째 글 제목과 신문사 들고오기
url = 'https://news.daum.net/digital#1'
resp = requests.get(url)
soup = bs(resp.text, 'html.parser')

html 소스

 

tag_series = soup.select_one(('.list_todayseries li'))
pprint.pprint(tag_series)

tag_series_title = tag_series.select_one('.link_txt').text
print(f'제목: {tag_series_title}')
# 제목: 전자사전으로 인기 끌던 '샤프'...최근엔 AI 아바타와 함께

tag_series_press = tag_series.select_one('.txt_info').text
print(f'신문사: {tag_series_press}')
# 신문사: 전자신문

tag_series 실행결과

 


 

2)  select_one('CSS선택자') 예제

 

import requests
from bs4 import BeautifulSoup as bs
import pprint

# 할리스 커피 : 매장 검색
url = 'https://www.hollys.co.kr/store/korea/korStore2.do'
resp = requests.get(url)
soup = bs(resp.text, 'html.parser')

매장 테이블의 html 소스

 

# 매장 테이블 가져오기
stores = soup.select_one('#contents > div.content > fieldset > fieldset > div.tableType01 > table')
pprint.pprint(stores)

  

 

 

 

 

📌  왼쪽은 css selector로 가져온 결과이다

      ➡️ selector 소스를 가져오는 방법은 html 소스코드 중 해당 태그 위에 커서를 가져다 놓고 우클릭 ▶️ 복사 ▶️ selector 복사 버튼을 클릭하면 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

# 첫 번째 가게 관련
first_store = stores.select_one('#contents > div.content > fieldset > fieldset > div.tableType01 > table > tbody > tr:nth-child(1)')
pprint.pprint(first_store)

 

first_store 결과

 

# td:nth-child(1) -> td 태그중 첫번째
second_store_name = first_store.select_one('td:nth-child(2)')
print(second_store_name.text)
# 부산사상광장점

# td:nth-child(1) -> td 태그중 4번째
second_store_addr = first_store.select_one('td:nth-child(4)')
print(second_store_addr.text)
# 부산광역시 사상구 광장로 22 (괘법동) 2층 사상구 괘법동 565-2

 


 

2. select()

🥑  CSS selector로 지정한 태그들을 모두 가져오는 메소드로 가져온 태그들은 모두 리스트에 보관

# 네이버 환율 크롤링
# 네이버에서 '환율' 검색 후 '환율 더보기'

url = 'https://finance.naver.com/marketindex'
resp = requests.get(url)
soup = bs(resp.text, 'html.parser')
pprint.pprint(soup)

실행결과

 

# 환전고시 국가 가져오기
nations = soup.select('#exchangeList > li > a.head > h3 > span')
print(nations)  # 리스트로 반환

실행결과

 

# 나라별 환율 가져오기
exchange_rates = soup.select('#exchangeList > li > a.head > div > span.value')
print(exchange_rates)

 

# 나라별 화폐 단위와 환율 같이 출력하기
for idx, item in enumerate(nations):
    print(f'{item.text} : {exchange_rates[idx].text}')
  
'''
실행결과)
미국 USD : 1,317.50
일본 JPY(100엔) : 895.98
유럽연합 EUR : 1,440.55
중국 CNY : 182.99
'''

 


 

3. CSS selector 

 

1) 태그명 선택    ex. li, a

test = soup.select('a')

 

 

2) 하위 태그 선택   ex. ul a / ul > a

# 상위 태그 > 하위 태그
test = soup.select('li a')
test = soup.select('li > a')

 

3) 클래스 이름으로 선택   ex. li.course / .course / li.course.paid

# 태그.클래스명
test = soup.select('li.value')
# .클래스명
test = soup.select('.value')
# 태그.클래스명.클래스명 (여러 클래스가 있는 경우)
test = soup.select('li.value.fieldset')

 

 

4) id 이름으로 선택   ex. #start

# '#id이름'
test = soup.select('#list50')
# '태그명#id이름'
test = soup.select('tr#list50')

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1.  url을 이용해서 HTML를 가져오는 방법

 

🚀  크롤링할 때 url을 이용해서 HTML를 가져오는 방법은 크게 2가지
      a. 내장 모듈인 urllib를 사용 
      b. 외장 모듈인 requests를 사용

 

1) urllib를 사용한 경우

# 정상 접속
url = "https://www.python.org/"
code = request.urlopen(url)
print(code)  # <http.client.HTTPResponse object at 0x103f16b30>

# 비정상 접속. 비정상일 경우 에러 발생.
url = "https://www.python.org/1"
code = request.urlopen(url)
print(code)

비정상 접속인 경우 실행 결과

 


 

2) requests를 사용한 경우

# 정상 접속인 경우
url = "https://www.python.org/"
response = requests.get(url)
print(response)  # <Response [200]>. 정상적인 통신이 이루어짐.

# 페이지가 없는 경우에도 에러가 발생하지 않고, Response [404]를 리턴.
url = "https://www.python.org/1"
response = requests.get(url)
print(response)  # <Response [404]>. 해당 페이지를 찾을 수 없음

 

  👾  requests 를 사용하면 urllib 를 사용한 경우와 달리 비정상 접속인 경우 에러가 발생하지 않고 응답코드를 준다

 

    📌  응답코드 : 서버에서 클라이언트로 보내는 코드
          a. 1XX : 요청을 받았고, 작업 진행 중
          b. 2XX : 사용자의 요청이 성공적으로 수행 됨
          c. 3XX : 요청은 완료 되었으나, 리다이렉션이 필요
          d. 4XX : 사용자의 요청이 잘못됨
          e. 5XX : 서버에 오류가 발생함

 


 

2. requests 사용법

 

🚀  서버로 요청을 할 때 브라우저의 정보(User-Agent)가 같이 전달됨
        ➡️ 요청 받은 서버에서는 브라우저의 정보를 가지고 접속자가 bot인지 일반 사용자임을 구분
        ➡️ 특정 사이트의 경우 요청하는 브라우저의 정보가 일반 사용자가 아니면 접속을 막는 경우가 있음
        ➡️ requests의 경우 브라우저의 헤더 정보를 수정해서 일반 브라우저 처럼 접속할 수 있게 함

 

# requests 사용법

url = 'https://www.naver.com/'
response = requests.get(url)  # get() 또는 post() 메서드를 이용해서 html 정보를 받아옴

html = response.text  # response 객체의 text 속성을 지정하면 html 정보 반환.
print(html)  # html 소스가 출력

headers = response.headers  
print(headers)  # response 객체의 headers 속성 지정하면 헤더 정보 반환.

 

 

1) 헤더 정보 확인하기

 

  👾  requests를 이용해서 url 접속을 하면 브라우저의 정보(User-Agent)가 requests의 모듈 정보로 나옴
          ➡️ 서버에서 해당 정보를 보고 크롤링을 판단할 수 있음

from bs4 import BeautifulSoup as bs
import requests

url = 'https://planet-trade.kr/header_info.php'

response = requests.get(url)  # 브라우저 접속 역할을 파이썬 requests가 해줌
soup = bs(response.text, 'html.parser')
print(soup)
# 접속 IP : 58.149.46.252
# 접속 정보 : python-requests/2.31.0

url 주소로 접속했을 때 브라우저의 정보

 


 

2) requests에서 헤더 정보를 변경

request_headers = {
    'User-Agent': ('(url 주소로 들어갔을 때 나오는 브라우저 접속 정보)'),
    'Referer': '',
}

resp = requests.get(url, headers=request_headers) # 변경된 헤더로 접속, 정보 가져옴
soup = bs(resp.text, 'html.parser')
print(soup)

# 접속 IP : 58.149.46.252
# 접속 정보 : Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36
# (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36

 


 

2. 크롤링 할 때 운영자 의사 확인

 

🚀  모든 크롤링이 불법은 아니지만 하지만 운영자의 의사에 상관없이 무단으로 크롤링하는 것은 불법
🚀  운영자의 크롤링 허용 여부를 알 수 있는 방법은 'robot.txt' 로 확인
        ➡️ allow는 허용, disallow는 검색 불가

 

    💡  robots.txt 설정 정보 안내 사이트

           https://searchadvisor.naver.com/guide/seo-basic-robots
           https://developers.google.com/search/docs/advanced/robots/intro?hl=ko

 

robots.txt 설정하기

robots.txt는 검색로봇에게 사이트 및 웹페이지를 수집할 수 있도록 허용하거나 제한하는 국제 권고안입니다. IETF에서 2022년 9월에 이에 대한 표준화 문서를 발행하였습니다. robots.txt 파일은 항상

searchadvisor.naver.com

 

robots.txt 소개 및 가이드 | Google 검색 센터  |  문서  |  Google for Developers

robots.txt는 크롤러 트래픽을 관리하는 데 사용됩니다. robots.txt 소개 가이드에서 robots.txt 파일의 정의와 사용 방법을 알아보세요.

developers.google.com

 

urls = ['https://www.naver.com/', 'https://ko.wikipedia.org/']
filename = 'robots.txt'

for url in urls:
    file_path = url + filename
    print(file_path)
    resp = requests.get(file_path)
    print(resp.text)
    print("\n")

실행 결과

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]

+ Recent posts