본문 바로가기
Web Study/노마드코더

노마드코더 python 웹스크래퍼 만들기 - 2

by 쿠리의일상 2023. 6. 15.

Python의 자료구조

Tuple

list 와 유사하지만 ( ) 로 값을 나열

불변성을 가지므로 튜플은 넣어준 값을 변경할 수 없다는 특징을 가짐 -> 그래서 값을 변경시켜주는 메서드들이 존재 하지 않음

  • .count()
  • .index()

값에 접근하려면 [ ] 안에 인덱스로 접근해준다. 여기서, 음수값의 인덱스가 들어가면 거꾸로 접근이 가능하다 !!

 

Dictionary

{ } 안에 키와 값으로 써주며 구분자는 , 이다.

  • .get(키) : 키에 해당하는 값을 리턴
  • .clear()
  • .pop(키) : 키에 해당하는 키와 값을 제거
  • 딕셔너리[키] = 값 으로 원하는 키와 값을 추가 가능

 

 

For 반복문

for each in 리스트혹은튜플:
	// 반복할 내용

for~in 반복문으로 각각의 요소를 전부 돌 수 있음

반대의 의미를 주는 !는 not 키워드를 사용하여 나타내주며, https:// 가 붙지 않은 주소를 고쳐주는 예제

 

파이썬 패키지 모음 사이트

https://pypi.org/

 

PyPI · The Python Package Index

The Python Package Index (PyPI) is a repository of software for the Python programming language.

pypi.org

pip 을 사용하기 위해선 컴퓨터에 pip이 깔려 있는지 확인해줘야 한다.

macOS 의 경우 php3 이 깔려있는 경우가 있으므로 이땐 pip3도 깔려 있을 경우가 크다.

pip3 -v 로 버전을 확인해주고 있다면

pip3 install --upgrade pip

업그레이드 해준다. 그럼 pip도 사용 가능해질 것이다.

만약 pip이 없다면.. 홈브류를 사용하여 다운받아주면 된다.

pip 을 통해서 패키지를 다운 받아주면 된다. (npm 처럼)

pip list

해당 명령어로 패키지 목록도 확인 가능하다.

 

requests 패키지 사용하기

https://pypi.org/project/requests/

 

requests

Python HTTP for Humans.

pypi.org

파이썬 코드에서 웹 사이트로 요청을 보내는 것을 가능하게 해줌

pip install 패키지명

 

from 패키지명 import 꺼내쓸것

from requests import get

requests 의 get 을 가져와서 사용해줄 수 있다. get은 요청 메서드 중의 하나로 웹 사이트를 보여줄 수 있게 요청한다.

이때 반환값은 HTTP의 응답 정보를 가지고 있는데 그중에서 status_code 도 존재한다.

 

웹 스크래퍼 구현하기

웹 스크래핑란 웹 페이지 상의 내용을 긁어오는? 기능을 의미

beautiful soup

웹 스크래핑을 할 수 있는 파이썬 패키지

pip install beautifulsoup4

 

몇몇의 웹 사이트들은 스크래핑하는 것을 싫어하므로 이상한 코드를 입력하여 인증하게 만들거나 봇 방지 프로그램을 사용한다. 

이용약관 상 상업적 용도로 사용이 불가능할 수 있다.

 

일단 requests 로 요청 메서드를 가져오자

from requests import get

스크래핑해줄 사이트는 https://weworkremotely.com/remote-jobs/search?&term=python 

 

We Work Remotely: Advanced Remote Job Search

Advanced job search for We Work Remotely, allowing you to search and refine jobs across programming, marketing, customer service, etc. Find your next remote career.

weworkremotely.com

해당 사이트의 jop 오퍼를 스크래핑 하려고 하는데, 주소값을 읽어와서, 특정 HTML 태그에 접근할 수 있어야 한다.

base_url = 'https://weworkremotely.com/remote-jobs/search?&term='
search_term = 'python'

response = get(f"{base_url}{search_term}")
print(response.text)

response.text 까지 해주면 읽어오는 사이트의 HTML 을 가져올 수 있다.

 

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

 

Beautiful Soup Documentation — Beautiful Soup 4.12.0 documentation

Beautiful Soup Documentation Beautiful Soup is a Python library for pulling data out of HTML and XML files. It works with your favorite parser to provide idiomatic ways of navigating, searching, and modifying the parse tree. It commonly saves programmers h

www.crummy.com

from bs4 import BeautifulSoup

 

# HTML 긁어오기
response = get(f"{base_url}{search_term}")
if response.status_code != 200:
    print('Cant request website')
else:
    # print(response.text)

    # Beautifulsoup
    soup = BeautifulSoup(response.text, 'html.parser')

    print(soup.find_all('section', class_='jobs'))

beautifulsoup 사용법은 간단하다. 크롤링 해줄 html 인자를 첫번째로, 다음 인자에는 포맷을 설정해준다.

html.parser 는 html 만 가능하므로 다른 포맷을 원하면 다운로드가 추가로 필요하다고 한다.

읽어온 html을 변수에 저장하고 여러 메서드를 사용하여 정보를 뽑아내면 된다.

강의에선 파이썬과 관련된 일자리의 정보를 가져오고 싶으므로 find_all(태그, 속성) 메서드를 사용해주었다.

section 태그의 jobs 클래스를 가져와서 -> li 요소들을 가져오되, 마지막 li(view-all 클래스)을 제외한 값 pop(-1)

from requests import get
from bs4 import BeautifulSoup

base_url = 'https://weworkremotely.com/remote-jobs/search?&term='
search_term = 'python'

# HTML 긁어오기
response = get(f"{base_url}{search_term}")
if response.status_code != 200:
    print('Cant request website')
else:
    results = []
    # Beautifulsoup
    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)  # find_all 은 list 를 리턴
        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 = {
                'position': title.string,
                'company': company.string,
                'kind': kind.string,
                'region': region.string,
                'link' : link.string,
            }
            results.append(job_data)
print(results)

 

 

모듈로 분리하기

from requests import get
from bs4 import BeautifulSoup

def extract_wwr_jobs(search_term):
    base_url = 'https://weworkremotely.com/remote-jobs/search?&term='

    # HTML 긁어오기
    response = get(f"{base_url}{search_term}")
    if response.status_code != 200:
        print('Cant request website')
    else:
        results = []
        # Beautifulsoup
        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)  # find_all 은 list 를 리턴
            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 = {
                    'position': title.string,
                    'company': company.string,
                    'kind': kind.string,
                    'region': region.string,
                    'link': f"http://weworkremotely.com{link}",
                }
                results.append(job_data)
    return results

분리해준 모듈을 사용하기 위해선

from 폴더명.파일명 import 모듈

이런 식으로 사용해준다.

from extractors.wwr import extract_wwr_jobs

python_jobs = extract_wwr_jobs('python')
print(python_jobs)

정상 작동됨