공공 데이터 포털을 크롤링 하는 중 발생한 에러들을 정리해보려고 한다.
참고로 https://www.data.go.kr/tcs/dss/selectDataSetList.do?dType=FILE¤tPage=1&perPage=100 에서 currentPage만 변경해가며 모든 데이터를 긁어오고자 했다. dType은 FILE, API, STD 세 가지 종류이며 각각 작성일 기준 618 페이지, 109 페이지, 2페이지이다. 각 페이지는 perPage=100이므로 100개의 데이터가 있다.
couldn't find lxml
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?
해당 에러는 parser library인 lxml이 없어서 발생한 에러다. 친절하게도 설치가 필요하냐고 묻기까지 해준다. 간단하게 lxml을 설치해주면 해결된다.
pip install lxml
data too long
pymysql.err.DataError: (1406, “Data too long for column ‘title’ at row 1)
해당 에러는 DB에 설정한 해당 컬럼의 data type property보다 넣으려는 데이터의 크기가 클 경우 발생한다. 그렇다면 해결 방법은 두 가지인데, DB에 설정한 값을 바꾸거나, 데이터를 줄이거나 하면 된다.
나의 경우 공공데이터 설명이 긴 경우가 있어서 간단하게 textwrap.shorten 모듈을 사용하여 100자 내로 줄여주었다.
winerror 10060
TimeoutError: [WinError 10060] 연결된 구성원으로부터 응답이 없어 연결하지 못했거나, 호스트로부터 응답이 없어 연결이 끊어졌습니다
해당 에러는 웹 크롤링 시 웹사이트가 해당 요청을 로봇인 줄 알고 차단한 경우이다. 이 때 바로 다시 실행해도 똑같은 에러가 나올 수 있으므로 조금 시간을 가진 뒤 실행해야한다. 또한 두 가지 방법을 추천하는데,
1. User-Agent 헤더 설정
- HTTP 요청을 보내는 디바이스와 브라우저 등 사용자 소프트웨어의 식별 정보를 담고 있는 request header의 한 종류인 User-Agent를 설정한다. 이는 요청하는 것이 로봇이 아님을 어필하는 것이다.
- 본인의 User-Agent는 whatismybrowser 페이지에서 확인 가능하다.
2. time.sleep 설정
- 너무 빠르게 웹 사이트에 계속 접속하게 되는 경우 접근이 막힐 수 있으므로 웹사이트에 접근 후 잠시 쉬어주는 역할을 한다.
incorrect string value
pymysql.err.DataError: (1366, "Incorrect string value: '\\xF3\\xB0\\x8F\\x9A \\xED...' for column 'description' at row 1")
해당 에러는 특수 문자를 포함하고 있어서 INSERT가 작동하지 못한 것이다. 이 때 원인은 두 가지다.
1. DB의 charter set 문제
- DB 의 Character set을 utf8 혹은 utf8mb4로 변경해준다. MySQL이나 mariaDB에서는 utf8이 3바이트로 작동하기 때문에 특수 문자인 4바이트를 입력받는 경우 에러가 발생할 수 있다.
- 나는 이미 4바이트로 사용가능한 utf8mb4로 설정되어있었다.
2. pymysql connect 설정 문제
- DB에 연결할 때 특수 문자까지 포함 가능한 charset을 지정해준다.
pymysql.connect(host=Config.DB_HOST,
port=3306,
user=Config.DB_USER,
password=Config.DB_PW,
db=Config.DATABASE,
charset="utf8mb4", # Here!
autocommit=True)
'Python' 카테고리의 다른 글
[python] multiprocessing VS multithreading (0) | 2023.08.28 |
---|---|
[python] asyncio - async, await 사용하기 (0) | 2023.08.24 |
[python] FastAPI vs Flask 비교 (0) | 2023.08.23 |
[python] Flask 기초 사용법 (0) | 2023.08.22 |
[python] pydantic 알아보기 (0) | 2023.08.21 |