https://github.com/wook2124/Web_Scraping
<복습>
https://wook-2124.tistory.com/52
<준비물>
<코드기록>
# 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
위에 정리했던 방법대로 옮겨주면,
Physical Therapy Jobs, Web Scraping 끝!!
※ 신종 코로나 바이러스 조심하세요!!!!
댓글