如何使用请求库下载python中所有类型的文件

如何使用请求库下载python中所有类型的文件,python,request,Python,Request,我正在用python构建爬虫程序,页面上有href列表 现在我有了可以下载的文件扩展名列表 list=['zip','rar','pdf','mp3'] 如何使用python将该url中的文件保存到本地目录 编辑: 根据您发布的示例: import urllib2 from bs4 import BeautifulSoup url = "http://www.example.com/downlaod" site = urllib2.urlopen(url) html = site.read(

我正在用python构建爬虫程序,页面上有
href
列表

现在我有了可以下载的文件扩展名列表

list=['zip','rar','pdf','mp3']

如何使用python将该url中的文件保存到本地目录

编辑:


根据您发布的示例:

import urllib2
from bs4 import BeautifulSoup

url = "http://www.example.com/downlaod"

site = urllib2.urlopen(url)
html = site.read()
soup = BeautifulSoup(html)

list_urls = soup.find_all('a')

print list_urls[6]
因此,您下一步要获取的URL可能是
list_URL[6]['href']

第一个技巧是,这可能是一个相对URL,而不是绝对URL。因此:

newurl = list_urls[6]['href']
absurl = urlparse.urljoin(site.url, newurl)
此外,如果文件具有正确的扩展名,则只希望获取该文件,因此:

if not absurl.endswith(extensions):
    return # or break or whatever
但是,一旦您决定了要下载的URL,就不比初始获取更难了:

page = urllib2.urlopen(absurl)
html = page.read()
path = urlparse.urlparse(absurl).path
name = os.path.basename(path)
with open(name, 'wb') as f:
    f.write(html)
基本上就是这样

您可能需要添加一些内容,但如果需要,则必须手动添加所有内容。例如:

  • 查找具有建议文件名的内容处置标头,以替代URL的basename
  • 复制文件
    页面
    f
    而不是
    读取
    将整个内容存入内存,然后
    写入
  • 处理同名的现有文件

但这是基础。

您可以使用python请求库,正如您所问的:

您可以按如下方式从url保存文件:

import requests

url='http://i.stack.imgur.com/0LJdh.jpg'

data=requests.get(url).content

filename="image.jpg"

with open(filename, 'wb') as f:
        f.write(data)
使用urllib3的解决方案

import os
import urllib3
from bs4 import BeautifulSoup
import urllib.parse 
url = "https://path/site"
site = urllib3.PoolManager()
html = site.request('GET', url)
soup = BeautifulSoup(html.data, "lxml")
list_urls = soup.find_all('a')
然后使用递归函数获取所有文件

def recursive_function(list_urls)
    newurl = list_urls[0]['href']
    absurl = url+newurl
    list_urls.pop(0)
    if absurl.endswith(extensions): # verify if contains the targeted extensions
        page = urllib3.PoolManager()
        html = site.request('GET', absurl)
        name = os.path.basename(absurl)
        with open(name, 'wb') as f:
            f.write(html.data)
    return recursive_function(list_urls)

如果您向我们展示您已经构建的代码,该代码将获得初始页面并从中提取
href
s,这将非常有帮助……此外,命名列表
list
也不是一个好主意。这是
列表
类型和构造函数的名称,如果给变量起相同的名称,则不能再使用该函数。我已更新了代码为什么您询问
请求
,然后用
urllib2
显示示例代码?同时…你被困在哪一部分?打印时,
列出了哪些URL[6]
打印出来的内容?你想用它做什么?你试过什么了?谢谢,伙计,我会继续的。当你说从
r
f
是什么意思。所以基本上所有的文件都是我们可以写的内容。不管是mp3、pdf还是zip。我认为只有文本文件才能读写。或者,我使用
f
作为
open
打开的本地文件,以及
r
作为
urlopen
的结果(因为这是文档在不使用
f
时使用的)…但我应该意识到我自己的代码上面称它为
page
,而不是
r
。我会编辑它,谢谢你指出。无论如何,是的,二进制文件仍然只是文件。(除此之外,在Windows上,您可能需要小心使用
'wb'
而不是
'w'
,这样Python就不会试图在非文本文件中“修复文本换行符”。如果您切换到Python 3.x,二进制和文本之间的差异会更有意义,但只要您使用2.x,我不想让您感到困惑。)而
urllib2
的全部要点是,它让您可以像对待文件一样对待网页。所以,实际上,这只是从一个文件复制到另一个文件。
def recursive_function(list_urls)
    newurl = list_urls[0]['href']
    absurl = url+newurl
    list_urls.pop(0)
    if absurl.endswith(extensions): # verify if contains the targeted extensions
        page = urllib3.PoolManager()
        html = site.request('GET', absurl)
        name = os.path.basename(absurl)
        with open(name, 'wb') as f:
            f.write(html.data)
    return recursive_function(list_urls)