Home Python - Requests를 이용한 File download
Post
Cancel

Requests 설치

앞에서 동적 웹크롤링으로 Tick data를 다운로드 할 수 있는 Link를 얻었다.
이제 그 Link를 Requests를 이용해서 File을 다운로드 해보자.

Requests 라이브러리를 설치한다.

1
pip install requests

Requests를 이용한 File Download 함수 만들기

코인들의 Tick data link들을 list형태로 얻었으니,
이제 requests library를 사용하여 file을 다운로드 할 차례다!
우선 file을 저장할 path를 결정하고 해당 폴더를 만들고 file path를 얻는 함수를 만들고,
requests를 이용한 download 함수를 만들자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import os

def make_save_path(folder_path):
    """
    try make folder to save files.
    if folder exists, passed by exception.
    """
    try:
        os.mkdir(folder_path)  # 폴더를 만드는 것을 시도한다.
    except:
        pass  # 이미 해당 폴더가 있을 경우 예외처리하여 pass

def get_save_path(folder_path, file_name):
    return folder_path + file_name  # 저장할 폴더와 File명을 path로 return

def download(file_path, url):
    with open(file_path, 'wb') as file:  # write binary 모드로 열기
        response = requests.get(url)  # url 요청결과 얻기
        file.write(response.content)  # file에 쓰기

Requests File Download Test

함수가 완성되었으니 이제 Coin의 tick data file link list를 얻는 코드를 함께 사용하여,
link list의 첫번째 link만 다운로드 하여 테스트를 해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# Bitmex 에서 Data 받기

from selenium import webdriver
import requests
import os

def get_url_links(url, driver_path=None, ext=''):
    if driver_path:
        driver = webdriver.Chrome(driver_path)  # Webdriver의 경로를 지정하는 경우
    else:
        driver = webdriver.Chrome()  # 코드파일과 같은 폴더에 Webdriver가 있는 경우
    driver.implicitly_wait(10)
    # 지정된 시간인 10초 안에 페이지의 로딩이 끝나면 다음으로 넘어감.
    # 지정된 시간 안에 로딩이 완료되지 않으면 Error띄움.
    driver.get(url)
    element_id = driver.find_element_by_id('listing')
    pre_tag = element_id.find_element_by_tag_name('pre')
    a_tags = pre_tag.find_elements_by_tag_name('a')  # a tag list를 얻음.
    links = []
    for a_tag in a_tags:
        link = a_tag.get_attribute('href')  # href의 link 주소 얻음.
        if link.endswith(ext):  # 확장자가 gz 인 link만 links에 append.
            links.append(link)
    return links

def make_save_path(folder_path):
    """
    try make folder to save files.
    if folder exists, passed by exception.
    """
    try:
        os.mkdir(folder_path)
    except:
        pass

def get_save_path(folder_path, file_name):
    return folder_path + file_name

def download(file_path, url):
    with open(file_path, 'wb') as file:  # write binary 모드로 열기
        response = requests.get(url)  # url 요청결과 얻기
        file.write(response.content)  # file에 쓰기

if __name__ == '__main__':

    url = "https://public.bitmex.com/?prefix=data/trade/"
    ext = 'gz'
    driver_path = '.\\chromedriver.exe'
    save_path = '.\\db\\'

    url_links = get_url_links(url, driver_path, ext)
    make_save_path(save_path)
    file_name = url_links[0].split('/')[-1]  # /로 str을 split하여 file name만 따로 분리
    file_path = get_save_path(save_path, file_name)
    download(file_path, url_links[0])

requests1 requests2

첫 번째 tick data가 잘 저장된 것을 확인 할 수 있다.


Requests File Download

이제 코인들의 나머지 tick data 전부를 받아 보자.
그런데, 잘 보면 get_url_links함수 안에서 for a_tag in a_tags: line에서 for 문이 이미 돌아가니
함수 바깥에서 for문을 또 돌려서 다운로드 하는 낭비를 막기 위해
get_url_links함수의 for문에서 직접 다운로드 하는 코드로 수정을 해 보겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Bitmex 에서 Data 받기

