• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Python_requests学习笔记一requests和re模块,爬取百度图片

武飞扬头像
禾戊之昂
帮助1

基于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.百度.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.百度.com/ 用户指定关键字,爬取 用户输入关键字 的首页60张图片并保存在本地文件夹。
程序运行效果:
1、输入关键字:xxx
2、自动创建文件夹:./image/xxx/ 并把首页60张图片保存到此文件夹

4、爬虫思路

  1. 查看所抓取数据(图片url地址)在响应内容中是否存在:
    学新通

  2. 检查中找到jpg后在网站源代码中查找;
    将上图中红框所示的内容复制,在网站源代码中查找,发现确实存在
    学新通

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

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

  5. 代码实现

5、爬虫类实现

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

    def __init__(self):
        self.url = 'https://image.百度.com/search/flip?tn=百度image&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.百度.com/search/flip?tn=百度image&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、实现效果

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhhacejg
系列文章
更多 icon
同类精品
更多 icon
继续加载