지금 div "class" : "jobsearch-SerpJobCard" 안으로 들어간 상태이다. 여기서 또다시 for loop을 돌려 안에 있는 자세한 정보를 긁어모을생각이다. 니콜라스는 코드가 복잡해지면 그 코드만 따로 빼서 함수로 만드는게 좋다고 했다.(바닐라 자바할때도 필요한 기능을 추가할때 아예 자바스크립트 파일을 따로 하나 더 만들어서 거기서 작업하는 divide and conquer 방식이 좋다고 했다.)
def extract_job(html): # 여기서 html 은 jobsearch 클래스를 의미한다.
title = html.find("h2", {"class": "title"}).find("a")["title"]
# chaining 이라고 한다. title=~~ + anchor = title.find("a")["title"]를 한 문장으로 묶었다.
# 따라서 말로 풀면은 "h2(class:title) 태그 안에 a<title=~~> 태그가 있는데 ~~를 뽑아내라"는 뜻이다.
company = html.find("span", {"class": "company"})
company_anchor = company.find("a")
if company_anchor is None: # a 태그가 없으면 span 태그를 바로 뽑아내고
company = str(company.string)
else: # a 태그가 없는게 아니면 a 태그를 뽑아낸다.
company = str(company_anchor.string)
company = company.strip()
# 이번에는 회사 이름을 scrap 해볼거다. 검사를 통해 알아봤는데 <span class=company> 라고 되어있고
# child 로 링크안에 회사이름이 기재되어있는것도 있고 span 태그안에 바로 기재되어있는 것도 있어서 if/else 문법을 써주었다.
# 그리고 span태그 a 태그를 나누어서 변수에 담고 사용하였다. 그리고 str 함수로 글자변환한다음에 space 를 없애주려고 strip() 함수도 사용해주었다.
# 이로써 깔끔하게 company 까지 출력이 된다.
location = html.find("div", {"class":"recJobLoc"})["data-rc-loc"]
job_id = html["data-jk"]
link = f"https://www.indeed.com/viewjob?jk={job_id}"
return {'Title': title ,
'Company': company ,
'location': location,
'link':link
}
# 중요한건 장소, 링크를 뽑아낼때, 검사를 통해 해당 장소코드가 어디에 위치하는지, 그리고 링크의 url 은 어떻게 생성되는지 알아내야한다.
# 장소는 location 에서 div class=recjobloc 안에 attribute 로 data-rc-loc에 명시되어있었고 링크는 클릭해서 url을 보고 구성하였다.
# link url을 보니 job_id를 각각 할당받아 구성되어진걸 확인 할 수 있었다. 그래서 job_id를 변수로 따로 담았다.
# 그리고 return을 위와 같은 방법으로 구성해주어 보기 쉽게 하였다.
이때까지 만든 함수 간의 로직을 만들어 그것을 또 다시 새로운 함수에 넣을거다.
def get_jobs():
max_indeed_pages = last_page()
indeed_jobs = extractor_indeed_jobs(max_indeed_pages)
return indeed_jobs
# return 하는 거 잊지말자!
이렇게 하고 나중에 scrapper.py 라는 파일을 따로 만들어서 그 파일안에 실행코드만 적어주면 더 깔끔하게 프로그램을 관리할 수 있게 된다.
아래 코드처럼 말이다.
from so import get_jobs as so_jobs
s_job = so_jobs()
print(s_job)
그러고 터미널에서 실행해 보면 아래와 같이 결과가 나온다.
C:\>"python scraper\scraper.py"
scrapping INDEED Page: 0
scrapping INDEED Page: 1
scrapping INDEED Page: 2
scrapping INDEED Page: 3
scrapping INDEED Page: 4
scrapping INDEED Page: 5
scrapping INDEED Page: 6
scrapping INDEED Page: 7
scrapping INDEED Page: 8
scrapping INDEED Page: 9
[{'Title': 'Python Developer Intern', 'Company': 'OXO Solutions', 'location': 'Ruby, SC', 'link': 'https://www.indeed.com/viewjob?jk=84a541c104b5b24c'}, {'Title': 'Python Developer | Richmond, VA (Remote until 2021)', 'Company': 'iknowvate technologies', 'location': 'Richmond, VA', 'link': 'https://www.indeed.com/viewjob?jk=5a9a0ac14d0aaba7'},