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

基于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、实现效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

禾戊之昂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值