본문 바로가기
python/Python으로 웹 스크래퍼 만들기

2. Building a Job Scrapper_2

by 2cong 2020. 3. 24.

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

다음과 같음

 

각 페이지의 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)가 원하는 갯수대로 나오면 성공

'python > Python으로 웹 스크래퍼 만들기' 카테고리의 다른 글

2. Building a Job Scrapper_4  (0) 2020.03.25
2. Building a Job Scrapper_3  (0) 2020.03.25
2. Building a Job Scrapper_1  (0) 2020.03.24
1. Theory_2  (0) 2020.03.24
1. Theory_1  (0) 2020.03.20

댓글