본문 바로가기
Python/Python으로 웹 스크래퍼 만들기

[SCRAPPER Clone] 2. Extracting Indeed Pages

by 닉우 2020. 9. 2.
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')

soup은 추출하는 역할을 할거다.

 

indeed_soup은 어떤 데이터를 찾아주는 object라고 할 수 있다.


soup.find_all('a') <- 앵커요소들을 모두 담으라는거다. (리스트로 반환됨)

 

해당 url주소의 페이지의 html을 볼건데 inspect로 들어가서

페이지 숫자가 있는곳을 찾아본다. (pagination)

pagination은 div로 되어있다.

저 안에 링크들이 있다.


이제 class명이 pagination인 div를 찾도록 하자.

그런 후 앵커를 찾아볼거다.

pages = pagination.find_all('a')

찾은 결과를 pagination 변수에 넣어줬는데

거기서 리스트를 만들어서 pages 변수에 넣어준거다.


다음은 리스트에 있는 각 anchor의 span을 찾아보도록 하자.

모든 span을 가져왔다.

나중에 function을 만들건데 가장 높은 숫자를 찾을 거다.

 

마지막에 출력된것은 없애주자.

1. loop 밖에 리스트 변수를 만들어서 그 안에 span을 넣는다.

2. 리스트에서 마지막 item을 제거해준다. span[:-1]

   (-1은 리스트 마지막에서부터 시작해서 첫 item을 나타난다.)

 

첫 번째부터 마지막 항목전까지만 출력된다.


import requests
from bs4 import BeautifulSoup

indeed_result = requests.get("https://www.indeed.com/jobs?as_and=python&as_phr=&as_any=&as_not=&as_ttl=&as_cmp=&jt=all&st=&salary=&radius=25&l=&fromage=any&limit=50&sort=&psf=advsrch&from=advancedsearch")

indeed_soup = BeautifulSoup(indeed_result.text, "html.parser")

pagination = indeed_soup.find("div", {"class":"pagination"})

pages = pagination.find_all('a')


spans = []
for page in pages:
    spans.append(page.find("span"))

spans = spans[:-1]

 

indeed 페이지를 성공적으로 추출했다.


각 링크안에 span을 찾았다.

더 나아가서 텍스트만 가져오는 방법도 있다.

근데 span에 있는 string이 아니라

링크(앵커)안에 있는 string을 가져오면 어떻게 될까?

같은 결과가 나온다.

앵커가 있고 이 요소안에 다른 요소가 있고

그 요소에 string이 오직 하나 있다면 그냥 앵커에서 string method를

실행하면 된다. 그러면 beautifulsoup이 알아서 찾아준다.

 

출력결과를 보면 스트링으로 되어있는데 int를 써서 정수로 바꿔주자.

 

그런데 이렇게 하면 숫자 외의 것이 포함되어있어서 ("Next같은 문자") 에러가 발생한다.

마지막 요소는 읽지 않도록 아래와 같이 수정해주자.


이제 페이지 숫자중에 가장 큰 숫자를 찾아보자.

가장 마지막 숫자를 가져오면 될거다.


2페이지로 가서 url을 보자.

3페이지를 가보니 아래와 같다.

이건 말하자면 50에다가 페이지 수를 곱해준거다.

참고로 페이지 숫자 자체가 아니라 배열 순서를 말하는거다.

3은 2가 되고 2는 1이 된다. (숫자1은 start가 없기때문)

 


이제 해야될건 페이지를 계속해서 request하는 방법을 알아봐야한다.

최대 페이지 숫자를 알았으니 20개의 request를 만들어야된다.


 

 

 

 

 

 

 

 

 

 

 

 

※ 본 포스팅은 개인 공부 기록을 목적으로 남긴 글이며 본 사실과 다른 부분이 있다면 과감하게 지적 부탁드립니다.

댓글