Crawling

2022. 3. 24. 18:34Python

  • 크롤링 진행 순서

1. url정의
2. requsts로 url에 정보요청
3. 정보를 html 변환 (보기 쉽게)
4. html 내에서 뉴스헤더 선별

 

BeautifulSoup 사용

  • requests는 요청을 받기는 하지만 text로만 받음
  • API는 통신을 위해 정형화 된 데이터 형태의 text
  • 우리가 원하는 데이터로 가공하기 위해 편의상 html로 변환
  • text를 html로 변환하는 모듈이 beautifulSoup
import requests # 크롤링에 사용하는 패키지
# 컴퓨터간 통신을 위한 여러가지 기능들을 파이썬으로 제어할 수 있도록 하는 패키지
from bs4 import BeautifulSoup # html 변환에 사용함
url = ' 크롤링 하고 싶은 페이지 url '
rep = requests.get(url)
html = BeautifulSoup(rep.text , 'html.parser')
html.select(' html내에서 보고 싶은 정보만 선별 ')

 

  • 코드 결과 해석
# 100 우리 이런정보 내주는거야
# 200 성공
# 300 우리 이 사이트 이리루 이사했어 일루가
# 400 유저가 요청을 잘못한경우
# 500 서버 문제

 

 

태그 클래스 접근시 'tag'.'class' 

    

셀렉터 

  • 조합 셀렉터
태그 이름이 span이고 클래스 이름은 txt인 라인을 찾고 싶다. : span.txt 
li 태그 중에서 id가 name 인 라인을 찾고\ 싶다. : li#name
  • 경로 셀렉터
	<ul>
        <li><span>이걸 찾으려면?</span></li>
    </ul>
    <span>이건 아님</span>

    ul 태그안 li 태그 안 span 라인을 찾는다
    ul > li > span 혹은 ul li span

 

Key 

  • 차단막는 코드
    seed = np.random.randint(100) # 무작위 정수 뽑아줌 -> 숫자가 시작되는 시작 포인트
    np.random.seed(seed)
    a = np.random.randint(5) # 무작위 시드에서 무작위 정수를 뽑음
    time.sleep(a)

 

  • 실습 예제
# 네이버 메인페이지
# url정의
url = 'https://naver.com'
# requsts로 url에 정보요청 (엔터 역할)
rep = requests.get(url)
# 정보를 html 변환 (보기 쉽게)
html = BeautifulSoup(rep.text , 'html.parser')
# html 내에서 우리가 보고 싶은 정보만 선별
html.select('img')
# 다음 뉴스 페이지 크롤링
# url정의
url ='https://news.daum.net/'
# requsts로 url에 정보요청
rep = requests.get(url)
# 정보를 html 변환 (보기 쉽게)
html = BeautifulSoup(rep.text , 'html.parser')
# html 내에서 뉴스헤더 선별
## html.select('a.link_txt')[0].text.strip()    
for news in html.select('a.link_txt')[:-13]:
    print(news.text.strip())
# url 설정
url = 'https://search.daum.net/search?w=tot&DA=YZR&t__nil_searchbox=btn&sug=&sugo=&sq=&o=&q=로또'
# requests로 데이터 요청하기
rep = requests.get(url)
# html로 변환
html = BeautifulSoup(rep.text, 'html.parser')
# 데이터 선별
for lotto_num in html.select('span.ball')[:-2]:
    print(lotto_num.text)# bg_ball1')

 

  • 회차별 크롤링 (로또)
lotto = []
# 1회차부터 10회차에 해당하는 로또넘버를 가져와 보겠습니다.
for i in range(1, 11):
    print(f'{i}회차 크롤링 중입니다.')
    
    seed = np.random.randint(100) # 무작위 정수 뽑아줌 -> 숫자가 시작되는 시작 포인트
    np.random.seed(seed)
    a = np.random.randint(5) # 무작위 시드에서 무작위 정수를 뽑음
    time.sleep(a)
    
    url = f'https://search.daum.net/search?w=tot&DA=LOT&rtmaxcoll=LOT&&q={i}회차%20로또'
    rep = requests.get(url)
    
    if rep.status_code == requests.codes.ok:
        html = BeautifulSoup(rep.text, 'html.parser')
        for lotto_num in html.select('span.ball')[:-2]:
            lotto.append(lotto_num.text)

    else:
        print(f'{i}회차 크롤링이 실패했습니다.')
        pass
    
print('크롤링 완료!')
# 데이터 선별
lotto= np.array(lotto).reshape(-1,6)
lotto

sns.countplot(lotto)

df = pd.DataFrame(lotto,
                 index=[f'{i}회'for i in range(1,11)])
df

 

'Python' 카테고리의 다른 글

빅분기 실기 Chapter2  (0) 2022.06.07
빅분기 실기 Chapter1  (0) 2022.06.07
Pandas 함수  (0) 2022.03.23
Visualization - Matplotlib  (0) 2022.03.23
Class  (0) 2022.03.21