我正在尝试使用与此答案相同的技术使用请求来下载大文件(即 android cts zip 文件) 。间歇性地无法下载整个文件,但在我尝试解压缩文件之前,我找不到任何表明出现问题的迹象
CTS_URL = 'http://dl.google.com/dl/android/cts/android-cts-8.0_r14-linux_x86-x86.zip'
CTS_ZIP = 'android-cts-8.0_r14-linux_x86-x86.zip'
import requests
req = requests.get(CTS_URL, stream=True)
with open(CTS_ZIP, 'wb') as cts_zip_file:
for chunk in req.iter_content(chunk_size=4096):
cts_zip_file.write(chunk)
Run Code Online (Sandbox Code Playgroud)
稍后当我尝试解压缩时出现BadZipFile("File is not a zip file")错误,因为文件尚未完全下载
import zipfile
zipfile.ZipFile(CTS_ZIP) # fails
Run Code Online (Sandbox Code Playgroud)
但是,我无法从请求对象中得到任何表明出现问题的指示。req.status伊斯兰200国。req.okTrue
req知道出了什么问题吗?目前,我在交互式提示中拥有这些请求对象之一,因此我可以进一步检查它。
我对 Python 完全陌生,我想通过向服务器发送请求来下载文件。当我在浏览器中输入它时,我看到 CSV 文件已下载,但是当我尝试发送 get 请求时,它没有返回任何内容。例如:
import urllib2
response = urllib2.urlopen('https://publicwww.com/websites/%22google.com%22/?export=csv')
data = response.read()
print 'data: ', data
Run Code Online (Sandbox Code Playgroud)
它没有显示任何内容,我该如何处理?当我在网上搜索时,所有的问题都是关于如何发送一个 get 请求。我可以发送 get 请求,但我不知道如何下载文件,因为它不在请求的响应中。
我不知道如何找到解决方案。
我在python-requests v.2.0.1中有流式下载大文件(大约1.5 GB)的问题
with open("saved.rar",'wb') as file:
r = session.get(url,stream=True,timeout=3600)
for chunk in r.iter_content(chunk_size=1024):
if chunk:
file.write(chunk)
file.flush()
Run Code Online (Sandbox Code Playgroud)
我在我的vps上测试了几次,有时下载200mb,500mb或800mb并保存它没有任何错误.它没有达到超时,就像完成下载一样停止.
我下载此文件的主机是稳定的,因为我没有任何问题在浏览器中下载此文件.
有什么方法可以在python请求中下载大文件并且100%确定它的整个文件?
@编辑
我用urllib解决了它,问题只在于请求.无论如何,谢谢你的帮助.
我在某些服务器上有一个巨大的 HTML 文件(数十兆字节),我需要定期下载和解析该文件,检测更改。因此,我尝试使用最常用的工具来完成此任务 - requests和lxml。
我发现的流解析的常见方法与此类似:
def fast_iter(url):
resp = requests.get(
url,
stream=True
)
context = etree.iterparse(resp.raw, html=True)
for event, elem in context:
print(elem)
if event == 'end' and elem.tag in TAGS:
yield elem
elem.clear()
while elem.getprevious() is not None:
if elem.getparent():
del elem.getparent()[0]
else:
break
del context
Run Code Online (Sandbox Code Playgroud)
但在我的例子中,它不起作用,因为iterparse()变得疯狂并返回一些从未出现在源 HTML 文件中的元素(并且它没有损坏!):
<Element vqoe at 0x7eff9762b448>
<Element jzu at 0x7eff9762b408>
<Element vvu at 0x7eff9762b3c8>
<Element d at 0x7eff9762b388>
<Element s at 0x7eff9762b348>
<Element ss_lt at 0x7eff9762b308> …Run Code Online (Sandbox Code Playgroud) 我想从这个网站上提取视频。 http://www.jpopsuki.tv/video/Meisa-Kuroki---坏女孩/ eec457785fba1b9b35bbf438cf35a7
我可以使用python访问它并获取整个html。但是视频的网址是相对的,即如下所示:
<source src="/images/media/eec457785fba1b9bb35481f438cf35a7_1351466328.mp4" type="video/mp4" />
有没有办法使用python将其从网站中提取?
我正在阅读McKinney的数据分析书,他已经分享了150MB的文件.尽管在使用请求通过http下载文件时,Progress Bar已经广泛讨论了这个主题,但我发现接受的答案中的代码引发了错误.我是初学者,所以我无法解决这个问题.
我想下载以下文件:
https://raw.githubusercontent.com/wesm/pydata-book/2nd-edition/datasets/fec/P00000001-ALL.csv
Run Code Online (Sandbox Code Playgroud)
这是没有进度条的代码:
DATA_PATH='./Data'
filename = "P00000001-ALL.csv"
url_without_filename = "https://raw.githubusercontent.com/wesm/pydata-book/2nd-edition/datasets/fec"
url_with_filename = url_without_filename + "/" + filename
local_filename = DATA_PATH + '/' + filename
#Write the file on local disk
r = requests.get(url_with_filename) #without streaming
with open(local_filename, 'w', encoding=r.encoding) as f:
f.write(r.text)
Run Code Online (Sandbox Code Playgroud)
这很好用,但因为没有进度条,我想知道发生了什么.
这里是从Progress Bar改编的代码,同时通过http下载文件和请求以及如何使用requests.py在python中下载大文件?
#Option 2:
#Write the file on local disk
r = requests.get(url_with_filename, stream=True) # added stream parameter
total_size = int(r.headers.get('content-length', 0))
with open(local_filename, 'w', encoding=r.encoding) …Run Code Online (Sandbox Code Playgroud) 我有一个 Flask 应用程序,它将提供一个端点来下载一个大文件。但是,不是从文件系统提供它或即时生成文件,而是必须首先通过 HTTP 从另一台服务器下载该文件。
当然,我可以先向外部服务器执行 GET 请求,完整下载文件并将其存储在文件系统或内存中,然后作为第二步提供原始请求的结果。这看起来像这样(还包括一个基本的身份验证,以表明为什么在较低层上的简单代理是不够的):
#!flask/bin/python
from flask import Flask, jsonify
import os
import requests
from requests.auth import HTTPBasicAuth
app = Flask(__name__)
@app.route('/download')
def download():
auth = HTTPBasicAuth("some_user", "some_password")
session = requests.Session()
session.auth = auth
response = session.get("http://example.com")
return response.content
if __name__ == '__main__':
app.run(host='0.0.0.0', port=1234, debug=True)
Run Code Online (Sandbox Code Playgroud)
但是,这会增加应用程序的延迟和存储要求。而且,即使接收方只需要执行文件的部分下载(即执行 HTTP 范围请求),也必须首先从外部服务器完全获取文件。
有没有更优雅的选择来解决这个问题,即为直接转发到外部服务器的 HTTP 范围请求提供支持?
我有很多的URL与文件类型.docx和.pdf我想运行一个python脚本从URL下载它们,并存储在文件夹中。这是我为单个文件所做的工作,我会将它们添加到 for 循环中:
response = requests.get('http://wbesite.com/Motivation-Letter.docx')
with open("my_file.docx", 'wb') as f:
f.write(response.content)
Run Code Online (Sandbox Code Playgroud)
但my_file.docx它保存的只有 266 字节并且已损坏,但 URL 很好。
添加了此代码并且它可以工作,但我想将它保存在一个新文件夹中。
import os
import shutil
import requests
def download_file(url, folder_name):
local_filename = url.split('/')[-1]
path = os.path.join("/{}/{}".format(folder_name, local_filename))
with requests.get(url, stream=True) as r:
with open(path, 'wb') as f:
shutil.copyfileobj(r.raw, f)
return local_filename
Run Code Online (Sandbox Code Playgroud) 我是 Python 新手,发现了一个下载数据并将数据保存为 demofile.csv 的代码
import requests
url = "https://example.com/demofile"
r = requests.get(url)
filename = url.split('/')[-1]
with open(filename+".csv", "wb") as code:
code.write(r.content)
Run Code Online (Sandbox Code Playgroud)
现在,我不想明确指定任何名称。 我只希望通过 Python 脚本打开该 URL,并使用默认名称和类型(我们手动下载文件时出现的名称和类型)下载文件。
另外,该文件应该保存在其他目录中,而不是保存 python 代码的文件夹中。
请在这方面提供帮助。
我一直在使用此代码通过 Google Drive 安装 Colab 并通过粘贴下载 URL 来下载任何文件,但我注意到即使文件大小只有几兆字节也需要很长时间。有什么可以做的来改善它。
**First cell:**
from google.colab import drive
drive.mount('/content/gdrive')
root_path = 'gdrive/My Drive/'
**Second cell:**
import requests
file_url = "DOWNLOAD URL HERE"
r = requests.get(file_url, stream = True)
with open("/content/gdrive/My Drive/FILE NAME HERE", "wb") as file:
for block in r.iter_content(chunk_size = 1024):
if block:
file.write(block)
Run Code Online (Sandbox Code Playgroud) 我正在尝试下载一个二进制文件并将其以其原始名称保存在磁盘 (linux) 上。
有任何想法吗?
import requests
params = {'apikey': 'xxxxxxxxxxxxxxxxxxx', 'hash':'xxxxxxxxxxxxxxxxxxxxxxxxx'}
response = requests.get('https://www.test.com/api/file/download', params=params)
downloaded_file = response.content
if response.status_code == 200:
with open('/tmp/', 'wb') as f:
f.write(response.content)
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试使用 Python Requests 下载视频,我想先找出它的大小。
import requests
print("STARTING PROGRAM...")
req = requests.get("https://www.source.com/source.mp4")
Run Code Online (Sandbox Code Playgroud)
我想到的唯一方法如下:
for chunk in req.iter_content():
count+=1
print("FOUND %d CHUNKS" %(count))
Run Code Online (Sandbox Code Playgroud)
但是自从我下载 24 分钟的 mp4 以来,这花了很长时间。有一个更好的方法吗?
python ×12
python-3.x ×2
csv ×1
download ×1
downloadfile ×1
flask ×1
get ×1
html ×1
http ×1
lxml ×1
parsing ×1
video ×1
web-scraping ×1