Python 请求从网站获取 PDF 所需的时间太长

问题描述 投票:0回答:1

我正在尝试创建一个单一的轻量级 Python 脚本来打开托管有保证的 PDF 文件的网站,下载该文件并提取其文本。

我在这里和互联网上审查了许多帖子,并确定了请求和 PyPDF2 库的组合。虽然一旦 PDF 进入内存,PyPDF2 就能有效地提取文本,但使用请求检索 PDF 数据的过程却相当缓慢。下面是我的代码以及获取 PDF 文件所需的时间(在文本提取之前)。

这是我原来的代码:

import urllib.request
from urllib.parse import urlparse
import time


url = "https://www.ohchr.org/sites/default/files/UDHR/Documents/UDHR_Translations/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() - 开始时间) 65.53884482383728

从页面获取数据花了一分多钟,在我的浏览器上打开这个网址快如闪电。

另一个使用 urllib3 适配器和重试逻辑的版本:

import requests
import time
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

url = "https://www.ohchr.org/sites/default/files/UDHR/Documents/UDHR_Translations/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,我的浏览器在 1-2 秒内加载 PDF,而脚本则需要更长的时间。我的互联网连接快速且稳定。

问题: 我可以使用哪些替代方法、库或编程策略来加速此过程(使其与浏览器一样快)?如果您以前处理过这个问题,请分享您的解决方案。我读过有关调整用户代理和标头的内容,但这些似乎对我没有帮助。

python pdf python-requests request
1个回答
0
投票

您正在使用各种库的混杂。选择一个。使用

requests
的工作示例,没有会话/标题,速度相当快。这些并不总是必要的,尽管我怀疑这就是你的方法如此缓慢的原因

import requests
from time import time

start=time()
url ="https://www.ohchr.org/sites/default/files/UDHR/Documents/UDHR_Translations/eng.pdf"

res = requests.get(url)
if res.status_code != 200:
    print(res.status_code, res.reason)

with open('data.pdf', 'wb') as f:
    f.write(res.content)
print(time()-start) # 1.2148323059082031
© www.soinside.com 2019 - 2024. All rights reserved.