이번에는 https://basicenglishspeaking.com/daily-english-conversation-topics/ 이 웹사이트에 있는 대화 주제 크롤링, 그리고 각각의 대화 주제에서 나누는 대화들을 크롤링해 볼 예정이다.
위의 사이트에 들어가보면 여러 대화 주제들이 있고, 원하는 주제를 선택하면 주제와 관련한 대화를 연습할 수 있는 사이트이다.
import requests
from bs4 import BeautifulSoup
def get_subjects():
subjects = []
req = requests.get('https://basicenglishspeaking.com/daily-english-conversation-topics/')
html = req.text
#파싱해서 부분들로 쪼갬
soup = BeautifulSoup(html, 'html.parser')
divs = soup.findAll('div', {'class': 'tcb-flex-row tcb--cols--3'})
#파싱한 부분들 중 div 태그, div 태그들 중에 이런 클래스 속성을 가진 태그들을 전부 찾는다.
for div in divs:
links = div.findAll('a')
#해당하는 div 태그 내의 a 태그들을 찾는다.
for link in links:
subject = link.text
subjects.append(subject)
#a태그 내의 text로 적혀 있는 대화 주제들을 찾는다.
return subjects
subjects = get_subjects()
print("총 ", len(subjects), "개의 주제를 찾았습니다.")
print(subjects)
이렇게 하면 어렵지 않게 위의 웹사이트에서 주제들을 찾을 수 있다. 마우스 오른쪽 클릭 -> 속성 혹은 페이지 소스 보기를 통해서 어떤 태그 안에 내가 원하는 정보를 담고 있는지만 잘 파악하면 금방 크롤링 할 수 있다.
다음은 각 주제 내의 url에서 대화 내용을 찾는 것이다.
class Conversation:
def __init__(self, question, answer):
self.question = question
self.answer = answer
def __str__(self):
return f'질문 : {self.question}\n답변 : {self.answer}'
conversations = []
i = 0
for sub in subjects:
i += 1
print(f'({i}/{len(subjects)}) {sub}')
req = requests.get('https://basicenglishspeaking.com/'+sub)
html = req.text
soup = BeautifulSoup(html, 'html.parser')
qnas = soup.findAll('div', {'class': 'sc_player_container1'})
for qna in qnas:
if qnas.index(qna) % 2 == 0:
q = qna.next_sibling
else:
a = qna.next_sibling
c = Conversation(q, a)
conversations.append(c)
if i == 10:
break
print(f'총 {len(conversations)}개의 대화를 찾았습니다.')
for c in conversations:
print(str(c))
여기서는 Conversation 이라는 객체를 만들고, 해당 객체 내에 각각 하나의 질문과 하나의 답변 속성을 넣는다. 그리고 웹사이트 url에서 체크해서 각 주제의 url 내 html을 get 요청 해준다. 그 이후의 과정들은 비슷하다. 파싱하고 내가 원하는 부분을 찾는다. 그리고 각각 새로운 객체의 question과 answer 속성으로 추가해준다. 여기서는 앞의 과정들과는 달리, 크롤링 속도가 느렸는데, 이는 해당 웹사이트에서 속도를 제한해뒀기 때문이라고 한다. 따라서 75개의 주제를 다 불러오지 않고, 10개만 대표적으로 살펴봤다.
참고 유투브 : https://youtu.be/1772y3PtvA4
'TIL > Python | Django' 카테고리의 다른 글
2021.11.26 TIL : [Django] ORM lazy loading (0) | 2021.11.27 |
---|---|
2021.11.18 TIL : [Python] 비동기 프로그래밍 (0) | 2021.11.18 |
2021.8.24 TIL : [Python] 웹 크롤러 - 1 (0) | 2021.08.24 |
2021.8.23 TIL : [Python] 기초 문법9 - super() (2) | 2021.08.23 |
2021.8.9 TIL : [Django] DRF 4 - View Sets & routers (0) | 2021.08.09 |
댓글