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 |
댓글