5.11 Recursive
이전 게시물에서 Selenium 을 이용해서 브라우저를 열었다.
from requests import get
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
browser.get('https://kr.indeed.com/jobs?q=python')
print(browser.page_source)
while(True):
pass
이전에 제작했던 weworkremotely 웹 스크래퍼 처럼 비슷하게 코드를 작성한다.
from requests import get
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
base_url = 'https://kr.indeed.com/jobs?q='
search_term = 'python'
browser.get(f'{base_url}{search_term}')
soup = BeautifulSoup(browser.page_source,'html.parser')
print(soup)
while(True):
pass
이전에는 개발자 도구 사용했지만
이번에는 페이지 소스 보기 사용했다.
[ 개발자 도구 vs 페이지 소스 보기 ]
페이지 소스 보기 → 서버로 부터 전달받은 코드
개발자 도구 → 서버에서 전달받은 코드를 자바스크립트 등을 실행해 변환된 코드
스킨 파일 중에 하나인 main.js이라는 자바스크립트 파일에서 코드를 변형시킨다.
(skin.html의 후반부에 main.js 스크립트를 불러옴)
위 코드가 실행되면 DOM을 이용해 html에서 원하는 attribute에 접근하여 속성을 변화시킨다.
이런 방식으로 서버에서 전달받은 소스는 변형? 렌더링? 되어서 사용자에게 보여지게 된다.
페이지 소스 보기 좌측 상단에 자동 줄바꿈 체크하고 보기
ctrl + F (검색기능) 으로 jobsearch-ResultsList 찾기
보기 불편하면 코드 정렬해주는 사이트에서 정렬하고 보기
https://wepplication.github.io/tools/beautifyCode/
class 이름이 jobsearch-ResultList 인 ul 을 가져온다. ( 필요한 구인정보가 있는 ul )
from requests import get
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
base_url = 'https://kr.indeed.com/jobs?q='
search_term = 'python'
browser.get(f'{base_url}{search_term}')
soup = BeautifulSoup(browser.page_source,'html.parser')
job_list = soup.find('ul', class_='jobsearch-ResultsList')
jobs = job_list.find_all('li')
print(len(jobs))
while(True):
pass
출력값: ( 매 구인 정보 갯수마다 달라질수 있음 )
38
job_list = soup.find('ul', class_='jobsearch-ResultsList')
→ class 이름이 class 이름이 jobsearch-ResultList 인 ul 을 가져와서 job_list 변수에 저장한다.
jobs = job_list.find_all('li')
→ find_all 메서드 사용해서 ul 안에서 li 들을 가져와서 jobs 변수에 저장한다.
print(len(jobs))
→ job_list 의 길이를 출력 ( 실제 페이지 구인정보 보다 많이 출력됨, 38개 → li안에 여러 li들이 있기 때문에 )
→ 각 구인정보 li 안에 또 다른 li 들이 있는데, 내가 찾을거는 ul 바로 아래 있는 li만 필요하다.
그래서 beautifulsoup 한테 바로 아래에 있는 li 만 검색하게 하고,
딱 한 단계만, 너무 깊게 검색하지 않도록 하려면
recursive=False 코드를 추가해준다. ( 최상위 태그만 검색 )
recursive=True 이면 find_all은 매개변수에 일치하는 태그를 찾아 자식, 자식의 자식을 검색
( 모든 태그를 검색한다, 기본적으로 recursive=True 가 패시브로 동작함 )
from requests import get
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
base_url = 'https://kr.indeed.com/jobs?q='
search_term = 'python'
browser.get(f'{base_url}{search_term}')
soup = BeautifulSoup(browser.page_source,'html.parser')
job_list = soup.find('ul', class_='jobsearch-ResultsList')
jobs = job_list.find_all('li', recursive=False)
print(len(jobs))
while(True):
pass
출력값:
18
제대로 된 li 들을 받고 있는지 확인하려면 job을 출력해본다.
from requests import get
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
base_url = 'https://kr.indeed.com/jobs?q='
search_term = 'python'
browser.get(f'{base_url}{search_term}')
soup = BeautifulSoup(browser.page_source,'html.parser')
job_list = soup.find('ul', class_='jobsearch-ResultsList')
jobs = job_list.find_all('li', recursive=False)
for job in jobs:
print(job)
print('//////////////////')
while(True):
pass
출력값:
mosaic-zone 은 구인정보가 아니므로 필요하지 않다.
recursive=False 코드를 사용해서 beautifulsoup 가 li 안에 있는 li 들을 검색하지 않게 했다.
( class 이름이 jobsearch-ResultsList 인 ul 바로 아래에 있는 li 들만 검색 )
다음 게시물에서 mosaic-zone li 를 제외하여 검색하는 방법을 알아본다.
python 웹 스크래퍼 참고 강의
https://nomadcoders.co/python-for-beginners/lobby
selenium 참고 강의
'Programming > Python 웹 스크래퍼 만들기' 카테고리의 다른 글
Python selenium 활용해서 webscrapper 기초 제작 3 (0) | 2022.12.01 |
---|---|
Python None (0) | 2022.11.30 |
Python selenium 활용해서 webscrapper 기초 제작 1 (1) | 2022.11.28 |
Python Refactor (0) | 2022.11.25 |
Python Beautifulsoup 복습 (0) | 2022.11.24 |