본문 바로가기
Python/Project

[Project] Physical Therapy Jobs - Web Scraping (#코딩공부)

by 함께 공부해요 2020. 3. 3.

https://github.com/wook2124/Web_Scraping

 

wook2124/Web_Scraping

Physical Therapy Jos / Python Jobs. Contribute to wook2124/Web_Scraping development by creating an account on GitHub.

github.com


<복습>

https://wook-2124.tistory.com/52

 

[Python] #3.5 Extending Classes / #3.6 Whats Next (#코딩공부)

https://youtu.be/fwLfwxOeqWo <복습> https://wook-2124.tistory.com/51 [Python] #3.3 Methods part One (#코딩공부) https://youtu.be/dQK55j3D6cQ <복습> https://wook-2124.tistory.com/48 [Python] #3.2 Int..

wook-2124.tistory.com

 

<준비물>

https://repl.it/

 

Online IDE, Editor, and Compiler - Fast, Powerful, Free

Repl.it is a simple yet powerful online IDE, Editor, Compiler, Interpreter, and REPL. Code, compile, run, and host in 50+ programming languages: Clojure, Haskell, Kotlin (beta), QBasic, Forth, LOLCODE, BrainF, Emoticon, Bloop, Unlambda, JavaScript, CoffeeS

repl.it

 

<코드기록>

# https://kr.indeed.com/%EC%B7%A8%EC%97%85?q=%EB%AC%BC%EB%A6%AC%EC%B9%98%EB%A3%8C&limit=50&radius=25
# main.py
from pt_indeed import get_jobs as get_indeed_jobs
from save import save_file

indeed_jobs = get_indeed_jobs()

jobs = indeed_jobs 
save_file(jobs)


# pt_indeed.py
import requests
from bs4 import BeautifulSoup

LIMIT = 50
URL = f"https://kr.indeed.com/jobs?q=%EB%AC%BC%EB%A6%AC%EC%B9%98%EB%A3%8C&limit={LIMIT}"

def get_last_page():
    result = requests.get(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

def extract_job(html):
    title = html.find("div", {"class": "title"}).find("a")["title"]
    company = html.find("span", {"class": "company"})
    if company is not None:
      company = str(company.string)
      company = company.strip()
    else:
      company = None  
    location = html.find("div", {"class": "recJobLoc"})["data-rc-loc"]
    job_id = html["data-jk"]
    salary = html.find("span", {"class": "salaryText"})
    if salary is not None:
      salary = str(salary.string)
    else:
      salary = None
    return {
        'title': title,
        'company': company,
        'location': location,
        "link": f"https://www.indeed.com/viewjob?jk={job_id}",
        'salary': salary
    }

def extract_jobs(last_page):
  jobs = []
  for page in range(last_page):
    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)
      jobs.append(job)
  return jobs

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


# save.py
import csv

def save_file(jobs):
  file = open("jobs.csv", mode="w")
  writer = csv.writer(file)
  writer.writerow(["title", "company", "location", "link", "salary"])
  for job in jobs:
    writer.writerow(list(job.values()))
  return

# jobs에 있는 각 job을 가지고 row(행)를 작성함
# job이 가진 값의 list를 row(행)로 가져올 것임

1. URL 수정하기

전에 Web Scraping 하면서 만들어둔 indeed.py를 import한다음, 구하고자하는 Physical Therapy Jobs URL링크로 바꿨다.

 

원래 URL을 그대로 복붙하면, '물리치료'라고 위 URL링크에 나온 것처럼 뜰 줄 알았는데, %EB%....%8C로 길게 변형되서 입력됐다.


2. title 가져오기

title 역시 indeed.py에 해놨던 것에서 div class="title"로 되있으면 그대로 둬도 되지만, 다르면 바꿔줘야 한다.

 

같은 사이트인 indeed에서 검색한 것이라 div class="class"로 변함없음을 알 수 있다.


3. company 가져오기

company 역시 title과 동일하게 확인해주자. span class="company"가 나오면 된다.

 

span class="company"으로 동일하다. company도 패스!


4. location 가져오기

location은 div class="recJobLoc"[data-rc-loc]까지 일치하는지 확인해주면 된다.

 

div class="recJobLoc"[data-rc-loc]으로 동일하다. div id ___ 뒤에 recJobLoc 이라고 명칭을 다시 적으면 이것이 class가 된다.


5. link 가져오기

link는 job link에서 jk= 뒤에 오는 data-jk의 값이 일치하는지 확인해주면 된다.

 

job link를 들어가서 jk= 뒤에 오는 data-jk의 값이 71106ca497d5d617이라는 것을 확인해주고,

 

들어갔던 job link를 inspection(검사, F12)해서 div class="data-jk"의 값이 71106ca497d5d617로 동일한 것을 확인했다.


6. salary 추출하기

Web scraping project를 하고 있지만, 대부분 원래 작성되있던 코드를 재사용하고 있어서 salary를 추가해봤다.

span class="salaryText"를 추출해보자.

 

방법은 company와 비슷하게 먼저 html.find로 soup를 이용해서 span class="salaryText"를 찾고, 만약(if) salary가 None값이 아니고 값이 있다면(salary 값을 적어두지 않은 회사도 있음) salary를 str(문자열)로 출력하고, None 값으로 나와있다면 그냥 None으로 나타내지 않게 코딩했다.


7. save.py, main.py 마무리 하기

다른 항목과 마찬가지로 csv에 추출될 항목으로 salary를 save.py에 추가해주고,

 

main.py에서 pt_indeed로 from을 수정하고 실행하면 끝!


8. csv파일 Google 스프레드시트로 옮기기

추출한 csv파일 내역을 Google 스프레드시트로 옮기면 끝난다.

 

https://wook-2124.tistory.com/45?category=890509

 

[Python] #2.15 Saving to CSV(Comma-separated values) / #2.16 OMG THIS IS AWESOME (#코딩공부)

https://youtu.be/1tGVS0LO2Do <복습> https://wook-2124.tistory.com/44 [Python] #2.14 What is CSV(Comma-separated values) (#코딩공부) https://youtu.be/t2-yu7e7lFM <복습> https://wook-2124.tistory.com/..

wook-2124.tistory.com

위에 정리했던 방법대로 옮겨주면,

 

Physical Therapy Jobs, Web Scraping 끝!!

Physical Therapy Jobs(Web Scraping).xlsx
0.01MB


※ 신종 코로나 바이러스 조심하세요!!!!

댓글