鱼C论坛

 找回密码
 立即注册
查看: 2920|回复: 13

[已解决]使用urllib的urlretrieve需要伪装浏览器吗?

[复制链接]
发表于 2020-10-31 17:53:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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: [WinError 10054] 远程主机强迫关闭了一个现有的连接。


完整代码如下:
  1. import urllib.request
  2. import time
  3. import os
  4. import re

  5. #下载地址:https://freepd.com/music/Silly%20Intro.mp3

  6. path = 'C:\\Users\\Administrator\\Documents\\cache'
  7. os.chdir(path)

  8. url = 'https://freepd.com/upbeat.php'
  9. headers = {
  10.     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0'
  11.     }

  12. def get_songs_name():
  13.     req = urllib.request.Request(url=url, headers=headers)
  14.     result = urllib.request.urlopen(req)
  15.     content = result.read().decode('utf-8')
  16.     string = re.compile('<B>\w*\s\w*</B>')
  17.     all_songs = string.findall(content)
  18.     all_songs_name = []
  19.     for each in all_songs:
  20.         all_songs_name.append(each[3:-4] + '.mp3')
  21.     return all_songs_name

  22. def get_songs_file():
  23.     for each in get_songs_name():
  24.         path = each.replace(" ", "%20")
  25.         download_url = "https://freepd.com/music/" + str(path)
  26.         req = urllib.request.Request(url=download_url, headers=headers)
  27.         result = urllib.request.urlopen(req)
  28.         urllib.request.urlretrieve(url=req, filename=each) #直接使用download_url可以正常下载 改为req则不行,报错。
  29.         time.sleep(20)
  30.         
  31. get_songs_file()
复制代码

最佳答案
2020-11-4 13:57:28
uranometria 发表于 2020-11-4 13:39
好的~谢谢您~还是想请教一下:urllib.request.urlretrieve使用的URL不需要进行处理,直接下载链接就可以 ...

一般不需要,urlretrieve一般是针对文件get,文件一般不看ua。而如果是get网页或json数据会看ua。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-31 18:25:37 | 显示全部楼层
好像是 get_song_file 中的 url 不对,发个完整代码吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-31 20:04:09 | 显示全部楼层
需要改ua,另外完整代码发下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-2 09:46:11 | 显示全部楼层
本帖最后由 uranometria 于 2020-11-3 22:38 编辑
永恒的蓝色梦想 发表于 2020-10-31 18:25
好像是 get_song_file 中的 url 不对,发个完整代码吧


您好~已发~审核好像等了一段时间~希望可以帮忙看看!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-2 09:46:53 | 显示全部楼层
suchocolate 发表于 2020-10-31 20:04
需要改ua,另外完整代码发下。

您好~已发代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-3 22:37:01 | 显示全部楼层
DD自己!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-3 22:38:45 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-10-31 18:25
好像是 get_song_file 中的 url 不对,发个完整代码吧

您好~已发~审核好像等了一段时间~希望可以帮忙看看!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-3 22:39:37 | 显示全部楼层
suchocolate 发表于 2020-10-31 20:04
需要改ua,另外完整代码发下。

您好~已发~审核好像等了一段时间~希望可以帮忙看看!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-4 09:29:14 | 显示全部楼层
uranometria 发表于 2020-11-3 22:39
您好~已发~审核好像等了一段时间~希望可以帮忙看看!!

  1. import urllib.request
  2. import os
  3. import re


  4. def ck_dir(dir):
  5.     if not os.path.exists(dir):
  6.         os.mkdir(dir)
  7.     os.chdir(dir)


  8. def main():
  9.     ck_dir('pics')
  10.     url = 'https://freepd.com/upbeat.php'
  11.     headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0'}
  12.     req = urllib.request.Request(url=url, headers=headers)
  13.     result = urllib.request.urlopen(req)
  14.     content = result.read().decode('utf-8')
  15.     songs = re.findall(r'<B>(.*?)</B>', content)
  16.     for each in songs:
  17.         file_name = each + '.mp3'
  18.         path = each.replace(" ", "%20") + '.mp3'
  19.         download_url = "https://freepd.com/music/" + path
  20.         print(download_url)
  21.         urllib.request.urlretrieve(url=download_url, filename=file_name)
  22.         print(f'已下载{each}')


  23. if __name__ == '__main__':
  24.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-4 10:01:39 | 显示全部楼层


这 我认真看了一下 好像没有解决我的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-4 12:05:08 | 显示全部楼层
本帖最后由 suchocolate 于 2020-11-4 12:33 编辑
uranometria 发表于 2020-11-4 10:01
这 我认真看了一下 好像没有解决我的问题


直接帮你优化了,可以用。
你报错的问题是urlretrieve接收url,不接受req对象。可以shell里help(urllib.request.urlretrieve)查看具体需要的参数。
另外re语法帮你优化了,免去列表截取的麻烦。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-4 13:39:07 | 显示全部楼层
suchocolate 发表于 2020-11-4 12:05
直接帮你优化了,可以用。
你报错的问题是urlretrieve接收url,不接受req对象。可以shell里help(urlli ...

好的~谢谢您~还是想请教一下:urllib.request.urlretrieve使用的URL不需要进行处理,直接下载链接就可以了是吗?不需要伪装为服务器?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-4 13:57:28 | 显示全部楼层    本楼为最佳答案   
uranometria 发表于 2020-11-4 13:39
好的~谢谢您~还是想请教一下:urllib.request.urlretrieve使用的URL不需要进行处理,直接下载链接就可以 ...

一般不需要,urlretrieve一般是针对文件get,文件一般不看ua。而如果是get网页或json数据会看ua。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-4 14:57:47 | 显示全部楼层
suchocolate 发表于 2020-11-4 13:57
一般不需要,urlretrieve一般是针对文件get,文件一般不看ua。而如果是get网页或json数据会看ua。

好的~谢谢您~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-29 04:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表