개요
pywebcopy
라이브러리를 사용해서 웹 사이트를 로컬 PC에 저장(스크래핑)하는 방법을 정리한다.
설치
pip install pywebcopy
lxml.html.clean 모듈 에러
설치후에 사용하려고 하면 다음과 같은 에러가 발생할 수도 있다.
ImportError: lxml.html.clean module is now a separate project lxml_html_clean.
다음 커맨드로 lxml-html-clean
라이브러리를 수동으로 설치해주면 해결된다.
pip install lxml-html-clean
사용방법
사용방법은 아주 간단하다.
- 다음 코드를 참고한다.
- TARGET_SITE_URL, LOCAL_SAVE_PATH, PROJECT_NAME 값을 적절히 바꿔준다.
- 전체 웹 사이트를 저장하고 싶으면 save_website 함수를 사용한다.
- 하나의 웹 페이지만 저장하고 싶으면 save_webpage 함수를 사용한다.
※ 웹 사이트의 파일들은 {LOCAL_SAVE_PATH}/{PROJECT_NAME}/{DOMAIN} 에 저장된다.
※ {PROJECT_NAME}의 값이 “/” 이면 제대로 동작하지 않는다.
※ {PROJECT_NAME}의 값이 ““이면 URL의 값이 폴더명으로 들어간다. 예를들어 https://example.com을 스캔했다면 “https_example.com”과 같은 식으로 된다.
# -*- coding: utf_8 -*-
from pywebcopy import save_website, save_webpage
save_website(
url="{TARGET_SITE_URL}",
project_folder="{LOCAL_SAVE_PATH}",
project_name="{PROJECT_NAME}",
bypass_robots=True,
debug=True,
open_in_browser=False,
delay=None,
threaded=False,
)
주의점
회사 네트워크와 같이 프록시 서버가 전단에 있는 경우는 제대로 동작하지 않을 수 있다. 웹 사이트의 일부만 스크래핑되거나 한다. 프록시를 통하지 않는 환경에서 사용하는게 좋을 것 같다.
에러
pywebcopy.urls.LocationParseError 에러
- LocationParseError에러는 사이트 크롤링중에 발견한 URL에 접근하려고 하는데, URL이 파싱불가능한 형태(잘못된 형태)일 때 발생한다.
- 스크랩핑중 LocationParseError에러가 발생하면 작업전체가 멈추는 문제가 있다. 개선해줬으면 좋겠다. 이슈를 보고해볼까.
참고
- https://github.com/rajatomar788/pywebcopy
- https://github.com/rajatomar788/pywebcopy/issues/128