728x90
프로그래머스 html 구조가 생각보다 복잡하다.. ㅠㅜ
우선 문제들을 긁어오기위한 get_problems.py
를 선언하여 pagination
의 마지막 숫자 즉 마지막 페이지 번호를 가져오자.
get_problems.py
import requests
from bs4 import BeautifulSoup
url = "https://programmers.co.kr/learn/challenges?tab=all_challenges"
def get_max_page():
req = requests.get(url) # url에 요청하기
soup = BeautifulSoup(req.text,"html.parser") # 요청한 url의 html 긁어오기
pages = soup.find_all("li",{"class":"page-item"}) #
max_page = pages[-2].string
return max_page
pagination
안의 page-item
을 이용하여 page
넘버들을 가져오자.
max_page = pages[-2].string인 이유는 pagination
의 가장 끝부분은 다음 페이지 버튼이 들어있으므로 pages[-2]
를 이용하여 뒤에서 두 번째의 숫자를 가져온다.
다음으로 해당 page의 문제들을 긁어오는 작업을 하자.
def process():
max_page = int(get_max_page())
file = open("problems.csv", mode="w")
writer = csv.writer(file)
writer.writerow(["title","link","level"])
for i in range(1,max_page+1):
tmp = get_problems(i)
for j in tmp:
writer.writerow(list(j.values()))
return
get_problems()
함수에서 문제들의 title, link,level
을 긁어와 긁어온 정보들을 이용하여 csv파일을 만들어 줄 것이다.
def get_problems(num):
page_url = f"{url}&page={num}"
req = requests.get(page_url)
soup = BeautifulSoup(req.text,"html.parser")
algorithm_list = soup.find("div",{"class":"algorithm-list"}).find_all("div",{"class":"col-item"})
# title, link, level, langs []
ret = []
for item in algorithm_list:
tmp = {}
tmp["title"] = item.find("h4",{"class":"title"}).string
link = "https://programmers.co.kr"
link += item.find("a")["href"]
tmp["link"] = link
tmp["level"] = item.find("div",{"class":"card-algorithm"})["class"][1]
ret.append(tmp)
#languages = algorithm_list[4].find("div",{"class":"languages"}).find_all("div",{"data-container":"body"})
# langs = []
# for language in languages:
# lang = language["data-original-title"]
return ret
내가 푼 문제를 확인하기 위해서 해당 문제의 language
정보를 이용하여 풀었는지 안풀었는지 확인하려고 했다.
푼 문제들은 svg 파일 아이콘이 언어를 의미하는 것이 아닌 체크모양으로 바뀌는데 이 정보를 가져오기 위해서는 로그인 정보가 필요한 것 같다.
지금 배운 내용으로는 해결이 불가능...
이전에 시도해보려했던 cellenum
이나 다른 방식을 이용하여 해결해야하는 것 같은데, 복잡해서 일단 보류..
그래서 우선은 제목, 링크, 레벨만 받아와 csv파일로 추출했다.
전체 코드
import csv
import requests
from bs4 import BeautifulSoup
url = "https://programmers.co.kr/learn/challenges?tab=all_challenges"
def get_max_page():
req = requests.get(url)
soup = BeautifulSoup(req.text,"html.parser")
pages = soup.find_all("li",{"class":"page-item"})
max_page = pages[-2].string
return max_page
def get_problems(num):
page_url = f"{url}&page={num}"
req = requests.get(page_url)
soup = BeautifulSoup(req.text,"html.parser")
algorithm_list = soup.find("div",{"class":"algorithm-list"}).find_all("div",{"class":"col-item"})
# title, link, level, langs []
ret = []
for item in algorithm_list:
tmp = {}
tmp["title"] = item.find("h4",{"class":"title"}).string
link = "https://programmers.co.kr"
link += item.find("a")["href"]
tmp["link"] = link
tmp["level"] = item.find("div",{"class":"card-algorithm"})["class"][1]
ret.append(tmp)
#languages = algorithm_list[4].find("div",{"class":"languages"}).find_all("div",{"data-container":"body"})
# langs = []
# for language in languages:
# lang = language["data-original-title"]
return ret
def process():
max_page = int(get_max_page())
file = open("problems.csv", mode="w")
writer = csv.writer(file)
writer.writerow(["title","link","level"])
for i in range(1,max_page+1):
tmp = get_problems(i)
for j in tmp:
writer.writerow(list(j.values()))
return
process()
생각보다 간단한 작업이지만 프로그래머스 html코드를 파악하는데 시간이 좀 걸렸다.
총 198문제. 나중에 이걸로 sql문을 한번 작성해볼까? 우선은 여기까지 복습 끝!
728x90
300x250