본문 바로가기

[자기계발]/유튜브로 코딩배우기

<Nomad Coders> 파이썬 실습 web scrapper

반응형

import requests

 

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

 

print(indeed_result.text)

 

package 탭에서 requests를 (라이브러리) 다운받아서 html을 불러오는 모듈을 설치한다.

r = requests.get(url) 해당 url 사이트에 get 요청을 보내는 것
요청 성공시 200으로 응답한다.

 

이제 가지고 온 html에서 원하는 정보를 추출해야 한다. 페이지 숫자를 가져오는 작업을 해야하는데 수동으로 하려면 시간이 오래 걸린다. 고로 구글링: beautifulsoup (html에서 정보를 추출할 때 쓰는 모듈)

packages에 가서 beautifulsoup4를 검색하여beautifulsoup4 Screen-scraping library 설치한다.


import requests

from bs4 import BeautifulSoup

 

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

print(spans[:-1])

 

이 작업을 통해

  1. requets랑 bs4를 import 해주었고
  2. request로 페이지 1 추출
  3. soup를 통해 총 몇개의 페이지가 있는지 확인하였다. 이것으로 데이터를 탐색하고 추출할 수 있다. 
  4. html 데이터에서 pagination = 페이지 넘버 버튼을 찾았다.

  1. import requests

from bs4 import BeautifulSoup

 

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

 

links = pagination.find_all('a')

pages = []

for link in links:

    pages.append(link.find("span").string)

pages = pages[0:-1]

print(pages)

 

or 

 

links = pagination.find_all('a')

pages = []

for link in links:

    pages.append(link.string)

pages = pages[0:-1]

print(pages)

 

결과: ['2', '3', '4','5']

 

페이지의 넘버를 다 가져왔다.

 

links = pagination.find_all('a')

pages = []

for link in links:

    pages.append(int(link.string))

pages = pages[0:-1]

print(pages)

 

int = integar (정수)

이렇게 하면 마지막의 next (>표시)는 정수가 아니기 때문에 

 

links = pagination.find_all('a')

pages = []

for link in links[:-1]:

    pages.append(int(link.string))

print(pages)

 

이렇게 마지막 것은 안읽도록 범위를 다시 설정해주어야 한다.

만약에 마지막 페이지 숫자를 가져오고 싶다면?

links = pagination.find_all('a')

pages = []

for link in links[:-1]:

    pages.append(int(link.string))

print(pages[-1])

 

결과: 5

 

import requests

from bs4 import BeautifulSoup

 

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

 

links = pagination.find_all('a')

 

pages = []

 

for link in links[:-1]:

 

pages.append(int(link.string))

 

max_page = pages[-1]

 

for n in range(max_page):

print(f"start={n * 50}")

 

 

1. 모든 a 태그 검색
soup.find_all("a")
soup("a")

2. string 이 있는 title 태그 모두 검색
soup.title.find_all(string=True)
soup.title(string=True)

3. a 태그를 두개만 가져옴
soup.find_all("a", limit=2)

4. string 검색
soup.find_all(string="Elsie") # string 이 Elsie 인 것 찾기
soup.find_all(string=["Tillie", "Elsie", "Lacie"]) # or 검색
soup.find_all(string=re.compile("Dormouse")) # 정규식 이용

5. p 태그와 속성 값이 title 이 있는거
soup.find_all("p", "title")
예)

6. a태그와 b태그 찾기
soup.find_all(["a", "b"])

7. 속성 값 가져오기
soup.p['class']
soup.p['id']

8. string을 다른 string으로 교체
tag.string.replace_with("새로운 값")

9. 보기 좋게 출력
soup.b.prettify()

10. 간단한 검색
soup.body.b # body 태그 아래의 첫번째 b 태그
soup.a # 첫번째 a 태그

11. 속성 값 모두 출력
tag.attrs

12. class 는 파이썬에서 예약어이므로 class_ 로 쓴다.
soup.find_all("a", class_="sister")

13. find
find()
find_next()
find_all()

14. find 할 때 확인
if soup.find("div", title=True) is not None:
i = soup.find("div", title=True)

15. data-로 시작하는 속성 find
soup.find("div", attrs={"data-value": True})

16. 태그명 얻기
soup.find("div").name

17. 속성 얻기
soup.find("div")['class'] # 만약 속성 값이 없다면 에러
soup.find("div").get('class') # 속성 값이 없다면 None 반환

18. 속성이 있는지 확인
tag.has_attr('class')
tag.has_attr('id')
있으면 True, 없으면 False

19. 태그 삭제
a_tag.img.unwrap()

20. 태그 추가
soup.p.string.wrap(soup.new_tag("b"))
soup.p.wrap(soup.new_tag("div")

 

 

Extracting Titles

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={0*LIMIT}")

soup = BeautifulSoup(result.text, "html.parser")

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

for result in results:

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

print(title)

return jobs

 

 

우리는 모든 것을 chaining 했다. result는 일자리 목록이었고,

find("h2"  == 거기서 h2 를 찾아

{"class": "title"}) == calss명이 title 이어야했다.

.find("a")["title"] == 그리고 그 안에 acnchor를 찾아서

["title"] == 그 attribute인 ["title"]을 가져왔다.

 

 

#2.7 Extarcting Companies

 

soup.find_all('a')
매개변수로 tag 입력
해당되는 모든 tag들 리스트로 반환

 

soup.find('a')
매개변수로 tag 입력
해당되는 첫 번째 tag만 가져온다.
그 첫 번째 tag 안에 들어 있는 tag들도 다 가지고 옴.
리스트로 돌려주지 않는다.

 

for result in results:

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

print(title)

company = result.find("span",{"class": "company"})

company_anchor = company.find("a")

if company_anchor is not None:

company = (str(company_anchor.string))

else:

company = (str(company.string))

print(company)

print(title, company)

return jobs

 

strip은 빈 칸이 포함된 string 다음에 쓸 수 있다.

company = company.strip()
괄호 안이 비어있으면 빈 칸을 지워준다. F를 쓰면 F로 시작하는 단어를 지워준다.

 

타이틀과 회사이름이 나온다.

 

 

하다보니 아직 기초 공부를 더 해야 할 것 같다.

velog.io/@banana/Python-Python%EC%9C%BC%EB%A1%9C-%EC%9B%B9-%EC%8A%A4%ED%81%AC%EB%9E%98%ED%8D%BC-%EB%A7%8C%EB%93%A4%EA%B8%B0-2.8

 

[Python] Python으로 웹 스크래퍼 만들기 (2.8 Extracting Locations and Finishing up)

노마드 코더 Python으로 웹 스크래퍼 만들기

velog.io

이 블로그에 정리가 더 잘되어있으니 차차 따라가기로하자

반응형