[파이썬] 파이썬으로 웹 스크래퍼 만들기, Part 2 페이지 요청

미음제

·

2021. 2. 9. 22:27

파이썬으로 웹 스크래퍼 만들기

 

Part 1 이론

Part 2 파이썬으로 웹 스크래퍼 만들기

Part 3 Django를 사용하기 위해 알면 좋은 것

 

파이썬으로 웹 스크래퍼 만들기는 위와 같은

3개의 Part로 나누어 진행한다.

 

이 전 글 보기

2021/02/09 - [Developer/Python] - [파이썬] 파이썬으로 웹 스크래퍼 만들기, Part 2 정보 추출 Extracting 2


Part 2 파이썬으로 웹 스크래퍼 만들기

Request 보내기

range() 함수를 이용

 

range() 함수는

argument로 넣은 수만큼의

크기의 배열을 생성한다

 

ex)

x = 3
for n in range(x):
	print(x)

0. 1. 2가 출력된다.

 

range 함수를 이용해

Request를 하기 위해선?

 

ragne의 현재 값을

추출하고자 하는

URL에서 가져온

요소의 개수만큼 곱해준다.

 

*필자의 경우

Indeed에서 파이썬 직업에 대한

일자리를 추출하려 하는데

URL을 살펴보면

1 페이지는

kr.indeed.com/%EC%B7%A8%EC%97%85?q=%ED%8C%8C%EC%9D%B4%EC%8D%AC&limit=50

이런 식으로 되어 있다.

 

2페이지는

kr.indeed.com/%EC%B7%A8%EC%97%85?q=%ED%8C%8C%EC%9D%B4%EC%8D%AC&limit=50&start=50

이렇게 되어있다.

 

즉, 50개씩 검색 조건을 걸었으므로

limit=50의 형태로 URL에 있고

1 페이지에 50개의 요소가

나열된다.

1페이지는 start=0

2페이지는 start=1*50

3페이지는 start=2*50

...

links = pagination.find_all('a')
pages = []

for link in links[:-1]:  # '다음'버튼은 무시
    pages.append(int(link.string))


max_page = pages[-1]
# 페이지 숫자 중 가장 큰 수, 배열의 마지막 요소

for n in range(max_page):
    print(f"start={n*50}")

pages라는 배열에

a에서 추출한 번호를 집어넣고

페이지를 요청하기 위해

range의 현재 값을

Indeed에서 가져온 요소만큼 곱해주는

for문을 생성한다.

 

Indeed에서

파이썬에 대한 일자리의

검색 결과는 총 2페이지.

 

for문을 돌려보면

start=0

start=50

이 출력된다.

페이지를 요청하기 위한

기본적인 준비를 마치고

여기까지의 내용을

function(함수)로 정의한다.

 

 

main.py

import requests
from bs4 import BeautifulSoup

indeed_result = requests.get(
    'https://kr.indeed.com/%EC%B7%A8%EC%97%85?as_and=%ED%8C%8C%EC%9D%B4%EC%8D%AC&as_phr=&as_any=&as_not=&as_ttl=&as_cmp=&jt=all&st=&salary=&radius=25&l=&fromage=any&limit=50&sort=&psf=advsrch&from=advancedsearch')

indeed_soup = BeautifulSoup(indeed_result.text, 'html.parser')

pagination = indeed_soup.find("div", {"class": "pagination"})

# pagination 변수에 찾은 결과를 넣어줌
# 그 결과를 list로 만들어 pages 변수에 넣어줌


# pages를 가져온 다음
# 빈 array를 만들고
# pages에 있는 각 page마다 span을 찾아서
# 빈 array에 넣어준다.
links = pagination.find_all('a')
pages = []

for link in links[:-1]:  # '다음'버튼은 무시
    pages.append(int(link.string))


max_page = pages[-1]
# 페이지 숫자 중 가장 큰 수, 배열의 마지막 요소

for n in range(max_page):
    print(f"start={n*50}")

의 내용을

indeed.py를 새로 생성해

새로운 함수로 정의한다.

 

indeed.py

import requests
from bs4 import BeautifulSoup

URL = "https://kr.indeed.com/jobs?q=%ED%8C%8C%EC%9D%B4%EC%8D%AC&limit=50&radius=25"


