【问题标题】:Skip page that not found when downloading pdf from multiple page从多个页面下载 pdf 时跳过未找到的页面
【发布时间】:2025-12-22 07:00:07
【问题描述】:

我尝试从多个 URL 下载 pdf 文件。使用此代码:

import requests

for i in range(1, 40000):
    r = requests.get('http://www.setpp.kemenkeu.go.id/risalah/ambilFileDariDisk/'+str(i), allow_redirects=True, timeout=10)

    open('file-risalah'+str(i)+'.pdf', 'wb').write(r.content)

但显然,在那 40000 页中找不到很多页面,所以我得到了很多损坏的 pdf。如何跳过从找不到的页面下载? 我试过用这个:

import requests
import urllib

try:
    for i in range(2847, 40000):
        r = requests.get('http://www.setpp.kemenkeu.go.id/risalah/ambilFileDariDisk/'+str(i), allow_redirects=True, timeout=10)

        open('file-risalah'+str(i)+'.pdf', 'wb').write(r.content)
except urllib.error.HTTPError:
       print ("pdf not found")

但看起来,它仍然从找不到的页面下载

【问题讨论】:

    标签: python url web-scraping request


    【解决方案1】:

    在继续下载 PDF 之前,您需要检查从请求中收到的响应。如果响应的 status_code 为 200,那么您可以下载内容。

    import requests
    
    for i in range(1, 40000):
        r = requests.get('http://www.setpp.kemenkeu.go.id/risalah/ambilFileDariDisk/'+str(i), allow_redirects=True, timeout=10)
    
        if r.status_code == 200:
            open('file-risalah'+str(i)+'.pdf', 'wb').write(r.content)
    

    status_code 200 表示正常。你可以读到很多here.

    【讨论】:

      【解决方案2】:

      您应该查看服务器响应。 requests 模块为此提供了status_code

      import requests
      for i in range(1, 40000):
          url = 'http://www.setpp.kemenkeu.go.id/risalah/ambilFileDariDisk/' + str(i)
          r = requests.get(url, allow_redirects=True, timeout=10)
          if r.status_code == 200:
              print(i, url)
              open('file-risalah'+str(i)+'.pdf', 'wb').write(r.content)
      

      【讨论】:

        【解决方案3】:

        requests 为您提供“ok”属性,告诉您页面没有错误,因此在打开文件之前检查如下:

        import requests
        
        for i in range(1, 40000):
            r = requests.get('http://www.setpp.kemenkeu.go.id/risalah/ambilFileDariDisk/'+str(i), allow_redirects=True, timeout=10)
            if r.ok:
                open('file-risalah'+str(i)+'.pdf', 'wb').write(r.content)
        

        【讨论】: