Web Scrapper_03

2745 단어 pythonpython

2. 구직 정보 가져오기(Stack Overflow)

이전의 indeed 사이트의 구직정보를 불러올 때와 마찬가지로 코드가 구성된다.

2.1 마지막 페이지 구하기

def get_last_page():
    result = requests.get(URL)
    soup = BeautifulSoup(result.text, "html.parser")
    pages = soup.find("div", {"class": "s-pagination"}).find_all("a")
    last_page = pages[-2].get_text(strip=True)     			# 2.1.1
    return int(last_page)

2.1.1 -1이 마지막 수이고 -2가 그 앞의 수/ strip=true를 이용해 white space 없애주기

Beautiful Soup을 이용하여 텍스트 추출하기

  • get_text()
    get_text()를 이용하면 한 번에 현재 HTML 문서의 모든 텍스트를 추출할 수 있다. 조금 더 정확히 표현하면 get_text() 메서드는 현재 태그를 포함하여 모든 하위 태그를 제거하고 유니코드 텍스트만 들어있는 문자열을 반환한다.
  • string
    • 태그(tag) 내 문자열을 반환한다.
    • 태그(tag) 내 자식 태그가 둘 이상이면, 무엇을 반환해야 하는지 명확하지 않기 때문에 None을 반환한다.
    • 단 자식 태그가 하나이면서, 그 자식 태그가 .string 값을 가지고 있다면 자식 태그의 문자열을 반환한다.
  • 출처 : https://hogni.tistory.com/21

2.2 구직정보 dictionary

def extract_job(html):      # 2.2.1
    title = html.find("div", {"class": "grid--cell fl1"}).find("h2").find("a")["title"]
    company, location = html.find("h3", {"class": "mb4"}).find_all("span", recursive=False)
    # 2.2.2 # 2.2.3
    company = company.get_text(strip=True)
    location = location.get_text(strip=True)
    job_id = html['data-jobid']
    return {
        'title':title,
        'company':company,
        'location':location,
        "apply_link": f"https://stackoverflow.com/jobs/{job_id}"
        }

2.2.1 soup object
2.2.2
리스트에 요소가 두개일 때 값을 따로 불러올 시

company_row = html.find("h3", {"class": "mb4"}).find_all("span", recursive=False)
company = company_row[0]
location = company_row[1]

위의 코드를 아래와 같이 작성 가능하며 같은 결과를 얻을 수 있다.(unpacking values)

company, location = html.find("h3", {"class": "mb4"}).find_all("span", recursive=False)

2.2.3
하위 첫번째 단계의 해당 값만 가져오기 위해 recursive=false 사용
unpacking values(요소가 두개임을 알고 있기에 사용가능)

2.3 구직정보 list

def extract_jobs(last_page):
    jobs = []
    for page in range(last_page):
        print(f"Scrapping SO: Page {page}")
        result = requests.get(f"{URL}$ppg={page+1}")
        soup = BeautifulSoup(result.text, "html.parser")        # 2.3.1
        results = soup.find_all("div", {"class": "-job"})
        for result in results:
            job = extract_job(result)
            jobs.append(job)
    return jobs

2.3.1 같은 변수명이여도 각자의 함수 스코프 안에서만 존재하기 때문에 사용 가능

좋은 웹페이지 즐겨찾기