各位朋友们,很久没有冒泡了。闲话休提,今天我给大家,一些python开发过程中一些小技巧,内容不多,但是是干货。
在平常爬虫开发中,或者处理特别复杂的任务的时候,程序需要一个处理时间,此时我们的程序就会卡在某个地方,一般我们的解决办法是这样:
然后等待程序执行完成
或者就是一个循环不停的打印
像这样:
有的时候数据太多,整个屏幕都满了。
所以在我们只想知道程序执行进度的时候,我们是时候需要一个进度条来显示了,
提高一下我们的姿势水平。
ok,以上都是凑字数的废话,接下来是干货的时候。我们要实现控制台下显示进度条,需要以下办法:
1、安装click
click是flask团队所开发,命令行神器,大家可以直接去看文档,我们这里只用到它的进度条,方便我们在需要的时候直接一个snipet拿过来就可以用。
安装:
pip install click
2、引入相关模块
我就用实际的例子来介绍吧。
比如我们要抓一张图片,假如图片有点大,我们想知道图片的下载进度
首先引用需要的模块
from click import progressbar #从click引入progressbar,就是我们需要的进度条
from io import BytesIO #这个可以理解为文件对象的ducktype,负责存抓下来的图片
import requests #这个负责爬虫抓取的,都懂
3、抓取图片
假设图片很大,我就直接随便拿百度图片一个链接来用了
url="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1525346720537&di=8c176a2c81f7046f08e7dfd8424abcd4&imgtype=0&src=http%3A%2F%2Fstatic.open-open.com%2Flib%2FuploadImg%2F20160623%2F20160623173015_416.png"
resp = requests.get(url, stream=True,headers={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"})
resp.raise_for_status()
4、获取要下载图片的大小:
total_size = int(resp.headers['content-length'])
data = BytesIO()#存图片
5、迭代获取图片
chunk_size=0.1#模拟一下抓取大文件,每次迭代获取0.1 byte
with progressbar(length=total_size) as pbar:
#进度条使用with方式,也就是实现python里的contex
for chunk in resp.iter_content(chunk_size=chunk_size):
data.write(chunk)
pbar.update(len(chunk))#每下载完一个chunk就会更新进度条一次
6、封装成完整的函数(snipet)
def download_with_progress(url, chunk_size, **progress_kwargs):
"""
Download streaming data from a URL, printing progress information to the
terminal.
Parameters
----------
url : str
A URL that can be understood by ``requests.get``.
chunk_size : int
Number of bytes to read at a time from requests.
**progress_kwargs
Forwarded to click.progressbar.
Returns
-------
data : BytesIO
A BytesIO containing the downloaded data.
"""
resp = requests.get(url, stream=True,headers={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"})
resp.raise_for_status()
total_size = int(resp.headers['content-length'])
data = BytesIO()
with progressbar(length=total_size, **progress_kwargs) as pbar:
for chunk in resp.iter_content(chunk_size=chunk_size):
data.write(chunk)
pbar.update(len(chunk))
data.seek(0)
return data
if __name__=="__main__":
url="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1525346720537&di=8c176a2c81f7046f08e7dfd8424abcd4&imgtype=0&src=http%3A%2F%2Fstatic.open-open.com%2Flib%2FuploadImg%2F20160623%2F20160623173015_416.png"
download_with_progress(url,1,label="fetch baidu python img")
7、运行效果如下:运行结果
打完收工。