Python urllib: ปิดพร็อกซีสำหรับ opener ตัวเดียว
สร้าง urllib opener ที่เชื่อมต่อโดยตรงด้วย ProxyHandler({}) โดยไม่เปลี่ยนไคลเอนต์อื่นหรือสภาพแวดล้อมของกระบวนการ
ส่งแมปว่างให้ ProxyHandler เมื่อ urllib opener ตัวหนึ่งควรเชื่อมต่อโดยตรง:
from urllib.request import ProxyHandler, build_opener
direct = build_opener(ProxyHandler({}))
with direct.open("https://example.com/", timeout=10) as response:
print(response.status)
ดิกชันนารีว่างไม่ระบุเส้นทางพร็อกซีใดเลย แต่หากไม่ส่งแมป ตัวจัดการจะค้นหาพร็อกซีจากสภาพแวดล้อมและการตั้งค่าแพลตฟอร์มแทน การสร้างสองแบบนี้แสดงนโยบายที่ต่างกัน
ตัวอย่างใช้ไลบรารีมาตรฐานของ Python และคงการตรวจสอบ HTTPS ตามปกติ บล็อก with ปิดการตอบกลับ รวมถึงเมื่อออกจากบล็อกเพราะข้อยกเว้น
คำขอโดยตรงและผ่านพร็อกซีในแอปเดียวกัน
opener สองตัวรองรับนโยบายสองแบบได้โดยไม่ต้องเปลี่ยนตัวแปรสภาพแวดล้อมระหว่างการเรียก:
from urllib.request import ProxyHandler, build_opener
direct = build_opener(ProxyHandler({}))
proxied = build_opener(ProxyHandler({
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:8080",
}))
with proxied.open("https://example.com/", timeout=10) as response:
print(response.status)
แทนที่ที่อยู่ loopback ด้วยพร็อกซี HTTP ของคุณ หรือเลือกจากรายการพร็อกซี HTTPเพื่อเปรียบเทียบการเชื่อมต่อผ่านพร็อกซี โดยสามารถส่งต่อการเชื่อมต่อไปยังเป้าหมาย HTTPS ผ่าน CONNECT ได้เมื่อบริการอนุญาต โปรโตคอลและการรองรับการยืนยันตัวตนของตัวรับฟังต้องตรงกับตัวจัดการ
คง opener เริ่มต้นไว้
เรียก direct.open หรือ proxied.open ผ่านออบเจ็กต์ที่รับผิดชอบเส้นทาง install_opener เปลี่ยนค่าเริ่มต้นของทั้งกระบวนการที่ฟังก์ชันอำนวยความสะดวกของ urllib ใช้ ดังนั้นไลบรารีที่ใช้มันอาจกระทบโค้ดส่วนอื่นที่ไม่เกี่ยวข้อง ไม่จำเป็นต้องใช้กับ opener ที่แยกไว้ข้างต้น
อาร์กิวเมนต์ timeout เป็นการตั้งค่าของการดำเนินการ ไม่ใช่เส้นตายตามเวลาจริงที่ครอบคลุมการถ่ายโอนแต่ละครั้งทั้งหมด อ่านเฉพาะข้อมูลที่งานต้องการ และใช้เส้นตายในระดับสูงขึ้นหากงานมีงบเวลารวมที่เข้มงวด
ออบเจ็กต์ opener เหล่านี้ไม่เปลี่ยนไคลเอนต์ของไลบรารีอื่น กระบวนการที่มีอยู่ หรือการตั้งค่าพร็อกซีของเบราว์เซอร์