【问题标题】:My code hangs when the server returns request error当服务器返回请求错误时我的代码挂起
【发布时间】:2021-10-19 14:29:40
【问题描述】:

我的代码正在完美下载文件,但是当服务器返回 404 错误时它会停止。如何更改此代码以仅将没有 404 错误的 URL 添加到列表中?

import requests
import httplib2
import os
from bs4 import BeautifulSoup, SoupStrainer
artigos = []
pdfs = []
http = httplib2.Http()
status, response = http.request('https://www.snh2021.anpuh.org/site/anais')
for link in BeautifulSoup(response, parse_only=SoupStrainer('a')):
    if link.has_attr('href'):
        artigos.append(link['href'])
for x in artigos:
    if x.endswith('pdf'):
        pdfs.append(x)
        print(pdfs)

def baixa_arquivo(url, endereco):
    resposta = requests.get(url)
    if resposta.status_code == requests.codes.OK:
        with open(endereco, 'wb') as novo_arquivo:
            novo_arquivo.write(resposta.content)
            print('Download concluído. Salvo em {}'.format(endereco))
    else:
        resposta.raise_for_status()
if __name__ == '__main__':
        url_basica = 'https://www.snh2021.anpuh.org/{}'
        output = 'Download'
        for i in range(1, len(pdfs)):
            nome_do_arquivo = os.path.join(output, 'artigo{}.pdf'.format(i))
            a = pdfs[i]
            baixa_arquivo(url_basica.format(a), nome_do_arquivo)

【问题讨论】:

  • 你能发布你的错误堆栈跟踪吗?
  • 尝试将执行请求的代码封装在 try-catch 块中,您可以在 catch 块中记录有问题的 URL。

标签: python python-3.x beautifulsoup


【解决方案1】:

我能够通过在代码末尾添加一个条件来解决问题。如果状态为 404,我请求了 status_code 并取消了下载。

import requests
import httplib2
import os
from bs4 import BeautifulSoup, SoupStrainer

artigos = []
pdfs = []
http = httplib2.Http()
status, response = http.request('https://www.snh2021.anpuh.org/site/anais')
for link in BeautifulSoup(response, parse_only=SoupStrainer('a')):
    if link.has_attr('href'):
        artigos.append(link['href'])
for x in artigos:
    if x.endswith('pdf'):
        pdfs.append(x)
    print(pdfs)


def baixa_arquivo(url, endereco):
    resposta = requests.get(url)
    if resposta.status_code == requests.codes.OK:
        with open(endereco, 'wb') as novo_arquivo:
            novo_arquivo.write(resposta.content)
            print('Download concluído. Salvo em {}'.format(endereco))
    else:
        resposta.raise_for_status()


if __name__ == '__main__':
    url_basica = 'https://www.snh2021.anpuh.org/{}'
    output = 'Download'
    for i in range(550, len(pdfs)):
        nome_do_arquivo = os.path.join(output, 'artigo{}.pdf'.format(i))
        a = pdfs[i]
        z = url_basica.format(a)
        y = requests.get(z)
        if y.status_code!=404:
            baixa_arquivo(z, nome_do_arquivo)

【讨论】:

    猜你喜欢
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    相关资源
    最近更新 更多