2. Building a Job Scrapper_2

Jina·2020년 3월 5일
1

2.3 Extracting Indeed Pages part Two

string 추출

.string 이용하여 문서에서 string 추출 가능 (BeautifulSoup)

예시)

soup.title.string

페이지에 있는 문자열만 가져오기위해 .string 이용

원하는 정보의 위치

<div class="pagination"> <a> <span class="pn"> n </span> </a> </div>
  • 앞의 예시(2.2 Extracting Indeed Pages)에서
    • a 태그에서 string을 가져온 결과 = span 태그에서 string 가져온 결과 ( 두 개의 결과 동일)
    • why?
      a태그 안에 다른 요소가 있고(span) 그 요소 안에 string이 오직 하나 있기에 가능

span태그 안에서 string 추출

1 ) list.append(page_i.find('span').string)

import requests
from bs4 import BeautifulSoup

r=requests.get("https://kr.indeed.com/jobs?q=python&l=")
soup=BeautifulSoup(r.text,"html.parser")

pagination = soup.find('div',{'class':'pagination'})
page_a = pagination.find_all('a')


list=[]
for page_i in page_a:
    list.append(page_i.find('span').string)

print(list[-1]) // ['2', '3', '4', '5']

2) .string 이용하여 출력

import requests
from bs4 import BeautifulSoup

r=requests.get("https://kr.indeed.com/jobs?q=python&l=")
soup=BeautifulSoup(r.text,"html.parser")

pagination = soup.find('div',{'class':'pagination'})
page_span = pagination.find_all('span',{'class':'pn'})

list=[]
for page_num in page_span:
    list.append(page_num.string)
    
print(list[:-1]) // ['2', '3', '4', '5']

a태그 안에서 string 추출

import requests
from bs4 import BeautifulSoup

r=requests.get("https://kr.indeed.com/jobs?q=python&l=")
soup=BeautifulSoup(r.text,"html.parser")

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


page_a = pagination.find_all('a')


list=[]
for page_i in page_a:
    list.append(page_i.string)

print(list[:-1]) // ['2', '3', '4', '5']

span 태그에서 찾으나 a태그에서 찾으나 결과 동일


string을 int로 변환

int( )함수를 이용하여 변환해준다

list=[]
for page_i in page_a:
    list.append(int(page_i.string))

print(list[:-1]) // error

error 이유 : 위의 결과 중 '다음'이라는 문자가 있어서 이 문자는 int로 바꿀 수 없기 때문

따라서 list로 가져올 때 '다음'이라는 문자를 빼고 가져오기

list=[]
for page_i in page_a[:-1] :
    list.append(int(page_i.string))

print(list)

위와 같이 가져옴 위의 예시에서 list에서 [:-1]안해도됨 (이미 page_a[:-1] 로 제거되어서)

맨 마지막 페이지가 몇 페이지인지만 추출하고 싶어서
list[-1]로 마지막 숫자만 추출

list=[]
for page_i in page_a[:-1] :
    list.append(int(page_i.string))

max_page=list[-1] # 마지막 숫자만 추출하고 이를 max_page로 지정

# print(list[-1]) // 5

2.4 Requesting Each Page

한 페이지의 job 정보 10개씩 있음

현재 출력한 페이지(1 페이지)의 url --> https://kr.indeed.com/jobs?q=python&l=

2페이지 --> https://kr.indeed.com/jobs?q=python&start=10

5페이지 --> https://kr.indeed.com/jobs?q=python&start=40

위의 url을 보면 페이지가 넘어갈 때 마다 start=n이 추가됨


페이지마다 다른 start=n 출력하도록 하기

list=[]
for page_i in page_a[:-1] :
    list.append(int(page_i.string))

max_page=list[-1]
# print(range(max_page)) // range(0,5)

# range(max_page) 이용하여 리스트의 마지막 페이지를 범위로 만듬

위의 range를 차례로 출력하기

list=[]
for page_i in page_a[:-1] :
    list.append(int(page_i.string))

max_page=list[-1]

for n in range(max_page)
    print(n) //
    
0
1
2
3
4

다음과 같음

   페이지      n      url   
   1 페이지      n=0      start=0   
   2 페이지      n=1      start=10   
   ...      ...      ...   
   5 페이지      n=4      start=40   

각 페이지의 url 끝부분 start=n*10이 나오도록 출력

list=[]
for page_i in page_a[:-1] :
    list.append(int(page_i.string))

max_page=list[-1]

for n in range(max_page)
    print(f'start={n*10}')
//
start=0
start=10
start=20
start=30
start=40

function - A

  • 위의 과정을 function으로 만들어서 재사용 할 수 있도록 함
  • 마지막 페이지를 찾아내는 부분까지 function으로 만들 것

A-1. 새로운 파이썬 파일을 생성 (모듈 생성)

  • function을 담을 모듈인 파이썬 파일을 만들고 그 안에 위의 과정을 복사 --> 붙여넣기 하기

  • 새로운 파일이름은 홈페이지 이름을 따서 indeed.py로 만듬

  • 아래의 내용을 복사 --> 붙여넣기하여 indeed.py를 만들기

    import requests
    from bs4 import BeautifulSoup
    
    r=requests.get("https://kr.indeed.com/jobs?q=python&l=")
    soup=BeautifulSoup(r.text,"html.parser")
    pagination = soup.find('div',{'class':'pagination'})
    page_a = pagination.find_all('a')
    
    list=[]
    for page_i in page_a[:-1] :
        list.append(int(page_i.string))
    
    max_page=list[-1]

A-2. 함수 정의

  • 위의 내용을 아래와 같이 함수로 정의

    import requests
    from bs4 import BeautifulSoup
    
    def indeed_pages():
        r=requests.get("https://kr.indeed.com/jobs?q=python&l=")
        soup=BeautifulSoup(r.text,"html.parser")
        pagination = soup.find('div',{'class':'pagination'})
        page_a = pagination.find_all('a')
        list=[]
        for page_i in page_a[:-1] :
            list.append(int(page_i.string))
        max_page=list[-1]
        return max_page

함수 정의 후 마지막에 return max_page로 결과값 반환하기

A-3. url

  • url이 바뀌어도 함수가 작동하도록 url 위치를 변경

    import requests
    from bs4 import BeautifulSoup
    indeed_url="https://kr.indeed.com/jobs?q=python&l="
    
    def indeed_pages():
       r=requests.get(indeed_url) # url을 함수 밖에서 가져올 수 있도록 지정
       soup=BeautifulSoup(r.text,"html.parser")
       pagination = soup.find('div',{'class':'pagination'})
       page_a = pagination.find_all('a')
       list=[]
       for page_i in page_a[:-1] :
           list.append(int(page_i.string))
       max_page=list[-1]
       return max_page

A-4. 적용

위에서 만든 indeed 모듈과 indeed_pages 함수를 다른 파일에 적용

from indeed import indeed_pages

max_pages=indeed_pages()
print(max_pages)

function - B

  • 각 페이지의 url ~ start=n 을 출력하는 함수를 만들 것

B-1. indeed 모듈에 함수 정의

위의 먼저 만들어 두었던 indeed.py 모듈에 두번째 함수를 정의

import requests
from bs4 import BeautifulSoup

limit=10

def start(last_page):
    for n in range(last_page):
        print(f'start={n*limit}')

B-2. 적용

from indeed import indeed_pages, start

max_pages=indeed_pages()

start(max_pages)

request

위의 과정으로 추가된 url~&start=n을 통하여 페이지를 요청하기

  • 페이지 요청
    requests.get(url) 이용

function-B 코드의 print부분을 requests로 변경

import requests
from bs4 import BeautifulSoup

indeed_url = "https://kr.indeed.com/jobs?q=python&l="
limit=10

def start(last_page):
    for n in range(last_page):
        requests.get(f'{indeed_url}&start={n*limit}')
  • 코드 확인하기

    • .status_code 이용
    • .status_code --> requests 모듈의 메서드
    • 결과를 HTTP 응답코드로 알려줌

    예시)

    import requests
    
    requests.get(URL)
    response.status_code
    response.text

url을 요청하면 그 결과를 응답
.status_code : HTTP 결과로 응답
.text : text로 페이지 출력

ref) https://dgkim5360.tistory.com/entry/python-requests

위의 코드를 .status_code를 이용하여 동작하는지 확인해보기

import requests
from bs4 import BeautifulSoup

indeed_url = "https://kr.indeed.com/jobs?q=python&l="
limit=10

def start(last_page):
    for n in range(last_page):
        result=requests.get(f'{indeed_url}&start={n*limit}')
        print(result.status_code)

결과로 200(OK)가 원하는 갯수대로 나오면 성공

1개의 댓글

comment-user-thumbnail
2020년 3월 12일

상당히 자세하네요

답글 달기