[Python] Python으로 웹 스크래퍼 만들기 (2.10 StackOverflow extract jobs)

Jeongyun Heo·2020년 12월 26일
0
post-thumbnail
post-custom-banner

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

2.10 StackOverflow extract jobs

✍️  마지막 페이지 숫자 가져오기

indeed에서 했던 것과 마찬가지로 가장 큰 숫자(마지막 페이지 숫자)를 가져온다.

가장 먼저 next를 없애준다.

pages = pages[:-1] 마지막 거(next) 하나 빼고 가져온다.

print(pages) 출력해본다.

88이 마지막 페이지라는 것을 알 수 있다.

마지막 페이지 숫자를 출력한다.
pages = pages[-2] 뒤에서 두 번째에 해당하는 요소(88)

88이 나왔다.

pages에서 last_page로 변수 이름을 바꿔준다.

📖  .get_text(strip=True)

.get_text()를 사용하여 텍스트를 추출한다.

BeautifulSoup get_text()
https://www.crummy.com/software/BeautifulSoup/bs4/doc/#get-text

print(last_page)

텍스트를 추출해냈다.
그런데 추출한 텍스트에 whitespace가 포함돼서 추출됐다.

strip=True를 써서 whitespace를 없애준다.

import requests
from bs4 import BeautifulSoup

URL = f"https://stackoverflow.com/jobs?q=python&pg="


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) # beautifulsoup
    print(last_page)


def get_jobs():
    last_page = get_last_page()
    return []


공백이 제거되었다.

마지막 페이지 숫자를 가져왔으니 return 해준다.

print(last_page) 출력해본다.


오류 없이 잘 동작한다.

✍️  모든 일자리 목록 가져오기

extract_jobs 라는 새로운 함수를 만든다.
def extract_jobs(last_page):

indeed.py에 있는 거 그대로 참고하기

jobs를 만들어주고 jobs =
jobs를 반환해준다 return [] → return jobs
jobs에는 extract_jobs를 호출한다. jobs = extract_jobs
인수로 last_page를 준다. jobs = extract_jobs(last_page)

extract_jobs 함수에 빈 리스트를 만들어 준다.
jobs = []

그리고 for문을 입력한다.

실행해본다.

last_page가 string이라고 오류가 난다.

last_page를 정수로 변환해 주어야 range 함수 인자로 쓸 수 있다.

int 함수를 사용해서 정수로 바꿔준다.

실행해본다.


0부터 87까지 나왔다.
88까지 나와야 되는데 87까지 나왔다.
range 함수는 끝 숫자를 포함 안 하기 때문이다.

stackoverflow의 1페이지를 확인해본다.
https://stackoverflow.com/jobs?q=python&pg=0
https://stackoverflow.com/jobs?q=python&pg=1
주소창에 끝에 0을 넣었을 때도 1페이지로 이동하고 1을 넣었을 때도 1페이지로 이동한다.
0부터 시작하면 page가 0일 때와, 1일 때 둘 다 1페이지가 나오므로 중복이 된다.

page에 1을 더해준다.

0부터 87까지 나왔던 결괏값이 1부터 88까지 나오게 됐다.

원하는 값을 얻었으니 request 작업을 시작한다.

URL 변수 끝에 &pg= 부분을 지우고 result로 옮겨줬다.
{page+1} page에 1 더하는 거 잊지 말기

print(result.status_code) 잘 동작하는지 확인하기 위해 출력해본다.
200이 88개 나와야 한다.

잘 동작했다.

이제 soup을 만들어 준다.

위에도 soup라는 같은 이름의 변수가 있지만
해당 함수 내에서만 존재하기 때문에 다른 함수에서 이름이 중복되어도 상관 없다.

soup을 마저 작성한다.

import requests
from bs4 import BeautifulSoup

URL = f"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)


def extract_jobs(last_page):
    jobs = []
    for page in range(last_page):
        result = requests.get(f"{URL}&pg={page+1}")
        soup = BeautifulSoup(result.text, "html.parser")


def get_jobs():
    last_page = get_last_page()
    jobs = extract_jobs(last_page)
    return jobs

모든 일자리를 가져오기 위해 어떤 태그를 가져오면 되는지 확인한다.

stackoverflow에서 inspect 실행

class명이 -job인 div를 가져와야 한다.

results 변수 생성 results =

잘 동작하는지 확인하기 위해 일단 data-jobid를 가져와 본다.

for문 입력 for result in results:
result의 data-jobid 출력 print(result["data-jobid"])

실행해본다.

잘 동작한다.

post-custom-banner

0개의 댓글