indeed페이지 scrapping 시작!

yhko1992·2021년 11월 16일
0

PYTHON - SCRAPPER

목록 보기
2/17
post-thumbnail

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개의 댓글