[Python] Python으로 웹 스크래퍼 만들기 (2.6 Extracting Titles)

Jeongyun Heo·2020년 12월 24일
0
post-thumbnail

노마드 코더 Python으로 웹 스크래퍼 만들기
https://nomadcoders.co/python-for-beginners

2.6 Extracting Titles

✍️  indeed 일자리 목록 추출하기

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페이지 다 나옴

✍️  requests.get(f"{URL}&start={0*LIMIT}")

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

✍️  chaining

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

직무 가져오기 성공

0개의 댓글