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])
이 작업을 통해
- requets랑 bs4를 import 해주었고
- request로 페이지 1 추출
- soup를 통해 총 몇개의 페이지가 있는지 확인하였다. 이것으로 데이터를 탐색하고 추출할 수 있다.
- html 데이터에서 pagination = 페이지 넘버 버튼을 찾았다.
- 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로 시작하는 단어를 지워준다.
타이틀과 회사이름이 나온다.
하다보니 아직 기초 공부를 더 해야 할 것 같다.
이 블로그에 정리가 더 잘되어있으니 차차 따라가기로하자
'[자기계발] > 유튜브로 코딩배우기' 카테고리의 다른 글
[생활코딩]React 강의-2 15~16강 State, props, bind 소개 (0) | 2021.04.19 |
---|---|
[생활코딩] React 강의-1 1~14강 React 소개 (0) | 2021.04.06 |
<Nomad Coders> 파이썬 1.9~ 1.12 (0) | 2021.02.01 |
<Nomad Coders> 파이썬 이론 1.0~ (0) | 2021.01.26 |
<생활코딩> 많이 보이는 DATABASE 살짝 맛보기 (0) | 2021.01.26 |