首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用请求库下载所有类型的python文件?

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

Stack Overflow用户
提问于 2013-05-04 06:28:38
回答 3查看 5K关注 0票数 2

我正在用python构建爬虫,我有来自页面的href列表。

现在我有了要下载的文件扩展名列表,如下所示

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

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

编辑:

代码语言:javascript
复制
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]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-04 06:48:45

按照你发布的例子:

代码语言:javascript
复制
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_urls[6]['href']

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

代码语言:javascript
复制
newurl = list_urls[6]['href']
absurl = urlparse.urljoin(site.url, newurl)

此外,如果文件具有正确的扩展名,则只希望获取该文件,因此:

代码语言:javascript
复制
if not absurl.endswith(extensions):
    return # or break or whatever

但是一旦你决定了你想要下载的URL,它就不会比你最初的抓取更难了:

代码语言:javascript
复制
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标头,以替换从pagef的URL,而不是将整个内容read到内存中,然后将其write出来。
  • 处理具有相同名称的现有文件。

但这是最基本的。

票数 4
EN

Stack Overflow用户

发布于 2014-01-13 16:33:58

您可以使用python请求库,正如您所问的那样:http://www.python-requests.org

你可以像这样从url中保存文件:

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2018-09-19 00:25:51

使用urllib3的解决方案

代码语言:javascript
复制
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')

然后使用递归函数来获取所有文件

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16368466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档