基于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、响应对象属性
- text:获取响应对象内容-字符串形式
- content:获取响应对象内容-bytes形式
- status_code:获取HTTP响应码
- 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、图片抓取思路
- 找到所要抓取图片的url地址
- 向图片url地址发请求,获取二进制响应内容(bytes)
- 正常打开文件,将响应内容以wb的方式保存到本地
2.3、基于requests模块实现图片抓取的步骤
- 找到图片的url地址
- 向图片的url地址发出请求,获取bytes响应内容
- 将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、爬虫思路
-
查看所抓取数据(图片url地址)在响应内容中是否存在:
-
检查中找到jpg后在网站源代码中查找;
将上图中红框所示的内容复制,在网站源代码中查找,发现确实存在
-
url地址:https://image.baidu.com/search/index?tn=baiduimage&word={},{}中的内容为输入的关键字;
-
正则表达式: “thumbURL”:“(.*?)”;
-
代码实现
5、爬虫类实现
- 初始化函数
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
- 保存一张图片到本地函数
该函数功能:在遍历 爬取到图片的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
- 程序入口函数
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() # 执行入口函数