def extract_indeed_pages():
    result = requests.get(URL)

    soup = BeautifulSoup(result.text, 'html.parser')

    pagination = soup.find("div", {"class": "pagination"})

    # pagination 변수에 찾은 결과를 넣어줌
    # 그 결과를 list로 만들어 pages 변수에 넣어줌

    # pages를 가져온 다음
    # 빈 array를 만들고
    # pages에 있는 각 page마다 span을 찾아서
    # 빈 array에 넣어준다.
    links = pagination.find_all('a')
    pages = []

    for link in links[:-1]:  # '다음'버튼은 무시
        pages.append(int(link.string))

    max_page = pages[-1]
    # 페이지 숫자 중 가장 큰 수, 배열의 마지막 요소
    return max_page

그리고 main.py도 다음과 같이

수정해준다.

from indeed import extract_indeed_pages

max_indeed_pages = extract_indeed_pages()
print(max_indeed_pages)

새로 만든

extract_indeed_pages 함수를

import 해주고

max_indeed_pages라는 변수를 통해

호출해준다.

 

extract_indeed_pages() 함수를 만들어

함수를 재사용할 수 있게 한 것.

 

그리고

indeed.py에

새로운 함수를 추가해 주고

(일자리를 추출하기 위한 함수)

페이지 요청에 쓰일

LIMIT 변수 생성과

URL 변수를 수정해준다.

 

#추가
LIMIT = 50

#수정
URL = f"https://kr.indeed.com/jobs?q=%ED%8C%8C%EC%9D%B4%EC%8D%AC&limit={LIMIT}"

def extract_indeed_pages():
	#수정
    result = requests.get(URL)

#함수 추가
def extract_indeed_jobs(last_page):
    for page in range(last_page):
        print(f"&start={page*LIMIT}")

마찬가지로

main.py도 수정해준다.

indeed.py에서 새롭게

생성한 함수를 import와 호출

#새로 만든 함수 import
from indeed import extract_indeed_pages, extract_indeed_jobs

#max_indeed_pages변수명 수정
last_indeed_page = extract_indeed_pages()

#새로 만든 함수 호출
extract_indeed_jobs(last_indeed_page)

extract_indeed_jobs()의 인자에

last_indeed_page를 주어

요청을 만들기 위한 작업을 완성한다.

 

extract_indeed_jobs() 인자로

last_indeed_page를 주어

호출하게 되면

다음과 같은 결과가 나온다.


Page 요청하기

페이지를 요청하기 위해

requests.get(URL)을 사용한다.

 

#수정
URL = f"https://kr.indeed.com/%EC%B7%A8%EC%97%85?q=%ED%8C%8C%EC%9D%B4%EC%8D%AC&limit={LIMIT}"

#extract_ineed_jobs 함수의 for문 수정
def extract_indeed_jobs(last_page):
    for page in range(last_page):
        result = requests.get(f"{URL}&start={page*LIMIT}")
        print(result.status_code)

정보를 추출해올 URL을

URL이라는 변수에 담았고,

LIMIT를 전역 변수로

검색 조건에서 입력한

50개를 LIMIT로 저장했다.

 

requests.get함수를 통해

페이지를 요청하는데

URL(인자)에

f"{URL}&start={page*LIMIT}" 를

입력해 준다.

 

그리고 우리의 코드가

잘 작동하는지 확인해 보기 위해

status_code() 함수를 사용한다.

 

status_cod() 함수는

올바른 코드라면

200을 출력한다.

 

추출하고자 하는 URL은

총 2페이지 이므로

2번의 200이 출력되어야 한다.

status_code() 결과


다음 포스트 내용?

각 페이지에서

일자리 정보를 추출해

어딘가에 담고

모든 일자리를 return 할 것

 

다음 내용을 위해

main.py 함수를 약간 수정

#변수 선언
indeed_jobs = extract_indeed_jobs(last_indeed_page)

indeed.py 약간 수정

def extract_indeed_jobs(last_page):
    #추가
    jobs = []
    for page in range(last_page):
        result = requests.get(f"{URL}&start={page*LIMIT}")
        print(result.status_code)
    #추가
    return jobs

jobs라는 빈 배열을 생성해

일자리를 추출하고

return해 주기 위한 작업

반응형