[파이썬] 파이썬으로 웹 스크래퍼 만들기, Part 2 Title 추출하기

미음제

·

2021. 2. 14. 22:48

파이썬으로 웹 스크래퍼 만들기

 

Part 1 이론

Part 2 파이썬으로 웹 스크래퍼 만들기

Part 3 Django를 사용하기 위해 알면 좋은 것

 

파이썬으로 웹 스크래퍼 만들기는 위와 같은

3개의 Part로 나누어 진행한다.

 

이 전 글 보기

2021/02/09 - [Developer/Python] - [파이썬] 파이썬으로 웹 스크래퍼 만들기, Part 2 페이지 요청


Part 2 파이썬으로 웹 스크래퍼 만들기

Extract Titles

 

정보를 추출하기 원하는

URL을 요청하고

 

요청된 URL에서 html 정보를

가져온 뒤

 

가져온 html 정보에서

원하는 것을 추출한다.

 

Indeed 구인 정보에서

각각의 div의 title은

회사에서 채용하기 원하는

분야에 대한 text가 담겨 있다.

 

이를 추출하기 위해선

다음처럼 코드를 작성한다.

 

indeed.py

extract_indeed_jobs()함수 수정

jobs = []
    for page in range(last_page):
        result = requests.get(f"{URL}&start={page*LIMIT}")
        soup = BeautifulSoup(result.text, 'html.parser')
        results = soup.find_all("div", {"class": "jobsearch-SerpJobCard"})
        print(results)
    return jobs

클래스 명이

jobsearch-SerpJobCard

인 모든 div를 추출하는 것이다.

 

위 div가 

회사의 채용공고의

title이 담겨있는 곳이다.

 

이 div를 추출하기 위해

Beautiful Soup을 사용해 추출한다.

 

soup.find_all()

함수를 통해서

"div"의 "class"명이

"jobsearch-SerpJobCard"인 것을

모두 찾아

results 변수에 저장한다.

 

그리고 print()해보면

복잡한 html 덩어리가 출력된다.

 

여기서 필요한 것은

 

위 같은 card에서

밑줄로 표시된 title이다.

 

이 title만 추출하기 위해서

indeed.py

extract_indeed_jobs()함수 수정

def extract_indeed_jobs(last_page):
    jobs = []
    # for page in range(last_page):
    result = requests.get(f"{URL}&start={0*LIMIT}")
    soup = BeautifulSoup(result.text, 'html.parser')
    results = soup.find_all("div", {"class": "jobsearch-SerpJobCard"})
    for result in results:
        print(result.find("h2", {"class": "title"}))
    return jobs

우선 페이지가

모든 페이지를 추출하기 보다

결과가 잘 추출되는지 확인하기 위해

첫 번째 for문을 주석 처리하고

start=0*LIMIT

으로 첫 번째 페이지만

추출해본다.

 

가져온 div만큼 for문을 돌리는데

"class"명이 "title"인 것을

찾아서 출력하도록 한다.

(페이지 검사를 해보면

title은 div가 아니라

h2이다)

이렇게 출력된

title을 

title이라는 변수에 저장하고

title에서 anchor를 찾아보고

출력하도록 수정한다.

(title에 링크가 있는 경우가 있고

없는 경우가 있다)

    for result in results:
        print(result.find("h2", {"class": "title"}))
        title = result.find("h2", {"class": "title"})
        print(title.find("a").string)
    return jobs

anchor를 찾아 출력하면

이렇게 링크가 없는 경우

none이 출력된다.

 

none이 출력되는 경우를

해결하기 위해

코드를 수정한다.

 for result in results:
        title = result.find("h2", {"class": "title"})
        anchor = title.find("a")["title"]
        print(anchor)

anchor = title.find("a")["title"]

print(anchor)

이렇게 바꾸어 출력하면

none이 출력되지 않는다.

 

["title"]은

anchor의 title 속성 값을

얻어오는 것인데

속성 값이 없다면 에러가 된다.

none으로 출력되던 것이

파이썬 인공지능 알고리즘으로

출력되었다.

 


title을 추출하고

anchor를 출력할 때

none이 출력되는 것까지

해결한 뒤

코드를 정리한다.

indeed.py

extract_indeed_jobs()함수

def extract_indeed_jobs(last_page):
    jobs = []
    # for page in range(last_page):
    result = requests.get(f"{URL}&start={0*LIMIT}")
    soup = BeautifulSoup(result.text, 'html.parser')
    results = soup.find_all("div", {"class": "jobsearch-SerpJobCard"})
    for result in results:
        title = result.find("h2", {"class": "title"}).find("a")["title"]
        print(title)
    return jobs

 

정리하면

result는 일자리 목록이 있고,

거기서 div를 찾는데

class 명이 title이어야 한다.

 

그리고 그 안에서

anchor를 찾아서

anchor의 속성인

title을 가져오는 것이다.

반응형