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

时间:2013-05-03 22:28:38

标签: 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()
soup = BeautifulSoup(html)

list_urls = soup.find_all('a')

print list_urls[6]

3 个答案:

答案 0 :(得分:4)

通过您发布的示例:

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]

因此,您想要获取的网址可能是list_urls[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

但是一旦你确定了要下载的网址,就不会比你的初始网页更难:

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)

这主要是它。

您可能想要添加一些内容,但如果是这样,则必须手动添加它们。例如:

  • 查找包含建议文件名的Content-disposition标头,以代替网址的名称。
  • copyfilepagef而不是read将整个内容记入内存然后write将其输出。
  • 处理具有相同名称的现有文件。
  • ...

但那是基础。

答案 1 :(得分:3)

您可以使用python请求库,因为您有问题:http://www.python-requests.org

您可以像这样保存来自网址的文件:

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)

答案 2 :(得分:0)

使用urllib3的解决方案

strdup

然后是递归函数以获取所有文件

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')