Python学习笔记 - 下载图片

一. requests.Session()

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

import requests

base_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 urlretrieve
    import os
    
    img_url = 'https://wx4.sinaimg.cn/mw690/70396e5agy1fxlqvsv93sj20ku0yu42u.jpg'
    urlretrieve(img_url, './image.jpg')
    复制代码

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

  • requests模块

    import requests
    
    img_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 requests
    
    img_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 requests
import time
import random
from bs4 import BeautifulSoup
import os
from functools import reduce


base_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_path


def 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 htmls


def 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_src


def 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值