티스토리 뷰

Python

Python(파이썬)으로 웹 스크래퍼 만들기

YG - 96년생 , 강아지 있음, 개발자 희망 2022. 2. 6. 09:00

0. 시작 전

만약 pip를 설치가 안되어있다면

 

0-1. requests2 설치하기

pip install requests

https://pypi.org/project/requests2/

 

requests2

Python HTTP for Humans.

pypi.org

 

0-2. beautifulsoup4 설치하기

sudo apt-get install python3-bs4 // pip 로 모듈을 찾지 못하면 이 방법으로 깔으세요

pip install beautifulsoup4

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

 

Beautiful Soup Documentation — Beautiful Soup 4.9.0 documentation

Non-pretty printing If you just want a string, with no fancy formatting, you can call str() on a BeautifulSoup object, or on a Tag within it: str(soup) # ' I linked to example.com ' str(soup.a) # ' I linked to example.com ' The str() function returns a str

www.crummy.com

 

1. 시작하기

 

1-1. requests import 하기 

import requests

wanted_results = requests.get('https://www.wanted.co.kr/search?query=%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90')
print(wanted_results)

import requests 를 하고 원하는 페이지에 들어가서 url을 복사해와서  request 반응을 봅니다

response 200이면 정상 작동하는 중입니다
공식문서의 r.text에 대한 글

 

다시 wanted_results.text 를 하면 html 을 모두 불러옵니다

request를 이용해서 html 을 불러온 모습

 

1-2. beautifulSoup import 하기

공식 문서의 beautifulSoup 의 사용방법

 

import requests
from bs4 import BeautifulSoup

indeed_result=requests.get("https://kr.indeed.com/%EC%B7%A8%EC%97%85?as_and=react&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&vjk=84329a66291839cd")

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

pagination = indeed_soup.find("ul", {"class":"pagination-list"})

current = pagination.find_all('b')
pages = pagination.find_all('span')

spans = []

spans.append(current)
for page in pages:
    spans.append(page)

print(spans[:-2])

찾고자 하는 부분
콘솔로그 결과

 

1-3. 리스트의 마지막 페이지의 값을 찾는 함수 만들기

import requests
from bs4 import BeautifulSoup

LIMIT = 50

URL =f"https://kr.indeed.com/%EC%B7%A8%EC%97%85?as_and=react&as_phr&as_any&as_not&as_ttl&as_cmp&jt=all&st&salary&radius=25&l&fromage=any&limit={LIMIT}&sort&psf=advsrch&from=advancedsearch&vjk=84329a66291839cd"


def extract_indeed_pages():
    result=requests.get(URL)
    soup = BeautifulSoup(result.text,"html.parser")
    pagination = soup.find("ul", {"class":"pagination-list"})
    pages = pagination.find_all('span')
    spans = []
    for page in pages[:-2]:
        spans.append(int(page.string))
    max_page = spans[-1]
    return max_page

 

1-4 마지막 페이지를 토대로 각 페이지의 URL 만드는 함수 만들기

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

url 이 정상 작동하는 모습

2. 각 페이지마다 beautiful soup 이용하기

h2의 jobTitle을 모두 찾아야한다

def extract_indeed_jobs(last_page):
    #for page in range(last_page):
    result= requests.get(f"{URL}&start={0*LIMIT}")
    soup = BeautifulSoup(result.text,"html.parser")
    results = soup.find_all("h2",{"class":"jobTitle"})
    for result in results:
        title = result.find("span",title=True).string
        print(title)

h2의 jobTitle을 모두 찾은 후 그 결과들을 다시 제목이 들어있는 span에서 title이 태그가 있는 값만 가져왔다.

콘솔 결과

 

2-1. html 을 받아서 각각 원하는 항목을 dict 타입으로 리턴하는 함수를 만듭니다.

def extract_job(html):
    title_box=html.find("h2",{"class":"jobTitle"})
    title = title_box.find("span",title=True).string
    company = html.find("span",{"class":"companyName"}).string
    location = html.find("div",{"class":"companyLocation"}).string
    return {"title":title,"companyName":company,"location":location}

 

2-2 jobs라는 배열안에 각 결과물을 넣어주고 jobs 배열 값을 리턴합니다.

import requests
from bs4 import BeautifulSoup

LIMIT = 50

URL =f"https://kr.indeed.com/%EC%B7%A8%EC%97%85?as_and=react&as_phr&as_any&as_not&as_ttl&as_cmp&jt=all&st&salary&radius=25&l&fromage=any&limit={LIMIT}&sort&psf=advsrch&from=advancedsearch&vjk=84329a66291839cd"


def extract_indeed_pages():
    result=requests.get(URL)
    soup = BeautifulSoup(result.text,"html.parser")
    pagination = soup.find("ul", {"class":"pagination-list"})
    pages = pagination.find_all('span')
    spans = []
    for page in pages[:-2]:
        spans.append(int(page.string))
    max_page = spans[-1]
    return max_page

def extract_job(html):
    title_box=html.find("h2",{"class":"jobTitle"})
    title = title_box.find("span",title=True).string
    company = html.find("span",{"class":"companyName"}).string
    location = html.find("div",{"class":"companyLocation"}).string
    return {"title":title,"companyName":company,"location":location}

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

잘 나오는 모습

3. csv 파일로 만들어서 엑셀 시트로 표현하기

CSV(영어: comma-separated values)는 몇 가지 필드를 쉼표(,)로 구분한 텍스트 데이터 및 텍스트 파일이다. 확장자는 . csv이며 MIME 형식은 text/csv이다. comma-separated variables라고도 한다.

 

 

파이썬에는 csv 파일로 변환 해주는 모듈을 지원합니다. 스크랩한 정보들을 보기 좋게 엑셀로 볼 수 있습니다.

 

save.py 파일

import csv

def save_to_file(jobs):
    file =open("jobs.csv",mode="w")
    writer = csv.writer(file)
    writer.writerow(["title","companyName","location","link"])
    for job in jobs:
        writer.writerow(list(job.values()))
    return

App.py 파일

from src.indeed import get_jobs as get_indeed_jobs
from src.save import save_to_file
from src.so import get_jobs as get_so_jobs

indeed_jobs=get_indeed_jobs()
so_jobs=get_so_jobs()

jobs = indeed_jobs + so_jobs

save_to_file(jobs)

# print(indeed_jobs)

 

Python 으로 웹 스크래퍼 만들기였습니다

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함