from selenium import webdriver
import requests
import os

def download_files_on_url(url, save_path='', driver_path=None, ext=''):
    if driver_path:
        driver = webdriver.Chrome(driver_path)  # Webdriver의 경로를 지정하는 경우
    else:
        driver = webdriver.Chrome()  # 코드파일과 같은 폴더에 Webdriver가 있는 경우
    driver.implicitly_wait(10)
    # 지정된 시간인 10초 안에 페이지의 로딩이 끝나면 다음으로 넘어감.
    # 지정된 시간 안에 로딩이 완료되지 않으면 Error띄움.
    driver.get(url)
    element_id = driver.find_element_by_id('listing')
    pre_tag = element_id.find_element_by_tag_name('pre')
    a_tags = pre_tag.find_elements_by_tag_name('a')  # a tag list를 얻음.
    links = []
    for a_tag in a_tags:
        link = a_tag.get_attribute('href')  # href의 link 주소 얻음.
        if link.endswith(ext):  # 확장자가 gz 인 link만 links에 append.
            file_name = link.split('/')[-1]
            file_path = get_save_path(save_path, file_name)
            download(file_path, link)

def make_save_path(folder_path):
    """
    try make folder to save files.
    if folder exists, passed by exception.
    """
    try:
        os.mkdir(folder_path)
    except:
        pass

def get_save_path(folder_path, file_name):
    return folder_path + file_name

def download(file_path, url):
    with open(file_path, 'wb') as file:  # write binary 모드로 열기
        response = requests.get(url)  # url 요청결과 얻기
        file.write(response.content)  # file에 쓰기

if __name__ == '__main__':

    url = "https://public.bitmex.com/?prefix=data/trade/"
    ext = 'gz'
    driver_path = '.\\chromedriver.exe'
    save_path = '.\\db\\'

    make_save_path(save_path)
    download_files_on_url(url, save_path, driver_path, ext)
    # 역할에 맞게 함수명 수정.

requests3

4시간 넘게 기다리니 40 기가에 달하는 2,823개의 tick data가 다운 받아졌다…
이거 아무래도 다음에 또 이런걸 받을일이 생기면 동시성 코드를 짜서 한꺼번에 여러개를 다운로드 받을 수 있게 해야겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from selenium import webdriver

def get_url_links(url, driver_path=None, ext=''):
    if driver_path:
        driver = webdriver.Chrome(driver_path)  # Webdriver의 경로를 지정하는 경우
    else:
        driver = webdriver.Chrome()  # 코드파일과 같은 폴더에 Webdriver가 있는 경우
    driver.implicitly_wait(10)
    # 지정된 시간인 10초 안에 페이지의 로딩이 끝나면 다음으로 넘어감.
    # 지정된 시간 안에 로딩이 완료되지 않으면 Error띄움.
    driver.get(url)
    element_id = driver.find_element_by_id('listing')
    pre_tag = element_id.find_element_by_tag_name('pre')
    a_tags = pre_tag.find_elements_by_tag_name('a')  # a tag list를 얻음.
    links = []
    for a_tag in a_tags:
        link = a_tag.get_attribute('href')  # href의 link 주소 얻음.
        if link.endswith(ext):  # 확장자가 gz 인 link만 links에 append.
            links.append(link)
    return links

if __name__ == '__main__':
    url = "https://public.bitmex.com/?prefix=data/trade/"
    ext = 'gz'
    driver_path = '.\\chromedriver.exe'

    url_links = get_url_links(url, driver_path, ext)
    print(len(url_links))
1
2823

a tag의 file link list의 length를 확인해 보면 위의 결과처럼 2,823개로 데이터가 빠짐없이 다운로드 된 것을 알 수 있다. 👌

This post is licensed under CC BY 4.0 by the author.

내 IP주소 확인! (바로 확인가능)

ipTIME 포트포워딩