py-py’s blog

何か書くよ

http通信のheaderについてのメモ

ここらへんわかってないのでへぼいわ。

Referer・・今のページへリクエストしている直前のページのアドレス

参考:

developer.mozilla.org

ファイルをダウンロードする際、ユーザーエージェントを付与するが、そのほかに付与したい場合、以下のようにする。

from urllib.request import urlopen
from urllib.request import Request

def main():

    url = "#"
    headers = {"User-Agent": ""}
    request = Request(url, headers=headers)

    # requestオブジェクトのヘッダーに情報を付与する
    # ここではRefererを付与。urlからうまく前のページのアドレスを取得する
    request.add_header("Referer", "")

    # もしcookieのデータがあれば以下のようにする
    # request.add_header("Cookie", "")
    
    # urlopenにて読み込む
    download_file = urlopen(request)

    # download_fileはgetheader("Content-Length")とすることでファイルサイズを得られる 
    file_size = download_file.getheader("Content-Length")
    file_name = download_file.geturl()

    # 拡張子
    file_extension = file_name[file_name.rfind("."):]

    # 保存
    with open(f"tmp_file_size_is_{file_size}{file_extension}", "wb") as f:
        f.write(download_file)

if __name__ == "__main__":
    main()

【追記】

cookieの値を与えたい場合、seleniumを利用する。

from urllib.request import urlopen
from urllib.request import Request
from selenium import webdriver


def main():
    driver = webdriver.PhantomJS()
    url = "#"
    driver.get(url)
    cookies = driver.get_cookies()
    cookie_data = {}
    for cookie in cookies:
        if cookie["name"] == "sample_cookie_name":
            cookie_data["sample_cookie_name"] = cookie["value"]

    headers = {"User-Agent": ""}
    request = Request(url, headers=headers)

    # requestオブジェクトのヘッダーに情報を付与する
    # ここではRefererを付与。urlからうまく前のページのアドレスを取得する
    request.add_header("Referer", "")

    # もしcookieのデータがあれば以下のようにする
    tmp_cookie_str = ""
    for k, v in cookie_data.items():
        tmp_cookie_str += k + "=" + v + ";"
    if tmp_cookie_str.endswith(";"):
        tmp_cookie_str = tmp_cookie_str[:tmp_cookie_str.rfind(";")]
    request.add_header("Cookie", tmp_cookie_str)
    
    # urlopenにて読み込む
    download_file = urlopen(request)

    # download_fileはgetheader("Content-Length")とすることでファイルサイズを得られる 
    file_size = download_file.getheader("Content-Length")
    file_name = download_file.geturl()

    # 拡張子
    file_extension = file_name[file_name.rfind("."):]

    # 保存
    with open(f"tmp_file_size_is_{file_size}{file_extension}", "wb") as f:
        f.write(download_file)

if __name__ == "__main__":
    main()

seleniumにもadd_cookie()という関数あるのでそちらも使える。