<복습>
https://wook-2124.tistory.com/31
<준비물>
https://github.com/psf/requests
https://www.crummy.com/software/BeautifulSoup/
<코드기록>
# range - 넣은 수만큼의 크기의 배열을 만들어주는 함수
# f("start={n * 50}")로 str과 인자를 분리한 뒤
# range로 각 페이지를 start=n으로 배열하기
import requests
from bs4 import BeautifulSoup
indeed_result = requests.get("https://www.indeed.com/jobs?q=python&limit=50")
indeed_soup = BeautifulSoup(indeed_result.text, "html.parser")
pagination = indeed_soup.find("div", {"class":"pagination"})
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 지워줌)
import requests
from bs4 import BeautifulSoup
INDEED_URL = "https://www.indeed.com/jobs?q=python&limit=50"
def extract_indeed_pages():
result = requests.get(INDEED_URL)
soup = BeautifulSoup(result.text, "html.parser")
pagination = soup.find("div", {"class":"pagination"})
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)
# indeed.py에 새로운 함수 만들기
# LIMIT로 묶어서 숫자 50, 20만 입력해도 값이 바뀌도록 하기
import requests
from bs4 import BeautifulSoup
LIMIT = 50
URL = f"https://www.indeed.com/jobs?q=python&limit={LIMIT}"
def extract_indeed_pages():
result = requests.get(URL)
soup = BeautifulSoup(result.text, "html.parser")
pagination = soup.find("div", {"class":"pagination"})
links = pagination.find_all('a')
pages = []
for link in links[:-1]:
pages.append(int(link.string))
max_page = pages[-1]
return max_page
def extract_indeed_jobs(last_page):
for page in range(last_page):
print(f"start={page * LIMIT}")
# main.py에서 실행하기
from indeed import extract_indeed_pages, extract_indeed_jobs
last_indeed_page = extract_indeed_pages()
extract_indeed_jobs(last_indeed_page)
# requests.get활용해서 {URL}인자를 만들고
# result로 변수를 저장하고
# result.status_code를 이용해서 '200'을 20개 나오게함.
import requests
from bs4 import BeautifulSoup
LIMIT = 50
URL = f"https://www.indeed.com/jobs?q=python&limit={LIMIT}"
def extract_indeed_pages():
result = requests.get(URL)
soup = BeautifulSoup(result.text, "html.parser")
pagination = soup.find("div", {"class":"pagination"})
links = pagination.find_all('a')
pages = []
for link in links[:-1]:
pages.append(int(link.string))
max_page = pages[-1]
return max_page
def extract_indeed_jobs(last_page):
for page in range(last_page):
result = requests.get(f"{URL}start={page * LIMIT}")
print(result.status_code)
# 마지막에 이제 일자리(jobs) 관련해서 추출할 것을
# 미리 설정하고 마무리함. (main.py에는 indeed_jobs)
import requests
from bs4 import BeautifulSoup
LIMIT = 50
URL = f"https://www.indeed.com/jobs?q=python&limit={LIMIT}"
def extract_indeed_pages():
result = requests.get(URL)
soup = BeautifulSoup(result.text, "html.parser")
pagination = soup.find("div", {"class":"pagination"})
links = pagination.find_all('a')
pages = []
for link in links[:-1]:
pages.append(int(link.string))
max_page = pages[-1]
return max_page
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
1. range 함수 사용하기
range 함수는 넣은 수만큼의 크기의 배열을 만들어주는 함수이다. 출력하면 range(0, 20)이 나오는데 이 뜻이 어떤것인지 밑에서 자세히 알아보자.
for n in range(max_page): 아까 range(max_page)가 range(0, 20)이라고 출력된 것처럼 print(n)으로 0부터 19까지의 배열의 크기가 구해졌다. 즉 range(0, 20)의 의미는 0부터 20번째 뒤까지의 의미! (0,1,2,3,4,...,19 - 20번째 뒤)
그리고 저번 복습할 때 마지막에 말했던 내용처럼 4번째 page는 start=150인 것을 확인할 수 있다. 그럼 이제 이것을 각 페이지마다 환산한 수치로 나타내보자! (1번째 page는 start=0)
2. f(format)을 이용해서 start=?? 나타내기
f(format)으로 str - "start"와 argument - {n * 50}로 둘로 나눠서 설정하고 n의 값(0부터 20개, 0~19) 곱하기(*) 50(페이지의 수)로 start=?? 값이 나오게 출력을 했다.
터미널에서 나오는 결과값 처럼 1번째 페이지는 start=0, 20번째 페이지는 start=950 값을 갖고 있는지 확인해보자!
터미널의 결과값처럼 start=0은 1page이다.
터미널의 결과값처럼 start=950은 20page인 것을 알 수 있다.
3. indeed.py로 function 묶기
indeed.py 이름으로 지금까지 main.py에서 작업한 함수를 묶어주자. 그리고 INDEED_URL로 대문자로 한 것은 강조하기 위한 것!
이제 indeed_result, indeed_soup 같이 indeed명이 붙어있는 것은 이제 indeed.py에 들어가있기 때문에 코드를 깔끔하게 간소화시켜 result, soup라고 바꿔주고 return max_page로 return 시켜서 마무리하면 indeed.py로 묶어주기 끝!
4. indeed.py import(수입)하기
main.py로 가서 from indeed import extract_indeed_pages를 적어주자.
해석하자면, indeed.py로 from(부터) extract_indeed_pages(): 함수를 import(수입) 해라! 이다.
그 다음 max_indeed_pages 변수명으로 override(재정의)해주고 출력하면 맨 마지막 페이지였던 20page가 출력된다.
마지막 페이지 값이었던 20page가 출력된 이유는 indeed.py에서 max_page = pages[-1] 값을 return하고 있기 때문!
5. indeed.py 안에 새로운 함수 만들기 - def extract_indeed_jobs
코드를 더 보기좋게 바꾸기 위해서 LIMIT 설정을 50, 20 등 원하는 숫자를 용이하게 바꿀 수 있도록 {} argument화 시켜줬다.
그리고 def extract_indeed_jobs으로 2. 번에서 range 값을 구했던 것을 넣어줬다.
f"start={page(2번에선 n) * LIMIT(2번에선 50)}"
새로 적용한 함수를 main.py에서 import extract_indeed_jobs로 또 가져와줬다.
6. request 활용하기 - rename.status_code ('200'값이 출력된다.)
위에 보이는 r.status_code를 이용해서 지금까지 작성한 코드가 잘 작동하는지 확인해보자.
먼저 예전에 썻던 requests.get 함수기능을 다시 이용해서
result = requests.get(f"{URL}start={page * LIMIT}")
위에 보이는 것처럼 URL과 page * LIMIT의 값이 result가 되게끔 argumentation(인자화)했다.
그리고 이것을 print(result.status_code)으로 출력하면 '200'이 20페이지에 맞게 20개가 출력이 되는 것을 알 수 있다.
- r.status_code (r = result)
이렇게 indeed.py에 있는 2가지 함수(extract_indeed_pages, extract_indeed_jobs)를 main.py로 import(수입)했고, 다음에는 본격적으로 URL에 나와있는 title, company 등을 추출해보도록 하겠다.
※ 코로나바이러스감염증-19 조심하세요!!!!
'Python > Web Scraping' 카테고리의 다른 글
[Python] #2.7 Extracting Companies (#코딩공부) (0) | 2020.02.20 |
---|---|
[Python] #2.6 Extracting Titles (#코딩공부) (0) | 2020.02.19 |
[Python] #2.4 Extracting Indeed Pages part Two (#코딩공부) (0) | 2020.02.16 |
[Python] #2.3 Extracting Indeed Pages (#코딩공부) (0) | 2020.02.14 |
[Python] #2.2 Navigating with Python (#코딩공부) (0) | 2020.02.13 |
댓글