1. StackOverflow를 이용한 크롤링 예제
- 이번에는 StackOverflow를 이용해 스크래퍼를 만들어봅시다. 이전 포스팅에서와 같은 방식으로 직접 만들어보세요.
- 아래에 저의 코드를 함께 올려놓겠습니다.
1. indeed.py
import requests
from bs4 import BeautifulSoup
LIMIT = 50
INDEED_URL = f"https://kr.indeed.com/jobs?q=java&l=%EC%84%9C%EC%9A%B8%ED%8A%B9%EB%B3%84%EC%8B%9C&jt=new_grad&limit={LIMIT}&radius=25"
#검색결과 마지막 페이지번호 찾는 function
def get_last_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
#아래의 extract_jobs에서 추출한 html을 기반으로 원하는 상세 정보를 찾는 function
def extract_job(html):
title = html.find("h2", {"class": "title"}).find("a")["title"]
company = html.find("span", {"class": "company"})
company_anchor = company.find("a")
location = html.find("span", {"class": "location"}).string
job_id = html["data-jk"]
if company_anchor is not None:
company = str(company_anchor.string)
else:
company = str(company.string)
company = company.strip()
return {
'title': title,
'company': company,
'location': location,
'link': f"https://kr.indeed.com/viewjob?jk={job_id}"
}
#검색결과를 html로 parse해서 soup을 만드는 function
def extract_jobs(last_page):
jobs = []
for page in range(last_page):
print(f"Scrapping INDEED: Page: {page}")
result = requests.get(f"{INDEED_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_pages = get_last_pages()
jobs = extract_jobs(last_pages)
return jobs
2. so.py
import requests
from bs4 import BeautifulSoup
URL = "https://stackoverflow.com/jobs?q=python"
def get_last_page():
result = requests.get(URL)
soup = BeautifulSoup(result.text, "html.parser")
pages = soup.find("div", {"class": "s-pagination"}).find_all("a")
last_page = pages[-2].get_text(strip=True)
return int(last_page)
#아래 extract_jobs에서 range함수를 사용하기 위해 정수형 변환
def extract_job(html):
title = html.find("h2", {"class": "mb4"}).find("a")["title"]
company, location = html.find("h3", {"class": "fc-black-700"}).find_all("span", recursive=False)
#html.find("h3",{"class":"fc-black-700"}).find_all("span",recursive=False)이 깊이에는 동일한 깊이의 span이 두개가 존재한다. 첫번째 span은 회사 이름을, 두번째 span은 회사 위치를 갖고 있다. 이런 경우, 우리는 company, location 이런식으로 변수를 지정할 수 있다. python의 장점이다.
#recursive를 사용하는 이유는 회사 이름과 위치가 같은 깊이의 두개의 span에 들어있는데 다른 깊이에 있는 태그는 출력하지 않게 하기 위함이다.
company = company.get_text(strip=True)
location = location.get_text(strip=True)
job_id = html["data-jobid"]
link = f"https://stackoverflow.com/jobs/{job_id}"
return {
"title": title,
"company": company,
"location": location,
"apply_link": link
}
def extract_jobs(last_page):
jobs = []
for page in range(last_page):
print(f"Scrapping SO: Page: {page}")
result = requests.get(f"{URL}&pg={page}")
#0부터 시작하기때문에 1페이지부터 시작하게 만들기 위해 page+1을 넣음
soup = BeautifulSoup(result.text, "html.parser")
results = soup.find_all("div", {"class": "-job"})
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
3.main.py
from indeed import get_jobs as get_indeed_jobs
from so import get_jobs as get_so_jobs
so_jobs = get_so_jobs()
indeed_jobs = get_indeed_jobs()
jobs = so_jobs + indeed_jobs
print(jobs)
이제 이 코드를 이용하여 데이터를 출력하고 csv파일로 export 해봅시다.
다음 포스팅을 기다려주세요!
'Back-end > Python Scrapper' 카테고리의 다른 글
Flask로 웹스크래퍼 만들기 - 1 (0) | 2020.08.09 |
---|---|
파이썬으로 웹스크래퍼 만들기 - 6 (0) | 2020.08.06 |
파이썬으로 웹스크래퍼 만들기 - 4 (0) | 2020.08.04 |
파이썬으로 웹스크래퍼 만들기 - 3 (0) | 2020.08.03 |
파이썬으로 웹스크래퍼 만들기 - 2 (0) | 2020.08.03 |
댓글