我想使用本文的链接安装 telegra.ph 中的文章,并将它们合并到一个 pdf 文件中。但是,当我尝试这样做时,出现以下错误: "requests.exceptions.ConnectionError: ('连接中止。', TimeoutError(10060, '尝试建立连接失败,因为在要求的时间内未从另一台计算机收到所需的响应,或者已建立的连接已断开由于已连接的计算机的错误响应',无,10060,无))”
这是我的草图,它从 Telegra.ph 链接获取内容,并使用 requests、BeautifulSoup 和 reportlab 等库将它们组合成一个 PDF 文件:
import requests
from bs4 import BeautifulSoup
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
def fetch_telegraph_content(url):
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.find('title').text
paragraphs = soup.find_all('p')
content = '\n'.join([p.text for p in paragraphs])
return title, content
else:
return None, None
def create_pdf(filename, articles):
c = canvas.Canvas(filename, pagesize=letter)
width, height = letter
for title, content in articles:
c.setFont("Helvetica-Bold", 14)
c.drawString(72, height - 72, title)
c.setFont("Helvetica", 12)
# Handle multi-line text
text = c.beginText(72, height - 100)
text.setFont("Helvetica", 12)
text.setTextOrigin(72, height - 100)
for line in content.split('\n'):
text.textLine(line)
c.drawText(text)
c.showPage()
c.save()
def main():
urls = [
"https://telegra.ph/1234",
"https://telegra.ph/123"
]
articles = []
for url in urls:
title, content = fetch_telegraph_content(url)
if title and content:
articles.append((title, content))
else:
print(f"Failed to fetch content from {url}")
if articles:
create_pdf("Telegraph_Articles.pdf", articles)
print("PDF created successfully: Telegraph_Articles.pdf")
else:
print("No articles were fetched. PDF not created.")
if __name__ == "__main__":
main()
您的回复很可能带有
status_code != 200
表明您超出了最大请求数,因为您试图尽快获取所有文章,许多网站都实施了此类限制,这是这样做是为了让您和其他尝试做同样事情的人不要过度使用该网站而影响其他读者的用户体验。
您可以考虑打印错误代码和消息,而不是仅仅返回
(None, None)
,以便您可以看到错误。在这种情况下,响应代码可能是 429,消息是 Please refrain from sending too many requests
或类似内容。
“解决”此问题的方法是研究找出服务器认为合理的速率(我已经看到提到每 2 秒 3 个请求,但特定服务器可能有其他速率限制,或者可能会根据具体情况改变限制)根据当前流量)。
理想情况下,成为一个行为良好的“用户”,您应该检查任何 429响应的标头以获得
retry_after
值,然后在重试之前睡眠 至少那么多秒。
请注意,某些服务器会,在收到过多请求且忽略
retry_after
值的情况下, 将您的 IP 地址屏蔽一段时间,最长可达 24 小时或永久。