博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python学习笔记 - 下载图片
阅读量:5811 次
发布时间:2019-06-18

本文共 3876 字,大约阅读时间需要 12 分钟。

一. requests.Session()

上一篇总结爬虫的文章里,有说道一个cookie的问题。当时我都是手动解析,手动添加的。后来才知道requests模块居然有一个Session功能,可以保持cookie。这里记录一下:

import requestsbase_url = 'https://www.zhihu.com'# 未登录装态r_session = requests.Session()r_session.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'zhihu = r_session.get(base_url)print(zhihu.request.headers)# 登录data = {
'username': 'username', 'password': 'password'}zhihu_sign_in = r_session.post('https://www.zhihu.com/api/v3/oauth/sign_in', data=data)print(zhihu_sign_in.request.headers)复制代码

结果:

用了Session就会自动带上cookie了。

二. 如何下载一个图片

  • urlretrieve

    在Python自带的模块urllib中提供了一个方法urlretrieve,可以用这个方法下载一个图片:

    from urllib.request import urlretrieveimport osimg_url = 'https://wx4.sinaimg.cn/mw690/70396e5agy1fxlqvsv93sj20ku0yu42u.jpg'urlretrieve(img_url, './image.jpg')复制代码

    传入图片地址和图片要存放的地址即可。

  • requests模块

    import requestsimg_url = 'https://wx4.sinaimg.cn/mw690/70396e5agy1fxlqvsv93sj20ku0yu42u.jpg'img = requests.get(img_url)with open('./image2.jpg', 'wb') as f:  f.write(img.content)复制代码

    使用requests模块也可以下载图片,通过open方法将下载下来的图片通过二进制方式写入文件中

    如果下载的图片(除了图片其他资源也一样,比如视频)特别大,那么还可以用

    import requestsimg_url = 'https://wx4.sinaimg.cn/mw690/70396e5agy1fxlqvsv93sj20ku0yu42u.jpg'img = requests.get(img_url, stream=True)with open('./image3.jpg', 'wb') as f:    for chunk in img.iter_content(chunk_size=10):        f.write(chunk)复制代码

    这种方式,加上steam=True参数,可以让requests下载一点保存一点,而不是等全部下载完成再进行保存,然后通过chunk_size控制chunk的大小

  • 实现一个下载壁纸的爬虫

import requestsimport timeimport randomfrom bs4 import BeautifulSoupimport osfrom functools import reducebase_url = 'https://alpha.wallhaven.cc/' # 壁纸网址req_session = requests.Session()req_session.headers['user-agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'def get_store_path(dir_name):    '''    创建存放壁纸文件目录    '''    current_path = os.path.abspath('.')    target_path = os.path.join(current_path, 'wallpaper/%s' % dir_name)    folder = os.path.exists(target_path)    if not folder:        os.makedirs(target_path)    return target_pathdef get_img_html(page_size):    '''    获取壁纸的html资源    '''    htmls = []    for i in range(1, page_size):        params = {            'q': keyword,        }        # 由于该网站page是从2开始的,如果带了小于2的值就会找不到壁纸        if i >= 2:            params['page'] = i        html = req_session.get('%s/search' % base_url, params=params)        htmls.append(html)        time.sleep(random.random())    return htmlsdef parse_html(html):    '''    从html中将壁纸地址解析出来    '''    imgs_src = []    bs_html = BeautifulSoup(html.text, 'lxml')    img_tags = bs_html.find_all('img', {
'class': 'lazyload'}) if len(img_tags): for img in img_tags: imgs_src.append(img['data-src']) return imgs_srcdef download_imgs(imgs_src): ''' 下载壁纸 ''' if len(imgs_src): for index, src in enumerate(imgs_src): img = req_session.get(src, stream=True) img_name = src.split('/')[-1] store_path = '%s/%s' % (get_store_path(keyword), img_name) with open(store_path, 'wb') as f: for chunk in img.iter_content(chunk_size=128): f.write(chunk) print('下载进度:%d/%d' % (index + 1, len(imgs_src))) print('下载完成,图片已存放在:%s' % store_path) else: print('没有找到相关主题的壁纸')keyword = input('请输入你想要下载的壁纸主题:')page_size = int(input('请输入下载壁纸的页数,每页24张:'))print('开始查找壁纸....')html_list = get_img_html(page_size)img_src_list = []if len(html_list): print('查找完成') print('开始爬取壁纸地址...') for html in html_list: img_src_list.append(parse_html(html)) img_src_list = reduce(lambda x, y: x+y, img_src_list) print('爬取完成') print('开始下载壁纸...') download_imgs(img_src_list)else: print('没有找到相关主题的壁纸')复制代码

结果:

转载于:https://juejin.im/post/5c417152f265da615064b8b7

你可能感兴趣的文章
如何测试ASP.NET Core Web API
查看>>
《The Age of Surge》作者访谈
查看>>
测试人员的GitHub
查看>>
Spring Web Services 3.0.4.RELEASE和2.4.3.RELEASE发布
查看>>
有关GitHub仓库分支的几个问题
查看>>
无服务器计算的黑暗面:程序移植没那么容易
查看>>
云原生的浪潮下,为什么运维人员适合学习Go语言?
查看>>
Webpack入门教程三十
查看>>
EAServer 6.1 .NET Client Support
查看>>
锐捷交换机密码恢复(1)
查看>>
Kali linux virtualbox rc=1908 错误解决办法
查看>>
linux软件包管理之三(源代码安装)
查看>>
数据库三范式是什么?
查看>>
[转载]设置Ubuntu自动连接无线,无须再输入密钥环和无线密码
查看>>
九叔Xen App测试报告
查看>>
Apache配置
查看>>
Ext gridPanel 单元格数据的渲染
查看>>
Android SDK 的下载代理
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>