개발 블로그

[Python] 웹 크롤링 & 자연어 처리 (1) 본문

Programming Language/Python

[Python] 웹 크롤링 & 자연어 처리 (1)

draidev 2022. 3. 25. 00:10

본인이 쓴 크롤링에 관한 게시물 :

[CODELION 강의] [심화] 같이 푸는 PYTHON - 크롤링

[Toy_Project] Python 웹크롤링 - EPL순위 가져오기 

 

여러 페이지에 대해서 정보를 가져오기 위해서는 url을 이해하고 값을 조정하여 페이지에 접근해야 됩니다. 따라서 크롤링 전에 url에 대한 분석이 필요합니다.

url에 대한 설명은 brunch 블로그(https://brunch.co.kr/@beusable/237)를 참고했습니다.

 

00 BeautifulSoup

BeautifulSoup는 request를 통해 얻어온 데이터를 BeautifulSoup객체로 파싱하여 원하는 데이터를 쉽게 추출하도록 도와주는 모듈입니다.

  • import
from bs4 import BeautifulSoup
from urllib.request import urlopen

01 Daum영어사전에서 영단어 찾기

'affirmation'이라는 단어를 url값에 전달해서 해당 단어와 뜻을 가져와 보겠습니다.

urlopen(url) : 웹사이트에 request를 보내고 response된 데이터 변수에 대입합니다.

Beautiful(response, 'html.parser') : response된 데이터를 html형식으로 Soup객체로 변환합니다.

word = 'affirmation'

url = 'https://alldic.daum.net/search.do?q=' + word

web = urlopen(url)   # urlopen(url).read().decode('utf-8')
web_page = BeautifulSoup(web, 'html.parser')

print(web_page)

print(web_page)

위와 같은 html형식의 데이터에서 원하는 단어를 찾기위해서 크롬개발자 도구(F12 또는 Ctrl + Shift + I)를 사용합니다.

affirmation이라는 단어가 <span>태그에 class="txt_emph1"이라는 것을 알 수 있습니다.

크롬 개발자 도구


find()함수와 find_all()함수를 통해 접근할 수 있습니다.

※ 주의 할 점
find(), find_all() 함수의 tag,class,id,arguement 같은 전달인자들은 문자열로 전달해야 합니다.

find

# find기본형
web_page.find(name=None, attrs={}, recursive=True, text=None, **kwargs)
  • 찾는 태그가 여러개일 경우 맨위의 한 가지 값만 리턴 
  • .get_text()함수 사용 가능
  • type : bs4.element.Tag

find_all

# find_all 기본형
web_page.find_all(
    name=None,
    attrs={},
    recursive=True,
    text=None,
    limit=None,
    **kwargs,
)
  • 입력한 모든 태그를 리턴
  • .get_text()함수 사용 못함 -> 사용하려면 인덱스를 붙여 Tag개체를 불러내서 사용 가능
  • type : bs4.element.ResultSet

 


# 찾는 단어가 하나일 때
box1 = web_page.find('span', {'class': 'txt_emph1'})
print(box1)
print(box1.get_text())

box1, box1.get_text() 출력

print(box1.get_text())
print()

# 영단어 뜻 출력, find_all의 값을 하나씩 받아서 get_text()로 문자열을 얻는다
for definition in web_page.find_all('span',{'class': 'txt_emph1'}):
	print(definition.get_text())

 

Comments