웹크롤링: 웹사이트에서 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']
'Python' 카테고리의 다른 글
웹 스크래핑으로 뉴스 기사 링크 받아오기 (0) | 2024.01.13 |
---|---|
Python에서 엑셀, csv 다루기 (1) | 2024.01.13 |
알고리즘 패러다임 (0) | 2023.11.18 |
[Python] 코드잇 숫자 맞히기 게임 (0) | 2023.09.18 |
[Python] 재귀함수를 이용한 리스트 최대, 최소 값 찾기 (0) | 2023.09.16 |