我正在尝试创建一个单一的轻量级 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,而脚本则需要更长的时间。我的互联网连接快速且稳定。
问题: 我可以使用哪些替代方法、库或编程策略来加速此过程(使其与浏览器一样快)?如果您以前处理过这个问题,请分享您的解决方案。我读过有关调整用户代理和标头的内容,但这些似乎对我没有帮助。
您正在使用各种库的混杂。选择一个。使用
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