2025, Oct 18 20:31
NYSCEF से संरक्षित PDF डाउनलोड: 403 से बचने के लिए SeleniumBase CDP तरीका
NYSCEF से संरक्षित PDF डाउनलोड करते समय 403 Forbidden और खाली व्यूअर की समस्या का समाधान. SeleniumBase के CDP मोड से सुरक्षित, भरोसेमंद डाउनलोड करें.
NYSCEF पोर्टल से किसी संरक्षित PDF को डाउनलोड करना देखने में आसान लगता है, लेकिन अक्सर 403 Forbidden या खाली व्यूअर पेज सामने आ जाता है। अगर आपने requests के जरिए ब्राउज़र हेडर की नकल की हो या Selenium से पेज स्क्रैप किया हो, और फिर भी न तो कोई <embed> टैग मिले और न UI में कुछ दिखे, तो आप वही रुकावटें देख रहे हैं। नीचे संक्षेप में समझाया गया है कि ऐसा क्यों होता है और SeleniumBase के साथ डाउनलोड को भरोसेमंद तरीके से कैसे काम में लाया जाए।
समस्या को पुनः उत्पन्न करना
आम तौर पर पहला विचार होता है कि दस्तावेज़ को HTTP से हासिल करें या ब्राउज़र ऑटोमेशन की ओर लौटें, <embed> से PDF का URL निकालें और फिर सत्र कुकीज़ के साथ बाइनरी को स्ट्रीम कर दें। नीचे एक न्यूनतम उदाहरण है, जो यही करता है, लेकिन इस साइट पर असफल हो जाता है:
from seleniumbase import SB
import requests
import os
import time
def pull_pdf_via_browser_then_http():
    doc_link = "https://iapps.courts.state.ny.us/nyscef/ViewDocument?docIndex=cdHe_PLUS_DaUdFKcTLzBtSo6zw=="
    out_dir = os.path.join(os.getcwd(), "downloads")
    os.makedirs(out_dir, exist_ok=True)
    out_path = os.path.join(out_dir, "NYSCEF_Document.pdf")
    with SB(headless=True) as browser:
        browser.open(doc_link)
        time.sleep(5)
        try:
            node_embed = browser.find_element("embed")
            pdf_link = node_embed.get_attribute("src")
            print(f"PDF URL detected: {pdf_link}")
        except Exception as err:
            print(f"Embed tag not found: {err}")
            return
        cookies_from_driver = browser.driver.get_cookies()
        http_sess = requests.Session()
        for c in cookies_from_driver:
            http_sess.cookies.set(c["name"], c["value"])
        net_headers = {
            "User-Agent": "Mozilla/5.0",
            "Referer": doc_link,
        }
        resp = http_sess.get(pdf_link, headers=net_headers)
        if resp.status_code == 200 and "application/pdf" in resp.headers.get("Content-Type", ""):
            with open(out_path, "wb") as fh:
                fh.write(resp.content)
            print(f"Saved to: {out_path}")
        else:
            print(f"Download failed. Status: {resp.status_code}")
            print(f"Content-Type: {resp.headers.get('Content-Type')}")
            print(f"Resolved URL: {resp.url}")
if __name__ == "__main__":
    pull_pdf_via_browser_then_http()
