cs/크롤링

[크롤링] 하늬가람 페이지 크롤링해보자

신_이나 2023. 3. 20. 00:49

 

 

 

내가 원래 크롤링을 시작했던 이유는 하늬가람 페이지를 크롤링해 또 다른 프로그램을 만들고 싶었기 때문이다. 그럼 앞서 배운 내용을 바탕으로 크롤링 해보자

 

 

https://hanigaram.sogang.ac.kr/front/cmsboardlist.do?siteId=hanigaram&bbsConfigFK=1301 

 

학생홍보대사 하늬가람 - 공지사항

1 2 3 4 5 6 7 8 9 10 / 10

hanigaram.sogang.ac.kr

이 공지사항에 있는 목차 제목을 크롤링하고자 하였다.

 

 

 

 

내가 크롤링하고자 하는 페이지의 소스는 이렇게 구성되어 있었다.

div(class = list_box) - ul - 여러개의 div - 여러개의 a (원하는 내용)

사실 중간에 왜 div 를 한 번 더 썼는지 모르겠다. 개발자 만의 생각이 있었겠지...

아무튼 이를 바탕으로 코드를 구현하였다.

 

 

 

import ssl
ssl._create_default_https_context = ssl._create_unverified_context
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen('https://hanigaram.sogang.ac.kr/front/cmsboardlist.do?siteId=hanigaram&bbsConfigFK=1301')
bs = BeautifulSoup(html, 'html.parser')

div = bs.find('div',{'class' : 'list_box'})
ul = div.find('ul')
lis = ul.findAll('li')

for li in lis:
  div=li.find('div')
  a_tag=li.find('a')
  print(a_tag.text)

 

자꾸 "urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate" 라는 오류가 나서 "pip  install certifi" 라고 터미널에 입력도 해보았는데 잘 되지 않았다. 따라서 위에 따로 선언해주었다. 그리고 자꾸 실수 했던 게 값이 None 이 나오는 경우였다. 사실 내가 코드만 잘 만들면 none 값으로 뜰리가 없는데,,, 컴퓨터를 믿자,, 그리고 나를 의심하자,,,

 

 

 

 

위 코드를 통해 나온 결과값이다.

페이지를 이동하며 목록값을 뽑고 싶기 때문에 다음 페이지의 url 를 살펴보았는데 전에 작성했던 할리스 홈페이지와 달리 url 주소가 조금 이상하였다.

아무리 목록 페이지를 이동하여도 https://hanigaram.sogang.ac.kr/front/cmsboardlist.do 만 뜰 뿐이었다. 저 링크로 들어가면 아무것도 뜨지 않는다,, 범위를 설정하는 것이 아니라, 페이지 내 링크를 통해 다른 페이지로 이동하는 법을 구현해보도록 하자.

 

 

 

 

알아보던 중 나는 selenium 에 대해 알게되었다. 이를 통하여 직접 다른 페이지의 url을 넣어주지 않고도 페이지 속에서 다른 버튼을 클릭하는 좀 더 쉬운 방법을 알 수 있었다. 이는 나의 포스팅을 참고해주길!

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By #find_element 함수
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("detach", True)
#페이지가 자동으로 꺼지지 않게 해줌
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
#크롬 버전을 자동으로 맞춰줌

url = 'https://hanigaram.sogang.ac.kr/front/cmsboardlist.do?siteId=hanigaram&bbsConfigFK=1301'
driver.get(url)
#driver.find_element(By.XPATH, '//*[@id="query"]').send_keys("하늬가람")
driver.find_element(By.XPATH, '//*[@id="body"]/div[2]/div[4]/div[2]/ul[2]/li[2]/a').click()

위 코드를 시작하면 자동으로 클릭이 된다. 그럼 bs4 와 celenium 을 합쳐보자

 

 

 

#----------------selenium 설정
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By #find_element 함수
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("detach", True)
#페이지가 자동으로 꺼지지 않게 해줌
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
#크롬 버전을 자동으로 맞춰줌

#----------------bs4 설정
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
from urllib.request import urlopen
from bs4 import BeautifulSoup
from time import sleep

url = 'https://hanigaram.sogang.ac.kr/hanigaram/index_new.html'
driver.get(url)
sleep(1)
driver.find_element(By.XPATH, '//*[@id="gnb"]/li[2]/a').click()

html = driver.page_source #지금 브라우저 화면의 페이지 소스를 가져온다.
bs = BeautifulSoup(html, 'html.parser')

def crawing() :
  div = bs.find('div',{'class' : 'list_box'})
  ul = div.find('ul')
  lis = ul.findAll('li')
  
  for li in lis:
    div=li.find('div')
    a_tag=li.find('a')
    print(a_tag.text)

crawing()

driver.find_element(By.XPATH, '//*[@id="body"]/div[2]/div[4]/div[2]/ul[2]/li[2]/a').click()
html = driver.page_source #지금 브라우저 화면의 페이지 소스를 가져온다.
bs = BeautifulSoup(html, 'html.parser')

crawing()

 

 

목록 1과 2 의 제목 모두 잘 나온다.

 

 

완성! 

사실 내가 원하던 건 이 페이지가 아니라 로그인이 필요한 다른 페이지다. 

모두가 접근 가능한 이 페이지를 통해 연습하고 그 뒤에 로그인 페이지를 건들려고 하였다. 그러면 내일부턴 본격적으로 그 페이지를 건들여보자! 아뵤