본문 바로가기

Python으로 웹 스크래퍼 만들기

Python으로 웹 스크래퍼 만들기 복습 7일차 (Feat. 노마드코더)

본 포스팅은 노마드코더님의 온라인 강의에 대한 복습을 기록하기 위한 포스팅입니다.

※ 본 포스팅의 내용은 강의를 들은 후 필자의 개인적인 의견을 기재한 것이니, 정답이 아닐 수 있음을 참고하십시오.

강의 소개 : 파이썬으로 웹 스크래퍼 만들기 (2주 완성반)
  -. 내용 : 파이썬 기초 (타입, 변수, 함수, 클래스 등 및 웹 스크래퍼 코드 작성법)
  -. 비용 : 100% 무료 강의
  -. 비고 : 한글 자막 제공 / 강의 100% 완료 시 10% 할인 쿠폰 제공
온라인 강의 : https://nomadcoders.co/
    /    풀스택 개발자 로드맵 : https://nomadcoders.co/roadmap
유튜브 채널 : https://www.youtube.com/channel/UCUpJs89fSBXNolQGOYKn0YQ
 

노마드 코더 Nomad Coders

한국인 린과 콜롬비아인 니꼴라스의 프로젝트 "노마드 코더" 입니다. 2015년 떠나, 현재까지 원하는 곳에서 일하며, 살고 있습니다. + + Nomad Academy: https://nomadcoders.co

www.youtube.com


 

#2.10 StackOverflow extract jobs & #2.11 StackOverflow extract job

#2.12 StackOverflow extract job part Two & #2.13 StackOverflow Finish

 

  1) Indeed 사이트 + Stackoverflow 사이트 일자리 정보 조회하기 전체 소스코드

""" main.py """

from indeed import get_jobs as get_indeed_jobs 
from stackoverflow import get_jobs as get_stackoverflow_jobs 

indeed_jobs = get_indeed_jobs() 
stackoverflow_jobs = get_stackoverflow_jobs() 

jobs = indeed_jobs + stackoverflow_jobs

print(jobs)
""" indeed.py """

import requests
from bs4 import BeautifulSoup

LIMIT = 50
# 스크래핑 하려는 URL 저장
URL = f"https://www.indeed.com/jobs?q=python&limit={LIMIT}"


# "Indeed" 웹사이트를 스크래핑 하는 Function 생성
def extract_pages():

    # url에 저장된 웹사이트를 requestsdml get Function을 사용하여 가져오기
    result = requests.get(URL)

    # # html을 text로 가져오기
    # print(result.text)
    # bs4를 이용하여 "Indeed" 검색 결과를 html로 가져오기
    soup = BeautifulSoup(result.text, 'html.parser')

    # "div" Tag 중 Class가 "pagination"인 것 가져오기
    pagination = soup.find("div", {"class": "pagination"})
    # "pagination" 변수에 저장된 html 중에서 "anchor" Tag 인 것 모두 가져와서 리스트로 저장
    links = pagination.find_all("a")

    # span을 저장할 빈 리스트 객체 생성
    pages = []
    # "links" 리스트에 저장된 값을 차례대로 "link"라는 객체로 받아온 후 "span" Tag 인 것을 "pages" 리스트에 추가 # [:-1] = "links" 리스트에 저장된 값 중 마지막 값을 제외한다는 뜻
    for link in links[:-1]:
        # pages.append(link.find("span").string)
        # anchor Tag의 String을 가지고 와도 span의 String을 가지고 온다
        pages.append(int(link.string))

        # # "pages" 리스트에 저장된 값 중 마지막에서 1번째 item
        # print(pages[-1])

        # "pages"에 저장된 값 중 가장 큰 값(마지막 값)만 가져오기
        max_page = pages[-1]

    return max_page


