1. indeed.com 에서 python 관련 일자리 스크랩

이제부터 우리가 할 일은 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 문을 통해 하나하나 훑어야한다.

2. 페이지 안에 있는 정보 긁어오기

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 해온 모든 문장을 훑으면서 원하는 것을 찾아낸다.
profile
'과연 이게 최선일까?' 끊임없이 생각하기

0개의 댓글

Powered by GraphCDN, the GraphQL CDN