본문 바로가기
Python/Web Scraping

[Python] #2.6 Extracting Titles (#코딩공부)

by 함께 공부해요 2020. 2. 19.

https://youtu.be/3vfIMmZeNNY


<복습>

https://wook-2124.tistory.com/31

 

[Python] #2.4 Extracting Indeed Pages part Two (#코딩공부)

https://youtu.be/YKY9SFm1cfw <복습> https://wook-2124.tistory.com/29 [Python] #2.3 Extracting Indeed Pages (#코딩공부) https://youtu.be/O-4tzqK_DB4 <복습> https://wook-2124.tistory.com/27 [Python] #..

wook-2124.tistory.com


<준비물>

https://repl.it/

 

The world's leading online coding platform

Powerful and simple online compiler, IDE, interpreter, and REPL. Code, compile, and run code in 50+ programming languages: Clojure, Haskell, Kotlin (beta), QBasic, Forth, LOLCODE, BrainF, Emoticon, Bloop, Unlambda, JavaScript, CoffeeScript, Scheme, APL, Lu

repl.it

https://github.com/psf/requests

 

psf/requests

A simple, yet elegant HTTP library. Contribute to psf/requests development by creating an account on GitHub.

github.com

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

 

Beautiful Soup: We called him Tortoise because he taught us.

 

www.crummy.com


<코드기록>

# 2번째 def인 extract_indeed_jobs(last_page)에 soup = BeautifulSoup(result.text, "html.parser")을 추가해주고 results를 만들어서 soup.find_all을 통해 jobsearch를 해줌!
import requests
from bs4 import BeautifulSoup


LIMIT = 50
URL = f"https://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}")
    soup = BeautifulSoup(result.text, "html.parser")
    results = soup.find_all("div", {"class":"jobsearch-SerpJobCard"})
    print(results)
  return jobs


# <for 새로운 변수명(result) in 활요하고자 하는 변수명(results)> 을 활용해서 anchor 안에있는 title을 뽑아냄!
def extract_indeed_jobs(last_page):
  jobs = []
  # for page in range(last_page):
  result = requests.get(f"{URL}start={0 * LIMIT}")
  soup = BeautifulSoup(result.text, "html.parser")
  results = soup.find_all("div", {"class":"jobsearch-SerpJobCard"})
  for result in results:
      title = result.find("div", {"class":"title"}).find("a")["title"]
      print(title)
  return jobs

1. jobsearch 하기

먼저 main.py에서 indeed.py로 부터 extract_indeed_pages, extract_indeed_jobs를 호출하고

last_indeed_page = extract_indeed_pages()

indeed_jobs = extract_indeed_jobs(last_indeed_page)

위에 보이는 코드처럼 indeed_jobs 변수를 - extract_indeed_jobs 호출한 것에 last_indeed_page를 찾은 값이라고 설정해준다.


indeed 페이지에서 F12 혹은 Inspection(검사)를 통해 div class="jobsearch-SerpJobCard"를 찾아주자.


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

soup의 기능을 다시 사용하기 위해서 전에 했던 https://wook-2124.tistory.com/29?category=890509

 

[Python] #2.3 Extracting Indeed Pages (#코딩공부)

https://youtu.be/O-4tzqK_DB4 <복습> https://wook-2124.tistory.com/27 [Python] #2.2 Navigating with Python (#코딩공부) https://youtu.be/kmH3exe4uZc <복습> https://wook-2124.tistory.com/25 [Python] #2..

wook-2124.tistory.com

soup = BeautifulSoup(result.text, "html.parser")를 새로 정의한 함수에도 다시 불러오고

 

results = soup.find_all("div", {"class":"jobsearch-SerpJobCard"}) 코드처럼 

div class="jobsearch-SerpJobCard"로 찾은 정보를 입력하고 print(results)해주면 끝!!

 

하지만 모든 페이지를 가지고와서 아직은 복잡하다.. 그리고 returns jobs로 [] list로 묶어주자!


2. title 가져오기

이번에는 div class="title"을 가져와보자. a target 안title-"Jr Python developer" 라고 되있는 것을 가져오면 된다!


for result in results로 for 구문을 만들어서 results 결과에 나온 div class안에있는 title 다 가져왔다.

 

근데 title 자체가 str(문자열)이다보니까 너무 길어서 위에서 말한 title-"Jr Python developer" 이 부분만 따로 추출해야한다.

 

title.find("a").string을 해석하자면, div class="title"안에 있는 것중에 find(찾아라) a(anchor)를 string으로 바꿔서! 인데 여기서 anchor는 홈페이지 F12로 봤던 a target에 포함된 것들이라고 생각하면 된다.

 

그 수많은 것중에서 또 title만 뽑아내니 title-"Jr Python developer"에서 Jr Python developer만 남은 것이다.

 

하지만 문제가 있는데 그것은 None이라는 값이다. 아마 title쪽에 제목을 집어넣지 않아서 나온 값으로 생각이 된다.


3. title안의 anchor 변수 재정의(override)하기

anchor = title.find("a")["title"] 이것을 해석하자면, anchor는 title에서 찾은(find) a(anchor)중에서 title만 뽑아낸 값이야! 라고 할 수 있겠다.

 

그리고 그것을 print(anchor)해주면 터미널에 보이는 것처럼 깔끔하게 나오는 것을 알 수 있다.

 

그럼 마지막으로 굳이 따로 anchor 변수를 만들 필요없이 title변수에 합쳐주면 된다.

 

title = result.find("div", {"class":"title"}).find("a")["title"]

result라는 새로운 변수명(for)에 찾아라(find) div class="title"을, 그리고 추가로 a(anchor)안에 있는 "title"도 찾아라.

 

그럼 다음시간에 이어서 정리!! :)


※ 코로나바이러스감염증-19 조심하세요!!!!

댓글