본문 바로가기
Back-end/Python Scrapper

파이썬으로 웹스크래퍼 만들기 - 5

by devraphy 2020. 8. 5.

 1. StackOverflow를 이용한 크롤링 예제  

- 이번에는 StackOverflow를 이용해 스크래퍼를 만들어봅시다. 이전 포스팅에서와 같은 방식으로 직접 만들어보세요. 

- 아래에 저의 코드를 함께 올려놓겠습니다. 


1. indeed.py

import requests

from bs4 import BeautifulSoup

 

LIMIT = 50

INDEED_URL = f"https://kr.indeed.com/jobs?q=java&l=%EC%84%9C%EC%9A%B8%ED%8A%B9%EB%B3%84%EC%8B%9C&jt=new_grad&limit={LIMIT}&radius=25"

 

#검색결과 마지막 페이지번호 찾는 function

def get_last_pages(): 

    result = requests.get(INDEED_URL)

    soup = BeautifulSoup(result.text, "html.parser")

    pagination = soup.find("div", {"class": "pagination"})

    links = pagination.find_all('a')

    pages = []

 

    for link in links[:-1]:

        pages.append(int(link.string))

 

    max_page = pages[-1]

    return max_page

 

#아래의 extract_jobs에서 추출한 html을 기반으로 원하는 상세 정보를 찾는 function

def extract_job(html):

    title = html.find("h2", {"class": "title"}).find("a")["title"]

    company = html.find("span", {"class": "company"})

    company_anchor = company.find("a")

    location = html.find("span", {"class": "location"}).string

    job_id = html["data-jk"]

 

    if company_anchor is not None:

        company = str(company_anchor.string)

    else:

        company = str(company.string)

 

    company = company.strip()

    return {

    'title': title,

    'company': company,

    'location': location,

    'link': f"https://kr.indeed.com/viewjob?jk={job_id}"

    }

 

#검색결과를 html로 parse해서 soup을 만드는 function

def extract_jobs(last_page):

    jobs = []

 

    for page in range(last_page):

        print(f"Scrapping INDEED: Page: {page}")

        result = requests.get(f"{INDEED_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)

            jobs.append(job)

        return jobs

 

def get_jobs():

       last_pages = get_last_pages()

       jobs = extract_jobs(last_pages)

       return jobs


2. so.py

 

import requests

from bs4 import BeautifulSoup

 

URL = "https://stackoverflow.com/jobs?q=python"



def get_last_page():

     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)

#아래 extract_jobs에서 range함수를 사용하기 위해 정수형 변환



def extract_job(html):

     title = html.find("h2", {"class": "mb4"}).find("a")["title"]

     company, location = html.find("h3", {"class": "fc-black-700"}).find_all("span", recursive=False)

 

#html.find("h3",{"class":"fc-black-700"}).find_all("span",recursive=False)이 깊이에는 동일한 깊이의 span이 두개가 존재한다. 첫번째 span은 회사 이름을, 두번째 span은 회사 위치를 갖고 있다. 이런 경우, 우리는 company, location 이런식으로 변수를 지정할 수 있다. python의 장점이다.

 

#recursive를 사용하는 이유는 회사 이름과 위치가 같은 깊이의 두개의 span에 들어있는데 다른 깊이에 있는 태그는 출력하지 않게 하기 위함이다.

 

     company = company.get_text(strip=True)

     location = location.get_text(strip=True)

 

     job_id = html["data-jobid"]

     link = f"https://stackoverflow.com/jobs/{job_id}"

 

     return {

     "title": title,

     "company": company,

     "location": location,

     "apply_link": link

     }

 

def extract_jobs(last_page):

 

     jobs = []

 

     for page in range(last_page):

          print(f"Scrapping SO: Page: {page}")

          result = requests.get(f"{URL}&pg={page}")

          #0부터 시작하기때문에 1페이지부터 시작하게 만들기 위해 page+1을 넣음

          soup = BeautifulSoup(result.text, "html.parser")

          results = soup.find_all("div", {"class": "-job"})

 

         for result in results:

               job = extract_job(result)

               jobs.append(job)

     return jobs

 

def get_jobs():

     last_page = get_last_page()

     jobs = extract_jobs(last_page)

     return jobs


3.main.py

from indeed import get_jobs as get_indeed_jobs

from so import get_jobs as get_so_jobs

 

so_jobs = get_so_jobs()

indeed_jobs = get_indeed_jobs()

 

jobs = so_jobs + indeed_jobs

print(jobs)


이제 이 코드를 이용하여 데이터를 출력하고 csv파일로 export 해봅시다.

다음 포스팅을 기다려주세요! 

댓글