【Python_requests学习笔记(一)】基于requests和re模块,爬取百度图片

2023-11-16

基于requests和re模块,爬取百度图片

前言

此篇文章中介绍requests的基本用法,和基于requests和re模块,爬取百度图片的案例。

正文

1、requests模块

1.1、requests模块介绍

requests模块:类似于 urllib 库,HTTP请求库,向网站发请求获取响应,可用于网络请求和网络爬虫等,为第三方库。

1.2、requests安装方法

Windows端:-m pip install requests

1.3、requests常用方法

GET请求:请求页面,数据包含在URL里面。
使用 requests 发送网络请求非常简单,要发起一个GET请求,直接调用requests库里的get()方法即可,如下:res=requests.get(url=url,headers=headers).text

1.4、响应对象属性

  1. text:获取响应对象内容-字符串形式
  2. content:获取响应对象内容-bytes形式
  3. status_code:获取HTTP响应码
  4. url:返回实际数据的url地址

1.5、使用requests模块获取响应内容示例

import requests

url = "http://httpbin.org/get"
headers = {"User-Agent": "xxxxx"}
html = requests.get(url=url, headers=headers).text
print(html)
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "xxxxx", 
    "X-Amzn-Trace-Id": "Root=1-63f8649d-2351ffe22f7e379f6a7b18fd"
  }, 
  "origin": "223.80.102.182", 
  "url": "http://httpbin.org/get"
}

2、基于requests模块实现图片抓取

2.1、图片抓取介绍

图片、音频、视频在计算机中均以二进制方式存储,抓取的响应内容要转换为二进制形式

2.2、图片抓取思路

  1. 找到所要抓取图片的url地址
  2. 向图片url地址发请求,获取二进制响应内容(bytes)
  3. 正常打开文件,将响应内容以wb的方式保存到本地

2.3、基于requests模块实现图片抓取的步骤

  1. 找到图片的url地址
  2. 向图片的url地址发出请求,获取bytes响应内容
  3. 将bytes响应内容写入到本地jpg文件

2.4、基于requests模块实现图片抓取示例

import os
import requests

image_url = 'https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF'  # u=1595072465,3644073269&fm=193&f=GIF.jpg
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko)"}  # 重构请求头
html = requests.get(url=image_url, headers=headers).content  # 通过content属性 获取bytes数据类型
directory = './image/'  # 保存到指定路径
if not os.path.exists(directory):  # 判断路径是否存在
    os.makedirs(directory)  # 不存在,创建
filename = directory + image_url[24:] + '.jpg'  # 截取图片名称 拼接图片路径
with open(filename, "wb") as f:  # 以wb的方式打开文件
    f.write(html)  # 将bytes数据写入文件

运行效果:
在这里插入图片描述
在这里插入图片描述

3、案例需求梳理

爬取 百度图片官网:https://image.baidu.com/ 用户指定关键字,爬取 用户输入关键字 的首页60张图片并保存在本地文件夹。
程序运行效果:
1、输入关键字:xxx
2、自动创建文件夹:./image/xxx/ 并把首页60张图片保存到此文件夹

4、爬虫思路

  1. 查看所抓取数据(图片url地址)在响应内容中是否存在:
    在这里插入图片描述

  2. 检查中找到jpg后在网站源代码中查找;
    将上图中红框所示的内容复制,在网站源代码中查找,发现确实存在
    在这里插入图片描述

  3. url地址:https://image.baidu.com/search/index?tn=baiduimage&word={},{}中的内容为输入的关键字;

  4. 正则表达式: “thumbURL”:“(.*?)”;

  5. 代码实现

5、爬虫类实现

  1. 初始化函数
class imageSpider:
    """
    抓取指定关键字的百度图片首页60张图片
    """

    def __init__(self):
        self.url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word={}'  # 注意响应内容的编码问题:&ie=utf-8
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko)"}  # 重构请求头
        self.word = input("请输入关键字:")  # 提示用户输入关键字,注意:中文需要编码!
        self.directory = './image/{}/'.format(self.word)  # 创建图片保存路径
        if not os.path.exists(self.directory):  # 判断文件夹是否存在
            os.makedirs(self.directory)  # 若不存在,则创建
        self.times = 1  # 定义计数变量

  1. 数据抓取函数
    def parse_html(self):
        """
        function:  数据抓取函数
              in:  None
             out:  None
          return:  None
          others:  Data Fetching Function
        """
        params = parse.quote(self.word)  # 关键字进行编码
        html = requests.get(url=self.url.format(params), headers=self.headers).text  # 获取响应内容
        regex = 'thumbURL":"(.*?)"'  # 正则表达式
        pattern = re.compile(regex, re.S)  # 创建正则表达式编译对象
        src_list = pattern.findall(html)  # 使用findall方法
        for src in src_list:  # 遍历爬取的图片url
            self.save_image(src)  # 保存一张图片到本地
            time.sleep(random.randint(0, 1))  # 随机休眠0-1s
  1. 保存一张图片到本地函数
    该函数功能:在遍历 爬取到图片的url列表时,需要对每一个url地址使用requests的get方法获取响应内容并保存到本地,为了代码的整洁封装成函数。
    def save_image(self, src):
        """
        function:  保存一张图片到本地函数
              in:  src:一张图片的url地址
             out:  None
          return:  None
          others:  Save One Image To Local Function
        """
        html = requests.get(url=src, headers=self.headers).content  # 获取图片的二进制响应内容
        filename = self.directory + "{}_{}.jpg".format(self.word, self.times)  # 图片路径
        with open(filename, 'wb') as f:  # 保存图片
            f.write(html)
        print(filename + "下载成功!")  # 打印
        self.times += 1  # 计数+1
  1. 程序入口函数
    def run(self):
        """
        function:  程序入口函数
              in:  None
             out:  None
          return:  None
          others:  Program Entry Function
        """
        self.parse_html()  # 直接执行数据抓取函数

