노마드 코더 phython 강의 7일차 정리

야무GYM·2023년 2월 21일
post-thumbnail
from requests import get
from bs4 import BeautifulSoup

base_url = "https://weworkremotely.com/remote-jobs/search?term="
search_term="java"
response = get(f"{base_url}{search_term}")

if response.status_code != 200:
    print("Can't request website")
else:
    results = []  #(2)
    soup = BeautifulSoup(response.text, "html.parser")  
    jobs = soup.find_all('section',class_="jobs")
    for job_section in jobs:
        job_posts = job_section.find_all('li')
        job_posts.pop(-1)
        for post in job_posts:
            anchors = post.find_all('a')
            anchor = anchors[1]
            link = anchor['href']
            company, kind, region = anchor.find_all(
            'span', class_="company")
            title = anchor.find('span', class_='title')
            job_data = {
            'link': f"https://weworkremotely.com/{link}",
            'company': company.string,
            'region': region.string,
            'position': title.string
            }
            results.append(job_data)  #(1)
   for result in results:
     print(result)
     print("////////////")

⦁ 23번째 줄까지 작성을 해 보았고, 24번째 줄 부터 새로운 내용을 추가했다. 지금까지는 결과를 출력해 봤을때 html의 태그들이 함께 나와 보기가 불편했다. 그 점을 해결하기 위해 각각의 요소들을 dictionary에 정리해 dictionary 자체를 출력하는 방법을 썼다.

보통

<span class="title">title</span> 

이런 코드를 BeautifulSoup로 받아둘 텐데, string method로 호출하면, BeautifulSoup는 title만 남겨준다.

link 같은 경우 완전한 주소로 적혀 있지 않기 때문에 필요한 부분을 채워넣었다.

⦁ 코드에 #(1)과 #(2)로 표시를 해 뒀다. 이렇게 하는 이유는
for loop로 나오는 결과들을 한번에 보고 싶은데, for loop는 loop하나를 돌고나면, 그 내용들은 삭제가 되고 새로운 loop의 내용만을 가지고 있게 된다. 결과를 저장해두고 한번에 출력해야 하기 때문에 #(2)처럼 빈 공간을 확보 해 두고(이때도 물론 loop에 영향을 받지 않는 level에서 적어둬야 한다.), #(1)처럼 .append로 내용을 계속 덧붙여 주는 형식으로 하면 된다.

결과를 확인해 보면,

이런 식으로 link, company, region, position 순으로 값들이 잘 나오는 것을 확인 할 수 있다.

⦁ 이번에는 기존 main파일에서만 출력을 했는데, weworkremotely의 공고 뿐 아니라, 다른 사이트에서도 같은 방식으로 공고를 출력하기 위해 extrators라는 폴더를 만들고 그 안에 wwr.py라는 파일을 만들었다. 그리고 거기에 기존에 있던 main 파일의 코드를 붙여넣었고, main파일은 form-import를 제외하고 남겼다.

이렇게 하는 방식을 "refactoring" 라고 하는데, 이 말의 뜻은
<결과의 변경없이 코드의 구조를 '읽기쉽고, 재사용하기 쉽게' 조정하는 것>이다.

main파일의 코드 구성은 다음과 같다.

from requests import get
from bs4 import BeautifulSoup

jobs = extract_wwr_jobs("java")
print(jobs)

wwr파일에 extract_wwr_jobs라는 함수를 만들어뒀다.
이 함수는 우리가 지금까지 써왔던 search_term을 대신 하여 검색어를 argument로 받을 것이다.

다음은 wwr파일의 코드이다.

from requests import get
from bs4 import BeautifulSoup

def extract_wwr_jobs(keyword):
  base_url = "https://weworkremotely.com/remote-jobs/search?term="
  
  response = get(f"{base_url}{keyword}")
        
  if response.status_code != 200:
      print("Can't request website")
  else:
      results = []
      soup = BeautifulSoup(response.text, "html.parser")  
      jobs = soup.find_all('section', class_="jobs")
      for job_section in jobs:
          job_posts = job_section.find_all('li')
          job_posts.pop(-1)
          for post in job_posts:
              anchors = post.find_all('a')
              anchor = anchors[1]
              link = anchor['href']
              company, kind, region = anchor.find_all(
              'span', class_="company")
              title = anchor.find('span', class_='title')
              job_data = {
              'link': f"https://weworkremotely.com/{link}",
              'company': company.string,
              'region': region.string,
              'position': title.string
            }
              results.append(job_data)
      return results

위에서 설명했다시피, keyword를 받는 extract_wwr_jobs라는 함수를 만들어 놓고, main에 있던 코드를 넣어주었다. 그리고 마지막에 결과를 출력하는 부분만 지우고 results를 return하게 했다. 이는 나중에 내용들을 모두 엑셀 파일에 넣어 주는 작업을 하기 편하게 하기 위함이다.

0개의 댓글