Я просмотрел множество сообщений здесь и в Интернете и остановился на сочетании запросов и библиотек PyPDF2. Хотя PyPDF2 эффективно извлекает текст после того, как PDF-файл находится в памяти, процесс получения данных PDF-файла с помощью запросов происходит довольно медленно. Ниже приведен мой код и время, необходимое для получения PDF-файла (до извлечения текста).
Это мой исходный код:
import urllib.request
from urllib.parse import urlparse
import time
url = "https://www.ohchr.org/sites/default/fil ... ns/eng.pdf"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
"Accept": "application/pdf", # Indicating we want a PDF file
}
# Extract the base domain from the URL to set as the Referer header
parsed_url = urlparse(url)
referer = f"{parsed_url.scheme}://{parsed_url.netloc}" # Extract base domain (e.g., "https://example.com")
# Update the headers with dynamic Referer
headers["Referer"] = referer
start_time=time.time()
# Step 1: Fetch PDF content directly from the URL with headers
req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req) as response:
pdf_data = response.read()
print(time.time() - start_time)
print(time.time() - start_time)
65.53884482383728
Получение данных со страницы заняло больше минуты, хотя открытие этого URL в моем браузере происходит с молниеносной скоростью.
И другая версия с использованием адаптеров urllib3 и повторной попытки логика:
import requests
import time
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
url = "https://www.ohchr.org/sites/default/fil ... ns/eng.pdf"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
"Accept": "application/pdf",
"Cache-Control": "no-cache",
"Pragma": "no-cache",
}
start_time = time.time()
# Configure retries for requests
session = requests.Session()
retries = Retry(total=3, backoff_factor=0.3, status_forcelist=[500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retries)
session.mount("https://", adapter)
response = session.get(url, headers=headers, timeout=5)
if response.status_code == 200:
pdf_data = response.content
print(f"Time taken: {time.time() - start_time:.2f} seconds")
else:
print(f"Failed to fetch the PDF. Status code: {response.status_code}")
Затраченное время: 105,47 секунды
Оба метода подходят для загрузки PDF-файла, но процесс все еще слишком медленный для производства. Например, используя URL-адрес Организации Объединенных Наций, мой браузер загружает PDF-файл за 1–2 секунды, тогда как сценарий занимает гораздо больше времени. Мое подключение к Интернету быстрое и стабильное.
Какие альтернативные подходы, библиотеки или стратегии программирования я могу использовать, чтобы ускорить этот процесс (сделав его таким же быстрым, как браузер)? Я читал о настройке пользовательских агентов и заголовков, но мне это не помогло.
Обновить
Я просто запускаю код на Colab, и это так быстро:

< /p>
Что может быть ошибся или отсутствует в моей конфигурации? Я использую Windows 10 и имею отличное подключение к Интернету.
Вывод, сгенерированный ответом кода Чайтаньи Рахалкара:
>>> import requests
>>> from urllib3.util.retry import Retry
>>> from requests.adapters import HTTPAdapter
>>> import io
>>> import time
>>> def download_pdf(url):
... # Configure session with optimized settings
... session = requests.Session()
... retries = Retry(total=3, backoff_factor=0.1, status_forcelist=[500, 502, 503, 504])
... adapter = HTTPAdapter(max_retries=retries, pool_connections=10, pool_maxsize=10)
... session.mount('https://', adapter)
... headers = {
... 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
... 'Accept': 'application/pdf',
... }
... # Use streaming to download in chunks
... response = session.get(url, headers=headers, stream=True, timeout=10)
... response.raise_for_status()
... # Stream content into memory
... pdf_buffer = io.BytesIO()
... for chunk in response.iter_content(chunk_size=8192):
... if chunk:
... pdf_buffer.write(chunk)
... return pdf_buffer.getvalue()
...
>>> url = "https://www.ohchr.org/sites/default/fil ... ns/eng.pdf"
>>> start_time = time.time()
>>> pdf_data = download_pdf(url)
>>> print(f"Download completed in {time.time() - start_time:.2f} seconds")
Download completed in 68.41 seconds
>>> print(f"PDF size: {len(pdf_data) / 1024:.1f} KB")
PDF size: 190.6 KB
>>>
Подробнее здесь: https://stackoverflow.com/questions/792 ... om-website
Мобильная версия