728x90
지난 포스팅에 이어서 받아온 정보들을 이용해서 각 페이지를 request 해보자.
1페이지 말고 다른 페이지를 눌러보면 주소창에 &start=
해서 숫자가 입력된걸 볼 수 있다.
1페이지당 50개의 결과를 보여주고 그 페이지는 50 * page number -1
부터 시작한다.
예를들면 1페이지는 0이니까 없어도 되고, 2페이지는 start = 50, 3페이지는 start = 100 이런식이다.
indeed에서 추출하는 역할을 하는 파일을 따로 생성하고 main.py
에서는 그 결과를 이용할 수 있게 바꿔보자.
indeed.py라는 새로운 파일을 생성하고 아래와 같이 함수형태로 바꿔준다.
indeed.py
import requests
from bs4 import BeautifulSoup
INDEED_URL = "https://kr.indeed.com/jobs?q=python&limit=50"
def extract_indeed_pages():
result = requests.get(INDEED_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))
print(pages)
max_page = pages[-1]
return max_page
main.py
에서 indeed.py
를 불러와서 출력해보자.
from indeed import extract_indeed_pages
max_indeed_pages = extract_indeed_pages()
print(max_indeed_pages)
이번에는 각 페이지마다 요청을 해서 요청 코드를 확인해보자.
main.py
from indeed import extract_indeed_pages, extract_indeed_jobs
last_indeed_pages = extract_indeed_pages()
extract_indeed_jobs(last_indeed_pages)
indeed.py
import requests
from bs4 import BeautifulSoup
LIMIT = 50
INDEED_URL = f"https://kr.indeed.com/jobs?q=python&limit={LIMIT}"
def extract_indeed_pages():
result = requests.get(INDEED_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_indeed_jobs(last_page):
for page in range(last_page):
result = requests.get(f"{INDEED_URL}&start={page*LIMIT}")
print(result.status_code)
return
이번에는 채용 정보를 가져와보자. 검색 탭에 보면 jobsearch-SerpJobCard
가 있다. 그 안의 title을 가져와보자.
jobsearch-SerpJobCard
-> title
-> <h2 ~~~ title= " 제목">
을 가져올 것이다.
import requests
from bs4 import BeautifulSoup
LIMIT = 50
URL = f"https://kr.indeed.com/jobs?q=python&limit={LIMIT}"
def extract_indeed_pages():
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_indeed_jobs(last_page):
jobs = []
# for page in range(last_page):
result = requests.get(f"{URL}&start={0*LIMIT}")
soup = BeautifulSoup(result.text,"html.parser")
results = soup.find_all("div",{"class":"jobsearch-SerpJobCard"})
for result in results:
title = result.find("h2", {"class": "title"}).find("a")["title"]
print(title)
return jobs
위와 같은 방식으로 title , company, location, Link
를 가져와보자.
main.py
from indeed import extract_indeed_pages, extract_indeed_jobs
last_indeed_pages = extract_indeed_pages()
indeed_jobs = extract_indeed_jobs(last_indeed_pages)
indeed.py
import requests
from bs4 import BeautifulSoup
LIMIT = 50
URL = f"https://kr.indeed.com/jobs?q=python&limit={LIMIT}"
def extract_indeed_pages():
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("h2", {"class": "title"}).find("a")["title"]
company = html.find("span", {"class": "company"})
company_anchor = company.find("a")
if company_anchor is not None:
company = str(company_anchor.string)
else:
company = str(company.string)
company = company.strip() # 빈칸을 지워줌
location = html.find("div", {"class": "recJobLoc"})["data-rc-loc"]
job_id = html["data-jk"]
return {
"title": title,
"company": company,
"location": location,
"Link": f"https://kr.indeed.com/viewjob?jk={job_id}"
}
def extract_indeed_jobs(last_page):
jobs = []
for page in range(last_page):
print(f"Scrapping 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
728x90
300x250