이제부터 우리가 할 일은 indeed.com 이라는 일자리 구직사이트에서 python 관련된 일자리 정보를 전부끌어모아서 엑셀에 보기좋게 정리하는 프로그램을 하나 만들거다. 우선 프로그램의 전체적인 로직은 : "indeed.com 접속--> 페이지 수를 세기-->각각의 페이지에 출력된 일자리정보(이름,회사,장소,링크)를 긁어냄-->보기좋게 엑셀에 정리." 라고 하면 되겠다.
그럼 먼저python 관련결과물의 페이지수를 알아내고 각 페이지안에 있는 정보를 뽑아내 보자.
P.S: 중요한 것은 검사를 통해 뽑아내고자 하는 정보가 어떤 태그에 담겨있는지 정확히 확인하는 것이다. 그래야 그 태그를
Beautifulsoup 로 잘 뽑아낼 수 있다.
import requests
from bs4 import BeautifulSoup
LIMIT = 50
URL = f"https://www.indeed.com/jobs?q=python&limit={LIMIT}"
# 긁어오고 싶은 웹사이트 주소를 우선 URL 에 담아주자.
# 그냥 URL = "https://www.indeed.com/jobs?q=python&limit=50" 이라고 해도 되는데 왜 LIMIT 을 따로 빼서 변수로 만들었을까? (참고로 'limit=숫자' 는 숫자만큼의 결과가 출력된다는 뜻이다.)
# 표시되는 페이지를 더 직관적으로 간편하게 바꿀 수 있게 하기 위해서지 않았을까?
def last_page():
result = requests.get(URL) #'URL' 이라고 해서 NO SCHEMA SUPPLIED 라고 ERROR 떴었음..;; 그래서 ''없이 타이핑할것!
soup = BeautifulSoup(result.text, "html.parser")
pagi = soup.find("div", {"class" : "pagination"})
# 검사를 통해 페이지태그를 살펴보았다. div class=pagination 에 담겨있더라
link = pagi.find_all('a')
# pagination 안에 있는 모든 a 태그를 찾아낸다. 왜냐면 a 태그안에 페이지가 담겨있기 때문.
spans = []
for span in link[:-1]: # 마지막 원소 빼고 다 출력
spans.append(int(span.string))
# 그리고 그 링크를 순회해서 안에있는 span만뽑아내어 페이지 숫자를 string으로 바꾼다음 spans 리스트에 저장한다.
max_page = spans[-1] # 마지막 next 전에 있는 숫자가 마지막 페이지이므로.
return max_page # 이 함수를 통해서 maxpage 데이터 value 저장함. return 으로 저장안하고 그냥 print 만 하면 나중에 값을 불러올때 none 이라고 뜰것임.
# sp = link.find("span", {"class":"pn"})
# print(sp)
# 위에건 왜 안될까? 리스트라서 싱글 원소로 취급하지 말라고 하던데.(You're probably treating a list of elements like a single element.)
# 답변: link 안에 a 가 여러개 있다. find("a") 이 함수 는 결과값중에 젤 앞에 있는 것만 찾아내는 함수이다. 페이지 안에 있는 모든 링크태그중에 제일 위에있는것만.
# find_all("a")은 페이지 안에 있는 모든 링크를 찾아내는거고. 그래서 find_all로 찾아낸건 find_all로 끝내거나 for 문을 통해 하나하나 훑어야한다.
last_page 함수에서 구해내었던 결과값의 마지막 페이지를 아래의 함수 인자로 대입한다.
def extractor_indeed_jobs(last_page):
jobs = []
for page in range(last_page)[:10]: # 결과값이 너무많아서 테스트용으로 열페이지만 짤랐다.
print(f"scrapping INDEED Page: {page}") # 얼마나 많은 페이지를 긁어오느냐를 표시해준다.
result = requests.get(f"{URL}&start={page*LIMIT}")
soup = BeautifulSoup(result.text,"html.parser")
results = soup.find_all("div", {"class": "jobsearch-SerpJobCard"})
# 위의 클래스 안에 관련정보가 다 들어있으므로.
for result in results:
job = extract_job(result) #extract_job 함수는 다음 글에서 만들 예정.(더 상세하게 파고들어 정보를 긁어내는 함수)
jobs.append(job) # 그 결과값을 하나하나 job 리스트에 저장.
return jobs
# 다시 한 번더 requests, Beautifulsoup 함수를 써준다. 그리고 두번째 nested for 문을 통해 scrap 해온 모든 문장을 훑으면서 원하는 것을 찾아낸다.