आम नतीजा यह रहता है कि HTTP अनुरोध पर 403 मिलता है, या पेज रेंडर होने पर कोई <embed> नोड मिलता ही नहीं। ब्राउज़र-जैसे User-Agent और Referer के साथ किया गया सीधा requests.get भी लगातार 403 लौटाता है।
यहां यह क्यों विफल होता है
इस एंडपॉइंट पर केवल हेडर दोहराना पर्याप्त नहीं है। सर्वर TLS फिंगरप्रिंटिंग और JavaScript के जरिए रनटाइम जांच जैसी तकनीकों से असली ब्राउज़र और स्क्रिप्ट में फर्क कर लेता है। इसी कारण सतह पर एक जैसे दिखने वाले स्थिर HTTP अनुरोध भी ब्लॉक हो जाते हैं, और ब्राउज़र सत्र में <embed> या सीधा PDF URL दिखाए बिना खाली पेज आ सकता है। मूल बात यह है कि फाइल खुली पहुंच में नहीं है; एक्सेस नियंत्रित है और गैर-मानवीय क्लाइंट छांट दिए जाते हैं। अगर आपको लगता है कि आपको पहुंच होनी चाहिए, लेकिन फिर भी ब्लॉक हैं, तो साइट के मालिकों से संपर्क करना होगा।
कारगर तरीका
इस स्थिति में SeleniumBase को एक विशेष मोड में इस्तेमाल करना फर्क लाता है। CDP Mode में ऐसे पैरामीटर के साथ चलाने से, जो स्वचालित PDF डाउनलोडिंग सक्षम करते हैं, सत्र बॉट-डिटेक्शन से बच निकलता है और फाइल को सीधे डिफ़ॉल्ट डाउनलोड लोकेशन पर सहेज देता है। इस तरह <embed> स्क्रैप करने या requests के जरिए दोबारा डाउनलोड करने की जरूरत नहीं पड़ती।
from seleniumbase import SB
with SB(uc=True, test=True, external_pdf=True) as driver:
    resource_url = "https://iapps.courts.state.ny.us/nyscef/ViewDocument?docIndex=cdHe_PLUS_DaUdFKcTLzBtSo6zw=="
    driver.activate_cdp_mode(resource_url)
    driver.sleep(10)
यह दस्तावेज़ को ./downloaded_files/ निर्देशिका में सहेज देता है। व्यवहार में, CDP Mode सक्षम करना ही उन सुरक्षा व्यवस्थाओं को पार करने में मदद करता है जो गैर-मानवीय क्लाइंट्स को संसाधन लेने से रोकती हैं, और सत्र को PDF को इनलाइन दिखाने की बजाय डाउनलोड के रूप में संभालने से खाली व्यूअर की समस्या से बचाव होता है।
यह क्यों मायने रखता है
आधुनिक सार्वजनिक एंडपॉइंट्स अक्सर सामग्री को बॉट-डिटेक्शन के पीछे रखते हैं। केवल हेडर की नकल करना काफी नहीं, और कई बार हेडलेस ब्राउज़र भी अपेक्षित DOM नोड्स नहीं दिखाता। यह जानना कि कब कच्चे HTTP से हटकर ऐसे वास्तविक ब्राउज़र ऑटोमेशन स्टैक पर जाना है जो फिंगरप्रिंटिंग जांचें पास कर सके, बेकार की डिबगिंग में लगने वाले घंटे बचा सकता है। साथ ही, उन स्थितियों को पहचानना भी जरूरी है जहाँ संसाधन जानबूझकर सुरक्षित रखा गया है और उन जांचों को पूरा किए बिना प्राप्त नहीं किया जा सकता।
मुख्य निष्कर्ष
जब सीधा अनुरोध 403 लौटाए और पेज पर निकालने के लिए कोई <embed> न हो, तो मान लें कि बात सेलेक्टर की चूक की नहीं, बल्कि एंटी-बॉट नियंत्रण की है। ऐसा ब्राउज़र ऑटोमेशन टूल अपनाएं जो बॉट-डिटेक्शन से बचने के लिए डिजाइन किए गए मोड में काम कर सके, और उसे PDF को इनलाइन रेंडर करने के बजाय डाउनलोड कराने के लिए कॉन्फ़िगर करें। अगर आपके पास फाइल तक वैध अधिकार है लेकिन फिर भी उसे नहीं पा रहे, तो उचित एक्सेस के लिए साइट मेंटेनर्स से समन्वय करें।
यह लेख StackOverflow पर प्रश्न (लेखक: Daremitsu) और Michael Mintz के उत्तर पर आधारित है।