def extract_job(html):
    # h2 Tag중 클래스가 title 인것 중에서 anchor Tag속의 attribute 가 "title"인 것
    title = html.find("h2", {"class": "title"}).find("a")["title"]
    company = html.find("span", {"class": "company"})

    # company 중에 "a" Tag가 있는 경우
    if company.find("a") is not None:
        company = str(company.find("a").string)
    else:
        company = str(company.string)

    # company 값의 앞/뒤에 있는 공백 삭제하기
    company = company.strip()

    # # locaiton 값이 없는 일자리가 있어서 None이 출력 되는 경우 발생
    # location = html.find("span", {"class":"location"})
    location = html.find("div", {"class": "recJobLoc"})["data-rc-loc"]

    job_id = html["data-jk"]

    return {
        "title": title,
        "company": company,
        "location": location,
        "link": f"https://www.indeed.com/viewjob?jk={job_id}"
    }


def extract_jobs(last_pages):
    jobs = []
    for page in range(last_pages):
        print(f"Scrapping Indeed Page : {page}")
        result = requests.get(f"{URL}&start={page*LIMIT}")
        soup = BeautifulSoup(result.text, 'html.parser')

        # Indeed에서 각 직업별 정보를 리스트로 가져오기
        results = soup.find_all("div", {"class": "jobsearch-SerpJobCard"})
        # 여러개의 결과에서 1개 일자리에 대한 정보 찾기
        for result in results:
            job = extract_job(result)

            jobs.append(job)

    return jobs


def get_jobs():
    # "indeed" Object의 "extract_pages" Function 호출
    last_page = extract_pages()
    # "indeed" Object의 "extract_jobs" Function 호출
    jobs = extract_jobs(last_page)

    return jobs
""" stackoverflow.py """

import requests
from bs4 import BeautifulSoup

# 스크래핑 하려는 URL 저장
URL = f"https://stackoverflow.com/jobs?q=python"

def extract_pages():
  result = requests.get(URL)
  soup = BeautifulSoup(result.text, "html.parser")

  pages = soup.find("div", {"class":"s-pagination"}).find_all("a")

  last_page = pages[-2].get_text(strip=True)
  
  return int(last_page)

def extract_job(html):
  title = html.find("h2").find("a")["title"]
  company, location  = html.find("h3").find_all("span", recursive=False)
  company = company.get_text(strip=True)
  location = location.get_text(strip=True).strip("-").strip(" \r").strip("\n")
  job_id = html["data-jobid"]

  return{
    "title": title,
    "company": company,
    "location": location,
    "link": f"https://stackoverflow.com/jobs/{job_id}"
  }


def extract_jobs(last_pages):
    jobs = []
    for page in range(last_pages):
        print(f"Scrapping StackOverFlow Page : {page}")
        result = requests.get(f"{URL}&pg={page}")
        soup = BeautifulSoup(result.text, 'html.parser')

        # Indeed에서 각 직업별 정보를 리스트로 가져오기
        results = soup.find_all("div", {"class": "-job"})
        # 여러개의 결과에서 1개 일자리에 대한 정보 찾기
        for result in results:
            job = extract_job(result)

            jobs.append(job)

    return jobs


def get_jobs():
    # "indeed" Object의 "extract_pages" Function 호출
    last_page = extract_pages()
    # "indeed" Object의 "extract_jobs" Function 호출
    jobs = extract_jobs(last_page)

    return jobs

 

    -. 위 코드를 실행하시면 아래 사진과 같이 일자리 정보를 가져오는 것을 보실 수 있습니다.

    -. stackoverflow의 경우 indeed사이트와 거의 유사하므로 상세한 설명은 생략 하였습니다.

 

 

여기까지 파이썬의 BeautifulSoup4, requests를 이용해 Web Scrapping을 하는 방법을 포스팅하였습니다.

 

내일부터는 위 소스 코드를 이용하여 csv, DB에 저장하는 방법을 포스팅하겠습니다.

 

 

※ 본 포스팅의 내용은 강의를 들은 후 필자의 개인적인 의견을 기재한 것으로,

   정답이 아닐 수 있음을 참고하십시오.

 


이상으로 Python으로 웹 스크래퍼 만들기 복습 7일 차를 마치겠습니다.