본문 바로가기

세상 바라보는 시선 👁/Growth Hacking

[Python] Web scrapper - indeed.com (노마드코더)


@pixabay.com

import requests
# 좌측 메뉴에서 packge에 들어가서 request를 설치한다. : pip install requests
from bs4 import BeautifulSoup #beautiful Soup <- S 대문자여야 하낟
# Beautifulsoup4 로 다운로드 한다. html scrapper package : pip install bs4 , from bs4 import BeautifulSoup


LIMIT = 50
URL = f"https://www.indeed.com/jobs?q=python&limit={LIMIT}"
################################
def extract_indeed_pages():
  url_result = requests.get(URL)

  # print(indeed_result) # 출력 : <Response[200]>
  # print(indeed_result.text) # 출력 모든게 다나옴

  soup = BeautifulSoup(url_result.text,"html.parser")
  #class 
  pagination = soup.find("div", {"class":"pagination"})

  links = pagination.find_all('a') #links는 list로 만들어진다.

  pages = [] #span list를 담을 그릇 

  for link in links[:-1] : #[:-1] 뒤에 마지막 것 제외하고 출력하기 
    pages.append(int(link.find("span").string)) #.string을 이용해서 text만 가져옴, 가져온 text를 int로 바꿔줌
    
  # 가장 마지막 숫자를 찾는다.
  max_page = pages[-1]
  return max_page


# TITLE  가져오고 각각 REQUEST 보냄
def extract_indeed_jobs(last_page):
  jobs = []
  for page in range (last_page):
    print(f"스크랩해온 페이지는 {page}/{last_page}입니다")
    result = requests.get(f"{URL}&start={page*LIMIT}") #변수끼리 계산할 것이 있으면 계산할 것 하고 {}로 닫아준다
    print(result.status_code) #반응하는지 확인, 200이 20개 나와줘야함.
    soup = BeautifulSoup(result.text,"html.parser")
    # 제목 division을 찾아온다
    results = soup.find_all("div", {"class":"jobsearch-SerpJobCard"})
    
    # 각 페이지에서 List 로 생성된 results를 for 구문으로 돌린다.
    for result in results : 

      #title을 추출함
      title = result.find("div", {"class":"title"}).find("a")["title"] #list에서 title value 에 배정된 값을 가져와

      #Company 이름을 추출함
      company = result.find("span",{"class":"company"})
      company_anchor = company.find("a")
      if company_anchor is not None: #anchor가 있으면 anchor 내용을 가져온다.
        company = company_anchor.string
      else:
        company = company.string  # 여백이 너무 많아서 .strip()을 이용하여 지워줌
      company = company.strip()

      #Location 추가 함
      location = result.find("div",{"class":"recJobLoc"})["data-rc-loc"] #data-rc-loc에 배정된 내용을 가져온다.

      #job_id 추가함  : 다른 페이지 링크로 연결됨
      job_id = result["data-jk"]

      # 전체 다 가지는 배열 만듦
      
      job = {
        'title':title, 
        'company':company, 
        'location':location, 
        'link': f"https://www.indeed.com/viewjob?jk={job_id}"
        } #job list에 하나씩 쌓아줌. 
      jobs.append(job) 
  return jobs
###################################

max_indeed_page = extract_indeed_pages()
indeed_jobs = extract_indeed_jobs(max_indeed_page)

###################
import csv
def save_to_file(lists):
  file = open("jobs.csv", mode = "w") #open :파일이 없으면  만들어줌
  print(file) 

  writer = csv.writer(file)
  writer.writerow(["title", "company","location","link"])

  for list in lists:
    writer.writerow([list["title"], list["company"],list["location"],list["link"]])
    # ☆더 편하게 하는 방법은 list.values()☆☆ 로 하면, dictionary의 value값만 가져올 수 있다.
    # .values를 쓰면 dict_value가 붙으므로 list()로 감싸줘야한다.
  
save_to_file(indeed_jobs)
♡를 눌러주시면 블로그를 작성하는데 큰 힘이 됩니다♪
로그인이 필요없어요.

이 블로그 인기글