indeed와 stackoverflow 사이트에서 구직 정보를 가져오는 웹스크래퍼를 만들어 본다.
- requests
API를 사용할 때 주로 사용한다. 사용을 할때는 보통 HTTP 메소드(method, 또는 함수)의 GET 과 POST를 사용한다. GET을 사용할 때는 requests.get()을 사용하고, POST를 사용할때는 requests.post()를 사용한다.- Beautiful Soup
기본적으로 패키지 import를 통해서 가져오며html
파일을 가져오거나urllib
혹은requests
모듈을 통해서 직접 웹에서 소스를 가져올 수도 있다.
def get_last_page():
result = requests.get(URL) # 1.1.1
soup = BeautifulSoup(result.text, "html.parser") # 1.1.2
pagination = soup.find("div", {"class":"pagination"}) # 1.1.3
links = pagination.find_all('a') # 1.1.4
pages = []
for link in links[:-1]: # 1.1.5
pages.append(int(link.find("span").string)) # 1.1.6
max_page = pages[-1] # 1.1.7
return max_page # 1.1.8
1.1.1 requests를 통해 웹에 있는 소스 가져올 수 있다.
1.1.2 데이터 추출(extract data)
1.1.3 class명이 pagination인 div 찾기
1.1.4 모든 a(anchor) 찾아서 리스트를 만든 후 links 변수에 넣기
1.1.5 마지막값이 string(문자열)이기 때문에 제외
1.1.6 span을 찾아서 pages라는 array에 넣어줌
1.1.7 pages의 마지막값(-1)
1.1.8 max_page 반환
def extract_job(html):
title = html.find("h2", {"class": "title"}).find("a")["title"]
company = html.find("span", {"class": "company"}) # 1.2.1
company_anchor = company.find("a")
if company: # 1.2.2
company_anchor = company.find("a")
if company_anchor is not None:
company = str(company_anchor.string)
else:
company = str(company.string)
company = company.strip() # 1.2.3
else:
company = None
location = html.find("div", {"class": "recJobLoc"})["data-rc-loc"] # 1.2.4
job_id = html["data-jk"] # 1.2.5
return {
'title': title,
'company': company,
'location': location,
"link": f"https://kr.indeed.com/viewjob?jk={job_id}"
}
1.2.1 find는 첫번째 결과만
1.2.2 company가 있는지 없는지 확인
1.2.3 string에 있는 문자를 삭제. 이 경우 (빈칸)으로 시작되는 문자 삭제 <- white space 제거
1.2.4 data-rc-loc의 값을 가져옴. div안의 attribute에 접근
1.2.5 html에서 div의 data-jk값(=job id)을 가져옴
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}") # 1.3.1
soup = BeautifulSoup(result.text, "html.parser")
results = soup.find_all("div", {"class": "jobsearch-SerpJobCard"}) # 1.3.2
for result in results:
job = extract_job(result) # 1.3.3
jobs.append(job) # 1.3.4
return jobs
1.3.1 페이지 요청
1.3.2 find_all은 리스트 전부를 가져옴
1.3.3 extract_job 함수를 호출해서 html 인자를 받음. 여기서 html은 request한 결과를 담은 result이다.
1.3.4 이 function은 job을 반환하고 이 반환된 값을 jobs라는 array에 넣어줌.