使用urllib的urlretrieve需要伪装浏览器吗?
本帖最后由 uranometria 于 2020-11-4 10:03 编辑如题!!!
用Request时候会报错:
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\PYTHON\music.py", line 38, in <module>
get_songs_file()
File "C:\Users\Administrator\Desktop\PYTHON\music.py", line 35, in get_songs_file
urllib.request.urlretrieve(url=req, filename=each)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 245, in urlretrieve
url_type, path = _splittype(url)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\urllib\parse.py", line 988, in _splittype
match = _typeprog.match(url)
TypeError: expected string or bytes-like object
========================================================================
现在报错改为了:
ConnectionResetError: 远程主机强迫关闭了一个现有的连接。
完整代码如下:
import urllib.request
import time
import os
import re
#下载地址:https://freepd.com/music/Silly%20Intro.mp3
path = 'C:\\Users\\Administrator\\Documents\\cache'
os.chdir(path)
url = 'https://freepd.com/upbeat.php'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0'
}
def get_songs_name():
req = urllib.request.Request(url=url, headers=headers)
result = urllib.request.urlopen(req)
content = result.read().decode('utf-8')
string = re.compile('<B>\w*\s\w*</B>')
all_songs = string.findall(content)
all_songs_name = []
for each in all_songs:
all_songs_name.append(each + '.mp3')
return all_songs_name
def get_songs_file():
for each in get_songs_name():
path = each.replace(" ", "%20")
download_url = "https://freepd.com/music/" + str(path)
req = urllib.request.Request(url=download_url, headers=headers)
result = urllib.request.urlopen(req)
urllib.request.urlretrieve(url=req, filename=each) #直接使用download_url可以正常下载 改为req则不行,报错。
time.sleep(20)
get_songs_file()
好像是 get_song_file 中的 url 不对,发个完整代码吧 需要改ua,另外完整代码发下。 本帖最后由 uranometria 于 2020-11-3 22:38 编辑
永恒的蓝色梦想 发表于 2020-10-31 18:25
好像是 get_song_file 中的 url 不对,发个完整代码吧
您好~已发~审核好像等了一段时间~希望可以帮忙看看!! suchocolate 发表于 2020-10-31 20:04
需要改ua,另外完整代码发下。
您好~已发代码 DD自己! 永恒的蓝色梦想 发表于 2020-10-31 18:25
好像是 get_song_file 中的 url 不对,发个完整代码吧
您好~已发~审核好像等了一段时间~希望可以帮忙看看!! suchocolate 发表于 2020-10-31 20:04
需要改ua,另外完整代码发下。
您好~已发~审核好像等了一段时间~希望可以帮忙看看!! uranometria 发表于 2020-11-3 22:39
您好~已发~审核好像等了一段时间~希望可以帮忙看看!!
import urllib.request
import os
import re
def ck_dir(dir):
if not os.path.exists(dir):
os.mkdir(dir)
os.chdir(dir)
def main():
ck_dir('pics')
url = 'https://freepd.com/upbeat.php'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0'}
req = urllib.request.Request(url=url, headers=headers)
result = urllib.request.urlopen(req)
content = result.read().decode('utf-8')
songs = re.findall(r'<B>(.*?)</B>', content)
for each in songs:
file_name = each + '.mp3'
path = each.replace(" ", "%20") + '.mp3'
download_url = "https://freepd.com/music/" + path
print(download_url)
urllib.request.urlretrieve(url=download_url, filename=file_name)
print(f'已下载{each}')
if __name__ == '__main__':
main() suchocolate 发表于 2020-11-4 09:29
{:10_250:}这 我认真看了一下 好像没有解决我的问题 本帖最后由 suchocolate 于 2020-11-4 12:33 编辑
uranometria 发表于 2020-11-4 10:01
这 我认真看了一下 好像没有解决我的问题
直接帮你优化了,可以用。
你报错的问题是urlretrieve接收url,不接受req对象。可以shell里help(urllib.request.urlretrieve)查看具体需要的参数。
另外re语法帮你优化了,免去列表截取的麻烦。 suchocolate 发表于 2020-11-4 12:05
直接帮你优化了,可以用。
你报错的问题是urlretrieve接收url,不接受req对象。可以shell里help(urlli ...
好的~谢谢您~还是想请教一下:urllib.request.urlretrieve使用的URL不需要进行处理,直接下载链接就可以了是吗?不需要伪装为服务器? uranometria 发表于 2020-11-4 13:39
好的~谢谢您~还是想请教一下:urllib.request.urlretrieve使用的URL不需要进行处理,直接下载链接就可以 ...
一般不需要,urlretrieve一般是针对文件get,文件一般不看ua。而如果是get网页或json数据会看ua。 suchocolate 发表于 2020-11-4 13:57
一般不需要,urlretrieve一般是针对文件get,文件一般不看ua。而如果是get网页或json数据会看ua。
好的~谢谢您~{:10_275:}
页:
[1]