Web Scrapper_02

chaerin·2020년 12월 26일
0

PYTHON

목록 보기
2/17
post-thumbnail

indeed와 stackoverflow 사이트에서 구직 정보를 가져오는 웹스크래퍼를 만들어 본다.

1. 구직 정보 가져오기(indeed)

requests 모듈과 Beautiful Soup 라이브러리

  • requests
    API를 사용할 때 주로 사용한다. 사용을 할때는 보통 HTTP 메소드(method, 또는 함수)의 GET 과 POST를 사용한다. GET을 사용할 때는 requests.get()을 사용하고, POST를 사용할때는 requests.post()를 사용한다.
  • Beautiful Soup
    기본적으로 패키지 import를 통해서 가져오며 html파일을 가져오거나 urllib 혹은 requests 모듈을 통해서 직접 웹에서 소스를 가져올 수도 있다.

1.1 마지막 페이지 구하기

def get_last_page():
    result = requests.get(URL)					# 1.1.1
    soup = BeautifulSoup(result.text, "html.parser")		# 1.1.2
    pagination = soup.find("div", {"class":"pagination"})   	# 1.1.3
    links = pagination.find_all('a')				# 1.1.4
    pages = []
    for link in links[:-1]:   					# 1.1.5
        pages.append(int(link.find("span").string))		# 1.1.6
    
    max_page = pages[-1]					# 1.1.7
    return max_page						# 1.1.8

1.1.1 requests를 통해 웹에 있는 소스 가져올 수 있다.
1.1.2 데이터 추출(extract data)
1.1.3 class명이 pagination인 div 찾기
1.1.4 모든 a(anchor) 찾아서 리스트를 만든 후 links 변수에 넣기
1.1.5 마지막값이 string(문자열)이기 때문에 제외
1.1.6 span을 찾아서 pages라는 array에 넣어줌
1.1.7 pages의 마지막값(-1)
1.1.8 max_page 반환

1.2 구직정보 dictionary

def extract_job(html):
    title = html.find("h2", {"class": "title"}).find("a")["title"]
    company = html.find("span", {"class": "company"})   			# 1.2.1
    company_anchor = company.find("a")
    if company:    		 						# 1.2.2
        company_anchor = company.find("a")
        if company_anchor is not None:
            company = str(company_anchor.string)
        else:
            company = str(company.string)
        company = company.strip()       					# 1.2.3
    else:
        company = None    
    location = html.find("div", {"class": "recJobLoc"})["data-rc-loc"]		# 1.2.4
    job_id = html["data-jk"]        						# 1.2.5
    return {
        'title': title,
        'company': company,
        'location': location,
        "link": f"https://kr.indeed.com/viewjob?jk={job_id}"
        }

1.2.1 find는 첫번째 결과만
1.2.2 company가 있는지 없는지 확인
1.2.3 string에 있는 문자를 삭제. 이 경우 (빈칸)으로 시작되는 문자 삭제 <- white space 제거
1.2.4 data-rc-loc의 값을 가져옴. div안의 attribute에 접근
1.2.5 html에서 div의 data-jk값(=job id)을 가져옴

1.3 구직정보 list화 하기

def extract_jobs(last_page):
    jobs = []
    for page in range(last_page):
        print(f"Scrapping Indeed: Page: {page}")
        result = requests.get(f"{URL}&start={page*LIMIT}")    			# 1.3.1
        soup = BeautifulSoup(result.text, "html.parser")
        results = soup.find_all("div", {"class": "jobsearch-SerpJobCard"})	# 1.3.2
        for result in results:
            job = extract_job(result)       					# 1.3.3
            jobs.append(job)        						# 1.3.4
    return jobs

1.3.1 페이지 요청
1.3.2 find_all은 리스트 전부를 가져옴
1.3.3 extract_job 함수를 호출해서 html 인자를 받음. 여기서 html은 request한 결과를 담은 result이다.
1.3.4 이 function은 job을 반환하고 이 반환된 값을 jobs라는 array에 넣어줌.

0개의 댓글