노마드 코더 Python으로 웹 스크래퍼 만들기
https://nomadcoders.co/python-for-beginners
html에서 데이터를 추출하기 위해 beautifulsoup을 사용한다.
전에 썼던 soup을 복사해서 붙여넣기 한다.
soup = BeautifulSoup(result.text, "html.parser")
이제 일자리 목록을 추출해야 한다.
indeed 웹사이트 가서 검사 클릭
class명이 jobsearch-SerpJobCard인 div를 가져오기로 한다.
results = soup.find_all("div", {"class": "jobsearch-SerpJobCard"})
import requests
from bs4 import BeautifulSoup
LIMIT = 50
URL = f"https://www.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={page*LIMIT}")
soup = BeautifulSoup(result.text, "html.parser")
results = soup.find_all("div", {"class": "jobsearch-SerpJobCard"}) ⬅
print(results)
return jobs
20페이지 다 나옴
1페이지만 테스트해보기 위해 임시로
for문을 주석 처리 해주고
page를 0으로 바꿔준다
그리고 indent(들여쓰기)를 outdent(내어쓰기)로 해준다.
import requests
from bs4 import BeautifulSoup
LIMIT = 50
URL = f"https://www.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}") ⬅ 0으로 바꿔주기
soup = BeautifulSoup(result.text, "html.parser")
results = soup.find_all("div", {"class": "jobsearch-SerpJobCard"})
print(results)
return jobs
실행하면 1페이지 것만 나온다.
results에서 정보를 추출해야 한다.
results는 html 리스트면서 soup의 리스트다.
다시 for문을 써서 class가 title인 h2를 가져온다.
import requests
from bs4 import BeautifulSoup
LIMIT = 50
URL = f"https://www.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: ⬅ for문 사용
print(result.find("h2", {"class": "title"})) ⬅ class가 title인 h2 태그를 찾는다.
return jobs
indeed 사이트를 보면
h2 안에 anchor가 있다.
h2 안에 있는 anchor를 가져오기로 한다.
그 전에 result.find("h2", {"class": "title"})
를 title(직무) 변수에 넣어준다.
title = result.find("h2", {"class": "title"})
title에서 anchor를 찾아서 출력해준다.
print(title.find("a"))
import requests
from bs4 import BeautifulSoup
LIMIT = 50
URL = f"https://www.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"})
print(title.find("a")) ⬅️ title 안에 있는 a 출력
return jobs
사이트를 다시 보니까 필요한 정보가 anchor에 이미 나와 있다.
anchor의 title이라는 attribute에 직무가 나와 있다.
그냥 anchor에서 title을 가져오기로 한다.
anchor = title.find("a")["title"]
title 변수에서 anchor를 찾고 attribute인 title을 가져온다.
import requests
from bs4 import BeautifulSoup
LIMIT = 50
URL = f"https://www.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"})
anchor = title.find("a")["title"] ⬅️
print(anchor)
return jobs
title 변수와 anchor 변수를 합쳐서 한 줄로 만든다.
title 변수 하나로 한 줄로 만든다.
기존 title 변수 뒤에 .find("a")["title"]
붙이기
title = result.find("h2", {"class": "title"}).find("a")["title"]
(chaining)
result는 일자리 목록
result에서 class명이 title인 h2를 찾고
그 안에서 anchor를 찾아서
attribute인 title을 가져온다.
import requests
from bs4 import BeautifulSoup
LIMIT = 50
URL = f"https://www.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
직무 가져오기 성공