728x90
4주차 미션: 섹션 6 ~ 7
섹션 7에서는 AsyncIO 멀티 스크랩핑 실습을 했다.
🌱 01
# Asyncio 웹 스크랩핑 실습
# aiohttp 권장
import asyncio
import timeit
from urllib.request import urlopen
from concurrent.futures import ThreadPoolExecutor
import threading
# 실행 시작 시간
start = timeit.default_timer()
# 서비스 방향이 비슷한 사이트로 실습 권장(예 : 게시판성 커뮤니티)
urls = ['http://daum.net', 'https://naver.com', 'http://mlbpark.donga.com/', 'https://tistory.com', 'https://wemakeprice.com/']
async def fetch(url, executor):
# 쓰레드명 출력
print('Thread Name :', threading.current_thread().getName(), 'Start', url)
# 실행
res = await loop.run_in_executor(executor, urlopen, url)
print('Thread Name :', threading.current_thread().getName(), 'Done', url)
# 결과 반환
return res.read()[0:5]
async def main():
# 쓰레드 풀 생성
executor = ThreadPoolExecutor(max_workers=10)
# future 객체 모아서 gather에서 실행
futures = [
asyncio.ensure_future(fetch(url, executor)) for url in urls
]
# 결과 취합
rst = await asyncio.gather(*futures)
print()
print('Result : ', rst)
🌱 02
# Asyncio 웹 스크랩핑 실습
# Beautiful Soup 추가
# 스케쥴러 사용시 주기적으로 데이터 수집 가능
# 수집 정보 DB 저장 -> 파이썬 기초 강의 참고
import asyncio
import timeit
from urllib.request import urlopen
from concurrent.futures import ThreadPoolExecutor
import threading
from bs4 import BeautifulSoup
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')
# 실행 시작 시간
start = timeit.default_timer()
# 서비스 방향이 비슷한 사이트로 실습 권장(예 : 게시판성 커뮤니티)
urls = ['http://daum.net', 'https://naver.com', 'http://mlbpark.donga.com/', 'https://tistory.com', 'https://www.inflearn.com/']
async def fetch(url, executor):
# 쓰레드명 출력
print('Thread Name :', threading.current_thread().getName(), 'Start', url)
# 실행
res = await loop.run_in_executor(executor, urlopen, url)
soup = BeautifulSoup(res.read(), 'html.parser')
# 전체 페이지 소스 확인
# print(soup.prettify())
# 이 부분에서 BeautifulSoup Selector(선택자)를 활용해서 다양한 정보 가져오기 가능
# 현 예제에서는 페이지 타이틀 정보 수집
result_data = soup.title
print('Thread Name :', threading.current_thread().getName(), 'Done', url)
# 결과 반환
return result_data
async def main():
# 쓰레드 풀 생성
executor = ThreadPoolExecutor(max_workers=10)
# future 객체 모아서 gather에서 실행
futures = [
asyncio.ensure_future(fetch(url, executor)) for url in urls
]
# 결과 취합
rst = await asyncio.gather(*futures)
print()
print('Result : ', rst)
총 정리
# Chapter07
# Asyncio
# 비동기 I/O Coroutine 작업
# Generator -> 반복적인 객체 Return 사용
# non-blocking 비동기 처리
강의 링크:
728x90
'활동들 > 인프런 대학생 LEAF 2기' 카테고리의 다른 글
[인프런 리프 2기] 리프 활동 후기 🌱 (0) | 2021.04.09 |
---|---|
[인프런 리프 2기] 6. 파이썬 병행성 (0) | 2021.04.02 |
[인프런 리프 2기] 5. 파이썬 일급함수 (0) | 2021.03.29 |
[인프런 리프 2기] 4. 파이썬 데이터 모델 (0) | 2021.03.29 |
[인프런 리프 2기] 3. 파이썬 데이터 모델 (0) | 2021.03.22 |