반응형

비동기로 여러 사이트 접속하여 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 파일로 저장된 모습 

 

반응형

+ Recent posts