indeed.com자세한 정보 긁어모으기!

YEONGHUN KO·2021년 11월 16일
0

PYTHON - SCRAPPER

목록 보기
3/17
post-thumbnail

1. 자세한정보 파고들기

지금 div "class" : "jobsearch-SerpJobCard" 안으로 들어간 상태이다. 여기서 또다시 for loop을 돌려 안에 있는 자세한 정보를 긁어모을생각이다. 니콜라스는 코드가 복잡해지면 그 코드만 따로 빼서 함수로 만드는게 좋다고 했다.(바닐라 자바할때도 필요한 기능을 추가할때 아예 자바스크립트 파일을 따로 하나 더 만들어서 거기서 작업하는 divide and conquer 방식이 좋다고 했다.)


def extract_job(html): # 여기서 html 은 jobsearch 클래스를 의미한다.
    title = html.find("h2", {"class": "title"}).find("a")["title"] 
    # chaining 이라고 한다. title=~~ + anchor = title.find("a")["title"]를 한 문장으로 묶었다.
    # 따라서 말로 풀면은 "h2(class:title) 태그 안에 a<title=~~> 태그가 있는데 ~~를 뽑아내라"는 뜻이다.
    
    company = html.find("span", {"class": "company"})
    company_anchor = company.find("a")
    if company_anchor is None: # a 태그가 없으면 span 태그를 바로 뽑아내고 
        company = str(company.string)
    else: # a 태그가 없는게 아니면 a 태그를 뽑아낸다.
        company = str(company_anchor.string)
    company = company.strip()    
    
    # 이번에는 회사 이름을 scrap 해볼거다. 검사를 통해 알아봤는데 <span class=company> 라고 되어있고 
    # child 로 링크안에 회사이름이 기재되어있는것도 있고 span 태그안에 바로 기재되어있는 것도 있어서 if/else 문법을 써주었다.
    # 그리고 span태그 a 태그를 나누어서 변수에 담고 사용하였다. 그리고 str 함수로 글자변환한다음에 space 를 없애주려고 strip() 함수도 사용해주었다.
    # 이로써 깔끔하게 company 까지 출력이 된다.
    
    location = html.find("div", {"class":"recJobLoc"})["data-rc-loc"]
    job_id = html["data-jk"] 
    link = f"https://www.indeed.com/viewjob?jk={job_id}"    
    return {'Title': title , 
            'Company': company , 
            'location': location, 
            'link':link
            }
            
    # 중요한건 장소, 링크를 뽑아낼때, 검사를 통해 해당 장소코드가 어디에 위치하는지, 그리고 링크의 url 은 어떻게 생성되는지 알아내야한다.
    # 장소는 location 에서 div class=recjobloc 안에 attribute 로 data-rc-loc에 명시되어있었고 링크는 클릭해서 url을 보고 구성하였다.
    # link url을 보니 job_id를 각각 할당받아 구성되어진걸 확인 할 수 있었다. 그래서 job_id를 변수로 따로 담았다. 
    # 그리고 return을 위와 같은 방법으로 구성해주어 보기 쉽게 하였다.
    

함수간의 연계성

이때까지 만든 함수 간의 로직을 만들어 그것을 또 다시 새로운 함수에 넣을거다.


def get_jobs():
    max_indeed_pages = last_page()
    indeed_jobs = extractor_indeed_jobs(max_indeed_pages)
    return indeed_jobs
# return 하는 거 잊지말자!

이렇게 하고 나중에 scrapper.py 라는 파일을 따로 만들어서 그 파일안에 실행코드만 적어주면 더 깔끔하게 프로그램을 관리할 수 있게 된다.
아래 코드처럼 말이다.

from so import get_jobs as so_jobs


s_job = so_jobs()
print(s_job)

그러고 터미널에서 실행해 보면 아래와 같이 결과가 나온다.

C:\>"python scraper\scraper.py"
scrapping INDEED Page: 0
scrapping INDEED Page: 1
scrapping INDEED Page: 2
scrapping INDEED Page: 3
scrapping INDEED Page: 4
scrapping INDEED Page: 5
scrapping INDEED Page: 6
scrapping INDEED Page: 7
scrapping INDEED Page: 8
scrapping INDEED Page: 9
[{'Title': 'Python Developer Intern', 'Company': 'OXO Solutions', 'location': 'Ruby, SC', 'link': 'https://www.indeed.com/viewjob?jk=84a541c104b5b24c'}, {'Title': 'Python Developer | Richmond, VA (Remote until 2021)', 'Company': 'iknowvate technologies', 'location': 'Richmond, VA', 'link': 'https://www.indeed.com/viewjob?jk=5a9a0ac14d0aaba7'},
profile
'과연 이게 최선일까?' 끊임없이 생각하기

0개의 댓글