如何使用请求库下载python中所有类型的文件
我正在用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(
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)