비동기로 여러 사이트 접속하여 HTML 가져와서 파일 저장하기
글. 수알치 오상문
비동기 방식으로 여러 웹 사이트에 접속하여 HTML 코드를 가져와서 각각 html 파일에 저장하는 예제이다.
현재 경로의 하위 snapshots 디렉터리에 html 파일을 저장하며 형식은 다음과 같다.
사이트이름_연월일_시분초.html
(예; naver_20200730_140105.html)
from datetime import datetime
import asyncio
import pathlib
from aiohttp import ClientSession # pip install aiohttp
urls = {'daum': "https://www.daum.net",
'naver': "https://www.naver.com",
'google': "https://www.google.co.kr", }
async def fetch(url, session, name=""):
async with session.get(url) as response:
# 참고: response.read()는 byte 문자열 반환하며, 구글 디코딩 시 utf-8 에러 발생
html_body = await response.text()
return (name, html_body)
async def main():
async with ClientSession() as session:
tasks = []
for site in urls:
tasks.append(asyncio.create_task(fetch(urls[site], session, site)))
sites_content = await asyncio.gather(*tasks)
return sites_content # 윗줄 await 생략하고 return await로 작성해도 됨
# TEST ----------------
sites_data = asyncio.run(main())
output_dir = pathlib.Path().resolve() / "snapshots"
output_dir.mkdir(parents=True, exist_ok=True)
now = datetime.now()
now_str = now.strftime("%Y%m%d_%H%M%S")
for site, html in sites_data:
filename = site + '_' + now_str + '.html'
output_file = output_dir / filename
print(site, html[:300])
output_file.write_text(html, encoding='utf-8')
# [참고] response.read()로 가져온 경우에는 아래처럼 처리한다.
# Naver, Daum은 정상 처리되지만, 구글 같은 경우에는 디코딩 에러가 발생할 수 있다.
# output_file.write_text(html.decode(), encoding='utf-8') #
[실행 결과] html 파일로 저장된 모습
'웹 크롤링, 스크래핑' 카테고리의 다른 글
파이썬, 셀레니움 크롤링 예제들 (0) | 2022.07.30 |
---|---|
파이썬, 크롤링 스레드 예제 (BeautifulSoup, ThreadPoolExecutor) (0) | 2022.07.30 |
웹 사이트 HTML 코드를 다운로드하여 html 파일로 저장하기 (1) | 2022.07.30 |
셀레니움, Firefox 웹드라이버 다운로드 사이트 (0) | 2022.07.28 |
파이썬, 셀레니움 특정 요소 기다리기 & 자바스크립트로 로그인하기 (0) | 2022.07.27 |