6、具体代码

import os
import re
import time
import random
import requests
from urllib import parse

class imageSpider:
    """
    抓取指定关键字的百度图片首页60张图片
    """

    def __init__(self):
        self.url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word={}'  # 注意响应内容的编码问题:&ie=utf-8
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko)"}  # 重构请求头
        self.word = input("请输入关键字:")  # 提示用户输入关键字,注意:中文需要编码!
        self.directory = './image/{}/'.format(self.word)  # 创建图片保存路径
        if not os.path.exists(self.directory):  # 判断文件夹是否存在
            os.makedirs(self.directory)  # 若不存在,则创建
        self.times = 1  # 定义计数变量

    def parse_html(self):
        """
        function:  数据抓取函数
              in:  None
             out:  None
          return:  None
          others:  Data Fetching Function
        """
        params = parse.quote(self.word)  # 关键字进行编码
        html = requests.get(url=self.url.format(params), headers=self.headers).text  # 获取响应内容
        regex = 'thumbURL":"(.*?)"'  # 正则表达式
        pattern = re.compile(regex, re.S)  # 创建正则表达式编译对象
        src_list = pattern.findall(html)  # 使用findall方法
        for src in src_list:  # 遍历爬取的图片url
            self.save_image(src)  # 保存一张图片到本地
            time.sleep(random.randint(0, 1))  # 随机休眠0-1s

    def save_image(self, src):
        """
        function:  保存一张图片到本地函数
              in:  src:一张图片的url地址
             out:  None
          return:  None
          others:  Save One Image To Local Function
        """
        html = requests.get(url=src, headers=self.headers).content  # 获取图片的二进制响应内容
        filename = self.directory + "{}_{}.jpg".format(self.word, self.times)  # 图片路径
        with open(filename, 'wb') as f:  # 保存图片
            f.write(html)
        print(filename + "下载成功!")  # 打印
        self.times += 1  # 计数+1

    def run(self):
        """
        function:  程序入口函数
              in:  None
             out:  None
          return:  None
          others:  Program Entry Function
        """
        self.parse_html()  # 直接执行数据抓取函数


if __name__ == '__main__':
    image_spider = imageSpider()  # 类的实例化
    image_spider.run()  # 执行入口函数

7、实现效果

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python_requests学习笔记(一)】基于requests和re模块,爬取百度图片 的相关文章

