Python

웹 스크래핑

왕초보코딩러 2024. 1. 13. 00:33
728x90

웹크롤링: 웹사이트에서 URL, 키워드 수집(검색엔진이 웹사이트를 인덱싱하기 위해)

웹스크래핑: 웹사이트에서 필요한 데이터 긁어오기

 

 

VsCode 터미널에서 파이썬 가상환경 만들기

라이브러리 간 버전 충돌 방지를 위해 가상환경을 만든다

python -m venv [가상환경 이름]

cd  [가상환경 이름]\Scripts

activate

 

 

가상환경에서 웹 스크래핑을 위한 라이브러리 설치(터미널 창에서)

1. requests

서버에 request를 보내고 응답을 리턴

pip3 install requests

 

2. beautifulsoup4

HTML의 데이터 추출을 위해

pip3 install beautifulsoup4

 

 

웹 스크래핑을 하는 방법

웹사이트의 html 코드를 가져온다(requests 사용) -> html 코드 중 원하는 데이터를 찾고 추출한다(BeautifulSoup 사용)

 


웹사이트의 html 코드를 가져오기

 

requests 라이브러리 임포트

import requests

 

 

요청에 대한 응답 코드 받기:  get() 

#응답을 response에 변수에 저장
response = requests.get("원하는 사이트")
print(response)		#<Response [200]>

 

 

웹사이트의 html 코드 받아오기:  .text 

print(response.text)

 

 

 

네이버 웹사이트의 html코드를 보여준다.

 


html 코드 중 필요한 태그 추출

 

beautifulsoup4 라이브러리 임포트

from bs4 import BeautifulSoup

 

 

parser을 이용해 html 코드를 정리 : BeautifulSoup() 

변수 지정(저는 soup로 통일하겠습니다)

soup = BeautifulSoup(html코드, 'html.parser')	#html코드에는 requests.get().text를 넣어줌

 

 

필요한 태그 추출하기 : select_one(), select() , find(), find_all()

1. select_one와 selcet 

 

select_one() : css 선택자에 부합하는 코드 중 가장 위에 있는 태그를 하나만 리턴

soup.select_one('css 선택자')

 

css 선택자로 태그명만 쓴다면 select_one()을 생략할 수 있다

#두 개가 같음
soup.select_one('p')

soup.p

 

 

select() : select()를 이용하여 css 선택자에 부합하는 태그들을 가져와 리스트로 리턴

soup.select('css 선택자')

-> for문 사용

 

 

원하는 부분 수집 방법(css 선택자만으로 힘들 때)

1. 태그의 선택 범위를 넓게 잡고 필요한 부분을 슬라이싱한다

2. select()한 태그를 또 select() 한다

 

2. find와 find_all 

find() : 하나의 태그 리턴

find_all() : 부합하는 태그들을 가져와 리스트로 리턴

 

태그 이름을 쓸 수 있다,

여러 태그를 얻고 싶을 때, 태그 이름들을 리스트에 넣을 수 있다

soup.find_all('p')

#h1 태그와 p 태그를 가져온다
soup.find_all(['h1', 'p'])

#모두 가져오고 싶을 때
soup.find_all(True)

 

 

속성을 사용하여 태그 선택

#id는 text, class는 addr인 p 태그를 가져온다
soup.find_all('p', id='text', class_='addr')

class 속성은 class

밑줄을 쳐준다!

 

 

특정 속성이 있는지 없는지로 태그 선택

#id 속성은 없고, class 속성은 있는 p 태그 추출
soup.find_all('p', id=False, class_=True)

 


태그에서 필요한 데이터 추출하기

 1. 텍스트만 추출하기 : get_text(), strings, stripped_strings

for문에서 태그들을 반복하면서 html 태그 없이 텍스트만 추출

 

- get_text()를 이용

soup = BeautifulSoup('html코드', 'html.parser')
sel = soup.select('css선택자')

#텍스트 출력하기
for tags in sel:
	print(tags.get_text())
    
#리스트에 텍스트만 저장해서 출력하기
program_name = [tags.get_text() for tags in sel]
print(program_name)

 

 

- list(), strings 이용

태그 안에 있는 텍스트들을 리턴해준다

soup = BeautifulSoup('html코드', 'html.parser')
sel = soup.select('css선택자')

#텍스트 출력하기
for tags in sel:
	print(list(tags.strings))

list()를 사용해야 한다

안에 있는 텍스트들을 리스트로 반환하지만 앞 뒤의 공백이나 줄바꿈은 제거 못함

예) ['\n', '10', ' 안녕하세요\n          ']

 

- list(), stripped_strings 이용

태그 안에 있는 텍스트들을 앞 뒤 공백, 줄바꿈을 제거해서 리턴

soup = BeautifulSoup('html코드', 'html.parser')
sel = soup.select('css선택자')

#텍스트 출력하기
for tags in sel:
	print(list(tags.stripped_strings))

list()를 사용해야 한다

예) ['10', '안녕하세요']

 

 2. 속성 추출하기 : [ '속성' ]

select(), select_one() 뒤에 ['속성']을 쓴다

soup.select_one('img')['src']

soup.find('img')['src']