URLコードのピット

3974 ワード

Urlの符号化にはASCII文字しか使用できません.ASCII以外の文字、例えば中国語は使用できません.そうしないと、クライアントまたはサーバ側がサポートする符号化が異なるために問題が発生する可能性があります.
URLが中国語で符号化される方法は、中国語のUTF-8で符号化された文字セット、例えば0xE4 0xB8 0xAD 0xE6 0x96 0x87を得て、0x%に置き換えるとよい.
あるウェブサイトについて、彼らの中国語に対するURL符号化はウェブページの符号化に従っている.例えば、彼らのウェブページの符号化はGBKまたはGB 2312であり、通常のUTF-8符号化ではない.例えば、このウェブサイトhttps://www.52z.com/の検索では、このときchardetライブラリで応答体の符号化を判断し、要求するパラメータを符号化するときに対応する符号化を用いるだけでよい
import requests
import chardet

class RqCompoent():
    @staticmethod
    def get(url, *args, **kwargs):
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"}
        #  
        headers = {**headers, **kwargs}
        response = requests.get(url, headers=headers)

        if response.status_code == 200:
            response = response.content 
            charset = chardet.detect(response).get('encoding')
            response = response.decode(charset, "ignore")
            return response, charset #  
        else:
            print(" ")
            return None

URLを符号化する場合は、urllib.parse.quoteを使って文字列をURL符号化することができますが、本質的には最下位のstr.decode()を呼び出しているので、' '.decode(' ')をそのまま使ってもいいです
ちょっとメモしておきますが、URLコードの知識がないと、こんなサイトに遭遇してどうしたらいいか分からないかもしれません.