随机推荐

  • Windows拍照报错:0xA00F424F PhotoCaptureFileCreationFailed (0x80270200)解决办法

    Windows拍照报错 0xA00F424F PhotoCaptureFileCreationFailed 0x80270200 解决办法 1 为本机照片添加库文件夹 windows 10路径 C Users Administrator A
  • C语言之指针篇【超详细讲解,带你层层深入理解指针】

    目录 一 关于指针 二 指针类型 1 整型指针的访问权限说明 2 字符指针的访问权限说明 3 指针的类型决定向前或向后一步走了多大距离 三 野指针相关知识 1 野指针的成因 指针未初始化 指针的越界访问 指针所指向的空间释放了 2 如何规避
  • 2019 CVPR oral 去模糊论文"DAVANet: Stereo Deblurring with View Aggregation"阅读笔记

    19CVPR 结果早就出来了 最近才读到的19年oral的去模糊工作 博主认真的搜了一下18年的CVPR deblurring 相关的oral为zero 底层图像复原的oral工作也很少 因此 十分兴奋看到deblurring的oral工作
  • Spring源码:PropertyValues类及属性注入二

    主代码 1 RuntimeBeanReference类型 2 RuntimeBeanNameReference类型 3 BeanDefinitionHolder类型 4 BeanDefinition类型 5 ManagedArray类型 6
  • SpringBoot中MyBatis传参的方式

    版本 SpringBoot调用MyBatis访问数据库 依赖为org mybatis spring boot 版本为2 1 2 两种调用方式 两种调用方式为 注解方式和SqlProvider方式 两种方式所遵循的规则相同 无论是否使用 Pa
  • 【php】密码正则格式校验

    密码由字母或数组组成 function is passwd v pattern 0 9a zA Z 6 16 i if preg match pattern v System FileLog FileLog write h5密码重置 tru
  • el-table渲染二级对象数组

    1 序言 项目地址如下 https gitee com liu wenxin complexELTable git 想要渲染这样的数据 el table官网给的例子都是一级对象数组 如果想要渲染二级对象数组 直接 table tableDa
  • 什么是多阶段 Docker 镜像?

    介绍 让我们从基础开始 码头工人 这是一个很棒的工具 可以让您在这些简洁的小容器中创建 部署和运行应用程序 将它们想象成微型虚拟机 但只有足够的资源来运行您的应用程序 这太棒了 因为这意味着您可以在任何平台上运行您的应用程序 从笔记本电脑到
  • Raneto

    Raneto Raneto是一个采用Node js开发的免费开源知识库平台 它使用Markdown文件来存储知识库 Raneto也可以叫作一个 静态网站生成器 因为它不需要数据库 你的所有内容都存储在 Markdown md 文件中 整个知
  • Vue2 +Element-ui实现前端页面

    1 页面项目 以一个简单的前端页面为例 主要是利用vue和element ui实现 里面涉及的主要包括 新建vue项目 一行多个输入框 页面实现等 2 项目流程 1 新建项目 首先安装nodejs 这部分在此就不讲啦 然后安装vue cli
  • 关于BIO、AIO、NIO的 区别于联系

    目录 IO BIO NIO AIO 区别及联系 各自适用场景 使用方式 IO 什么是IO 它是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口 它对于任何计算机系统都非常关键 因而所有 I O 的主体实际上是内置在操作系统中的
  • 深度学习——贝叶斯神经网络

    文章目录 前言 什么是贝叶斯神经网络 How to train BNN BNN背后的数学原理 pytorch实现BNN 参考文献 前言 本文将总结贝叶斯神经网络 首先 我将简单介绍一下什么是贝叶斯神经网络 BNN 接着我将介绍BNN是怎么训
  • Orcad Captue原理图更改后同步更新到Allegro PCB

    Cadence软件的原理图和PCB是两个软件 原理图到PCB需要创建网表 然后在PCB中放置已经建好分封装的元器件 如果对于已经画好的PCB 后期发现需要更改原理图的某个部分 原理图更改后 怎么同步更新到PCB中 而不变动原来已经布好局 布
  • MySQL备份及恢复

    目录 MySQL备份 MySQL备份方法 备份策略 mysql的完全备份 mysql的增量备份 MySQL恢复 mysql完全恢复 mysql增量备份的恢复 MySQL备份 MySQL备份是基于对MySQL的日志进行备份 且恢复也是通过日志
  • Multispectral Pedestrian Detection using Deep Fusion Convolutional Neural Networks (深度学习多光谱行人检测综述)

    Now salient detection methods most of current pedestrian detectors explored color images of good lighting and they are v
  • 基于Arduino的双向交通灯系统

    学 号 231 姓 名 福福 指导教师 赵志鹏 年 7 月 2 日 实训题目 交通灯系统 1 系统设计 设计要求 设计任务 设计基于Arduino的双向交通灯系统 实现控制和方向显示功能 性能指标要求 1 基本要求 1 按照题目要求独立完成
  • 动态显示带图片列表【Android】

    一 功能描述 1 动态获取服务器端商品信息显示 2 动态加载服务器端图片显示 二 技术点 ListView BaseAdapter JSON数据解析 Handler Thread HttpUrlConnection AsyncTask Ht
  • unity 字体 素材_教程篇

    Unity异步加载 在使用Unity引擎开发项目时 很多时候需要用到异步加载场景或资源 如需打开一个非常大的场景时需要等待 两个场景之间的一个过渡 游戏关卡的加载等等 通过添加一个进度条的方式可以很好的增强用户体验 并让用户了解场景的加载进
  • 【DevOps】Centos 7.9 安装、部署与使用 k8s集群(v1.21.3)

    卸载 k8s集群 1 平滑移除 Node kubectl get node kubectl cordon node name 不可调度 kubectl drain node name 驱逐资源 kubectl delete node nam
  • 【Python_requests学习笔记(一)】基于requests和re模块,爬取百度图片

    基于requests和re模块 爬取百度图片 前言 此篇文章中介绍requests的基本用法 和基于requests和re模块 爬取百度图片的案例 正文 1 requests模块 1 1 requests模块介绍 requests模块 类似