将多行url请求转换为Python中的函数

2024-09-27 00:14:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试从不同的网站下载一系列文本文件。我将urllib.request与Python一起使用。我想扩展URL列表而不使代码变长

工作顺序是

import urllib.request

url01 = 'https://web.site.com/this.txt'
url02 = 'https://web.site.com/kind.txt'
url03 = 'https://web.site.com/of.txt'
url04 = 'https://web.site.com/link.txt'
[...] 

urllib.request.urlretrieve(url01, "Liste n°01.txt")
urllib.request.urlretrieve(url02, "Liste n°02.txt")
urllib.request.urlretrieve(url03, "Liste n°03.txt")
[...]

要下载的文件数量正在增加,我希望代码的第二部分保持简短

我试过了

 i = 0
 while i<51
   i = i +1
   urllib.request.urlretrieve( i , "Liste n°0+"i"+.txt")

它不起作用,我认为while循环可以用于字符串,但不能用于请求

所以我想把它变成一个函数

def newfunction(i)
return urllib.request.urlretrieve(url"i", "Liste n°0"+1+".txt")

但我似乎错过了一大块。 此请求正在工作,但似乎我无法将其转换为长列表或URL


Tags: 代码httpstxtcomweburl列表request
2条回答

在将变量i连接到url字符串之前,似乎没有将其强制转换为整数。这可能就是为什么你的代码不起作用的原因。while循环/for循环方法不应该影响请求是否被发送。我建议也使用requests模块进行请求。Mike的帖子涵盖了函数应该是什么样的。如果要在一段代码中发出大量请求,我还建议创建sessions对象。sessions对象将在您发出请求时保持底层TCP连接打开,这将减少延迟、CPU使用和网络拥塞(https://en.wikipedia.org/wiki/HTTP_persistent_connection#Advantages)。代码如下所示:

import requests

with requests.Session() as s:
    for i in range(10):
        s.get(str(i)+'.com')  # make request
       # write to file here

要转换为字符串,您可能需要以下内容:

 i = 0
 while i<51
   i = i +1
   urllib.request.urlretrieve( i , "Liste n°0" + str(i) + ".txt")

作为一般建议,我推荐Python的requests模块,而不是urllib

基于此,可能函数的一些简单代码:

import requests

def get_file(site, filename):
    target = site + "/" + filename
    try: 
        r = requests.get(target, allow_redirects=True)
        open(filename, 'wb').write(r.content)
        return r.status_code
    except requests.exceptions.RequestException as e:
        print("File not downloaded, error: {}".format(e))

然后,您可以调用该函数,传入站点和文件名的参数:

get_file('https://web.site.com', 'this.txt')

如果无法下载文件,函数将引发异常,但不会停止执行。您可以扩展异常处理来处理不可写的文件,但这应该是一个开始

相关问题 更多 >

    热门问题