안녕하십니까,
뉴스본문 기사 크롤링 중 질문이 있습니다.
첨부사진을 보시면, 첫번째 a태그의 class가 info press인데,
명령어를 입력하실 때 그냥 links = article.select("a.info")로 info만 입력하셨습니다.
띄어쓰기 전의 한 단어만 class 명으로 보는 것인지 궁금합니다.
아래는 강사님을 따라한 코드입니다(크롤링 결과는 잘 나옴)
# 1. 삼성전자를 검색하고, 네이버 뉴스 본문의 링크만 가져온다
response = requests.get("https://search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90")
html = response.text
soup = BeautifulSoup(html, "html.parser")
articles = soup.select("div.info_group") # 뉴스 기사 중 div가 info_group인 것을 선택해라.
# info_group이 총 몇개인지 확인하니까, word에 나와 있듯이 총 기사가 10개임을 확인했다.
for article in articles:
links = article.select("a.info") # article의 a태그 중 class가 info인 녀석들을 가져오자.
if len(links) >= 2: # 가져온 결과값은 리스트 형태이고, word에 나와 있듯이 네이버 뉴스는 a태그 2개로 구성되어 있다. 따라서 links의 리스트 중 len함수를 통해 리스트가 몇개인지 파악하고, 링크가 2개 이상인지 확인한다.
url = links[1].attrs["href"] # 우리가 가져올 건 link 중 2번째 요소니까, [1]을 입력한다(리스트 인덱스는 0부터 시작하니까!)
# print(url) 본문 링크만 가져온다면 여기서 마치면 되지만, 우리가 원하는건 본문 내용이다.
# 2. 네이버 뉴스 본문 내용 가져오기
response = requests.get(url, headers={'User-agent' : 'Mozila/5.0'}) # 방금 만든 url에 다시 requests를 사용!, 봇으로 인식되는걸 피하기 위한 header도 넣자.
html = response.text
soup = BeautifulSoup(html, "html.parser")
# print(soup)를 통해 제대로 본문을 가져오는지 확인해보자
content = soup.select_one("#newsct_article") # 네이버뉴스의 본문을 모두 포함하는 것은 id newsct_article 이다.
print(content.text)