개발자

Python으로 웹 스크래퍼 만들기 1

지구빵집 2019. 10. 25. 21:48
반응형

  가을을 넘는 방법 중 하나가 밀린 공부를 하는 일이다. 부지런히 공부하기로 한다. 공부도 신념이나 생각과 마찬가지로 잃지 않는 것이다. 부를 만드는 가장 강력한 도구의 하나가 지식을 쌓는 일이다.

 

실습 사이트는 repl.it 에서 직접 파이선을 코딩하여 실습한다. 놀랄 정도가 아니라 기절할 수준이다. 예술도 이런 예술이 없다. 아름다운 파이선 코드에 홀딱 반한 첫날이다! 

 

프로젝트 개요: indeed.com 구직사이트에서 "python" Job을 원하는 사람들을 50개씩 20페이지를 엑셀 파일 csv 형태로 저장하여 나오게 하는 작업이다. 동영상을 보며 한 줄 한 줄 타이핑하며 결과를 확인한다. 시키는 대로 하고, 따라 하라는 대로 한다. 교육을 받는 사람에게 이해는 나중에 온다고 믿는다. 우선은 같은 결과를 두 눈으로 확인하는 일이 우선이다. 포스트 마지막에 함께 학습하면서 방문한 모든 사이드를 나열했으니 참고하시길. 물론 필자가 참고하려고 남겨둔다. 

 

아래 파일이 main.py 코드다.

from indeed import extract_indeed_pages, extract_indeed_jobs 

last_indeed_page =  extract_indeed_pages()

indeed_jobs = extract_indeed_jobs(last_indeed_page )

 

함수 작성한 파일은 indeed.py 코드가 아래에 있다.

import requests
from bs4 import BeautifulSoup

LIMIT = 50
URL = f"http://www.indeed.com/jobs?q=python&limit={LIMIT}"

def extract_indeed_pages():
  result =  requests.get(URL)
  soup = BeautifulSoup(result.text, 'html.parser')
  pagination = soup.find("div", {"class":"pagination"})
  links = pagination.find_all('a')
  pages = []
  for link in links[:-1]:
    pages.append(int(link.string))
  max_page = pages[-1]
  return max_page


def extract_indeed_jobs(last_page):
  jobs = []
  for page in range(last_page):
    result = requests.get(f"{URL}&start = {page*LIMIT}")
    print(result.status_code)
  return jobs  

 

결과는 콘솔에 출력된다. 현재까지는 다음과 같다. 

200 
200
200
200
200
200
200
200
200
200
200
200
200
200
200
200
200
200
200
200

 

여기까지 잘 따라왔다. 아래는 모든 데이터를 반환하는 코드

import requests
from bs4 import BeautifulSoup

LIMIT = 50
URL = f"http://www.indeed.com/jobs?q=python&limit={LIMIT}"

def extract_indeed_pages():
  result =  requests.get(URL)
  soup = BeautifulSoup(result.text, 'html.parser')
  pagination = soup.find("div", {"class":"pagination"})
  links = pagination.find_all('a')
  pages = []
  for link in links[:-1]:
    pages.append(int(link.string))
  max_page = pages[-1]
  return max_page

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


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

 

위 코드를 실행하면 아래와 같은 결과를 얻는다. 이렇게 열공한 적이 어느 땐가? 가을엔 그저 공부나~ 집에 가자.

Scarapping page 0
Scarapping page 1
Scarapping page 2
Scarapping page 3
Scarapping page 4
Scarapping page 5
Scarapping page 6
Scarapping page 7
Scarapping page 8
Scarapping page 9
Scarapping page 10
Scarapping page 11
Scarapping page 12
Scarapping page 13
Scarapping page 14
Scarapping page 15
Scarapping page 16
Scarapping page 17
Scarapping page 18
Scarapping page 19

 

도움 링크

https://repl.it/

https://docs.python.org/3/library/index.html

https://stackoverflow.com/

https://github.com/psf/requests

https://www.indeed.com/jobs?q=python&limit=50

https://www.crummy.com/software/BeautifulSoup/bs4/doc/

 

 

 

 Python에서 HTTP 요청을 보내는 모듈

 

 

 

 

반응형