DID project error log - python
requests와 urllib
서버와 http 통신하기 위한 모듈
urllib
- 빠르다.
- header나 timeout 설정하는데 비교적 복잡하다
- 데이터가 encoding 된채로 그대로와 decode()메소드로 변환해 주어야한다.
- json화 하려면 json 모듈을 사용해야한다.
requests
- import 속도가 urllib보다 느리다.
- header 설정이나 timeout 설정등 여러 부가적 기능을 쉽게 설정할 수 있다.
- 자동으로 header에서 encoding 값을 읽어와 데이터를 변환해준다.
- json() 메소드로 받아온 data를 json 화 하기 쉽다.
progressbar
네트워크가 불안정해 파일 다운받는 과정을 볼 필요가 있었다. progressbar 모듈을 통해 쉽게 구현할 수 있다.
# progressbar 생성
pbar = progressbar.ProgressBar(maxval=total_length).start()
with open(download_path + file, 'ab') as output:
block_num = resume_byte_pos / 1024
for chunk in response.iter_content(chunk_size=1024):
if chunk:
block_num = block_num + 1
output.write(chunk)
if (block_num * 1024) < total_length:
pbar.update(block_num * 1024)
pbar.finish()
파일 이어받기
네트워크가 불안정한 환경이라 큰 파일을 다운받을 때 끊기고 다시 처음부터 받는 현상이 생긴다.
http 요청 시 header에 Range 속성에서 얼마부터 데이터를 요청할 수 있다.
중간에 끊어진 파일의 크기를 구해 그때부터 받으면 이어받을 수 있다.
# 전에 받았던 파일의 크기
resume_byte_pos = os.stat(download_path + file).st_size
# header 설정
resume_header = {'Range': 'bytes=%d-' % resume_byte_pos}
response = requests.get(url,
headers=resume_header,
stream=True,
timeout=10)