Python学习笔记 - 下载图片

news/2024/7/19 11:39:31 标签: 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


http://www.niftyadmin.cn/n/1661279.html

相关文章

如何正确合理的设计一个接口项目

首先,我这里说明接口,不是代码里的接口,而是接口项目,如果想错了就不用往下看了。 在手机广泛流行的今天,手机应用也随之越来越多,而且成长的速度也非常快。手机应用软件开发实现方式同普通PC软件一样&…

Linux中Tomcat自启动(作为系统服务)

1、修改startup.sh文件在文件头增加以下内容:#!/bin/sh# chkconfig: 2345 97 00 # description:tomcat auto start # processname: tomcat第一行是服务的配置:第一个数字是服务的运行级,2345表明这个服务的运行级是2、3、4和5级(L…

Commons lang3 包ArrayUtils类使用

package com.aimilin.test;import java.util.List; import java.util.Map;import org.apache.commons.lang3.ArrayUtils; import org.junit.Test;public class LangTest {// 打印数组public static <T> void p(T... obj) {if (obj null)return;for (T t : obj) {System.…

hibernate之c3p0连接池配置详解

数据库连接池&#xff0c;项目中一旦配置好后一般很少改动&#xff0c;所以很多人并没有细细的研究过&#xff08;有时甚至是运维的人负责配置&#xff09;&#xff0c;其实这个知识点还是很重要的&#xff0c;所以我在这里总结分享下&#xff0c;需要用到的时候拿出来看看就可…

Adaptive Execution如何让Spark SQL更高效更好用?

本文转发自技术世界&#xff0c;原文链接 http://www.jasongj.com/spark/adaptive_execution/ 1 背 景 Spark SQL / Catalyst 和 CBO 的优化&#xff0c;从查询本身与目标数据的特点的角度尽可能保证了最终生成的执行计划的高效性。但是 执行计划一旦生成&#xff0c;便不可更…

URL特殊字符表

URL特殊字符表行号字符说明十六进制值1.URL 中号表示空格%2B2.空格URL中的空格可以用号或者编码%203./分隔目录和子目录%2F4.?分隔实际的 URL 和参数%3F5.%指定特殊字符%256.#表示书签%237.&URL 中指定的参数间的分隔符%268.URL 中指定参数的值%3D

聊聊flink的AsyncWaitOperator

序 本文主要研究一下flink的AsyncWaitOperator AsyncWaitOperator flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/operators/async/AsyncWaitOperator.java Internal public class AsyncWaitOperator<IN, OUT>extends AbstractUdfStream…

Linux下Tomcat中POI导出异常:java.lang.NoClassDefFoundError: sun/awt/X11GraphicsEnvironment

POI导出Excel出现java.lang.NoClassDefFoundError: sun/awt/X11GraphicsEnvironment异常 问题描述&#xff1a; 项目在window中使用POI导出Excel没有任何问题&#xff0c;而到linux中使用POI导出Excel出现&#xff1a;java.lang.NoClassDefFoundError: sun/awt/X11GraphicsEnv…