파이썬/파이썬

[Python]Indeed와 Stackoverflow 웹 크롤링하기

taehee94 2022. 3. 8. 16:12

indeed사이트에서 원하는 정보를 가져와서 저장해보려고합니다.

indeed사이트 뿐만 아니라 다른 사이트에서도 정보 가져올수 있으니, 이 코드를 참고해주길 바랍니다.

1.Request와 beautifulsoup 임포트해줍니다.

import requests
from bs4 import BeautifulSoup

LIMIT = 50
URL = f'https://www.indeed.com/jobs?q=python&limit={LIMIT}'

크롤링 할 url 저장하고, 저장할 자료의 개수 지정까지 해줍니다.

 

2.마지막 페이지 지정해주는 함수 설정합니다.

def get_last_page():
    result = requests.get(URL)
    soup = BeautifulSoup(result.text, "html.parser")
    pagenation = soup.find("div", {"class": "pagination"})
    links = pagenation.find_all('a')
    pages = []
    for link in links[:-1]:
      pages.append(int(link.string))
    max_page = pages[-1]
    return max_page

웹 크롤링할때, soup.find함수를 통해 div태그안에 class명이 pagination인 것을 찾아내서 pagenation에 저장합니다.

(pagenation은 indeed홈페이지의 page링크 수 입니다.)

그리고 pagenation안에서 태그가 a인 것을 모두 찾아내 links에 저장하고, links의 처음부터 마지막전까지 pages에 추가하고, 마지막 페이지인 max page를 불러오게 함수를 설정합니다.(기계는 0부터 세기 때문에 내가 보고있는 페이지를 제외한 page2부터 0으로 인식합니다.)

 

3. job정보 크롤링하는 함수 설정합니다.

def extract_job(html):
    title = html.select_one('.jobTitle>span').string
    company = html.find("span", {"class": "companyName"})
    company_anchor = company.find("a")
    if company_anchor is not None:
        company = str(company.find("a").string)
    else:
        company = str(company.string)
    company = company.strip()
    location = html.find("div", {"class": "companyLocation"}).string
    job_id = html["data-jk"]
  
    return {
        'title': title,
        'company': company,
        'location': location,
        'link': f"https://kr.indeed.com/python%EC%A7%81-%EC%B7%A8%EC%97%85?vjk={job_id}"
    }

company에는 태그가 a인 것들을 str로 변환해 넣어줍니다. 태그가 a인 것이 없다면, company를 str로 변환해 넣어줍니다. 그후에, strip()함수를 이용해, 좌우 공백을 없애줍니다.

class명이 companyLocation인 것을 찾아서 location에 넣어주고, div가 data-jk인 것을 출력해줍니다.

def extract_jobs(last_page):
  jobs = []
  for page in range(last_page):
    print(f"Scrapping Indeed: Page {page+1}")
    result = requests.get(f"{URL}start={page * LIMIT}")

    soup = BeautifulSoup(result.text, "html.parser")
    results = soup.find_all("a", {"class": "tapItem"})

    for result in results:
      job = extract_job(result)
      jobs.append(job)
  return jobs

마지막 페이지까지 정보를 모아주는 함수입니다.

 

4.저장함 함수를 얻을 수 있는 함수 설정해주기.

def get_jobs():
  last_page = get_last_page()
  jobs = extract_jobs(last_page)
  return jobs

5.Stackoverflow에서 크롤링하는 함수 설정해주기.

import requests
from bs4 import BeautifulSoup

URL = f'https://stackoverflow.com/jobs?q=python&sort=i'

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)

def extract_job(html):
  job = {}
  title = html.find("h2").find("a") ["title"]
  com_loc = html.find("h3",{"class":"fs-body1"}).find_all("span",recursive=False) 
  company = com_loc[0].get_text(strip=True)
  location = com_loc[1].get_text(strip=True)
  job_id = html['data-jobid']

  job['title'] = title 
  job['company'] = company
  job['location'] = location
  job['link'] = f"https://stackoverflow.com/jobs/{job_id}"
  return job

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+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

indeed와 매우 유사해서, 따로 설명은 하지 않겠습니다.

 

6.저장해주는 함수 설정하기

import csv

def save_to_file(jobs):
 # jobs.replace('\xa0',' ')
  file = open("jobs_.csv", mode="w",encoding='utf-8')
  writer = csv.writer(file)
  writer.writerow(["title", "company", "location", "link"])
  for job in jobs:
    writer.writerow(list(job.values()))
  return

csv파일을 열고 크롤링한 정보를 넣어준 뒤 저장해주는 함수입니다.

 

7.main함수 설정해주기

from indeed import get_jobs as get_indeed_jobs
from so import get_jobs as get_so_jobs
from save import save_to_file



print("indeed_jobs")
indeed_jobs = get_indeed_jobs()
print("so_jobs")
so_jobs = get_so_jobs()

print("jobs")
jobs = so_jobs + indeed_jobs

print("save_to_file")
save_to_file(jobs)

Indeed와 Stackoverflow에서 job정보를 크롤링하고,저장까지 할 수 있는 함수를 실행해주는 장소입니다.