百度松果菁英班——机器学习实践五:明星图片爬取

飞桨AI Studio星河社区-人工智能学习与实训社区

🥪图片爬取

import requests
import os
import urllib
​
class GetImage():def __init__(self,keyword='大雁',paginator=1):# self.url: 链接头self.url = 'http://image.baidu.com/search/acjson?'self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT\10.0; WOW64) AppleWebKit/537.36\(KHTML, like Gecko) Chrome/69.0.\3497.81 Safari/537.36'}self.headers_image = {'User-Agent': 'Mozilla/5.0 (Windows\NT 10.0; WOW64) AppleWebKit/537.36 \(KHTML, like Gecko) Chrome/69.0.\3497.81 Safari/537.36','Referer': 'http://image.baidu.com/\search/index?tn=baiduimage&ipn=r&\ct=201326592&cl=2&lm=-1&st=-1&\fm=result&fr=&sf=1&fmq=1557124645631_R&\pv=&ic=&nc=1&z=&hd=1&latest=0&copyright\=0&se=1&showtab=0&fb=0&width=&height=\&face=0&istype=2&ie=utf-8&sid=&word=%\E8%83%A1%E6%AD%8C'}self.keyword = keyword      # 定义关键词self.paginator = paginator  # 定义要爬取的页数
​def get_param(self):# 将中文关键词转换为符合规则的编码keyword = urllib.parse.quote(self.keyword)params = []# 为爬取的每页链接定制参数for i in range(1, self.paginator + 1):params.append('tn=resultjson_com&ipn=rj&ct=201326592&is=&\fp=result&queryWord={}&cl=2&lm=-1&ie=utf-8&o\e=utf-8&adpicid=&st=-1&z=&ic=&hd=1&latest=0&\copyright=0&word={}&s=&se=&tab=&width=&height\=&face=0&istype=2&qc=&nc=1&fr=&expermode=&for\ce=&cg=star&pn={}&rn=30&gsm=78&1557125391211\='.format(keyword, keyword, 30 * i))return params   # 返回链接参数
​def get_urls(self, params):urls = []for param in params:# 拼接每页的链接urls.append(self.url + param)return urls   # 返回每页链接
​def get_image_url(self, urls):image_url = []for url in urls:json_data = requests.get(url, headers=self.headers).json()json_data = json_data.get('data')for i in json_data:if i:image_url.append(i.get('thumbURL'))return image_url
​def get_image(self, image_url):"""根据图片url,在本地目录下新建一个以搜索关键字命名的文件夹,然后将每一个图片存入。:param image_url::return:"""cwd = os.getcwd()file_name = os.path.join(cwd, self.keyword)if not os.path.exists(self.keyword):os.mkdir(file_name)for index, url in enumerate(image_url, start=1):with open(file_name+'/{}_0.jpg'.format(index), 'wb') as f:f.write(requests.get(url, headers=self.headers_image).content)if index != 0 and index % 30 == 0:print('第{}页下载完成'.format(index/30))
​def __call__(self, *args, **kwargs):params = self.get_param()  # 获取链接参数urls = self.get_urls(params)image_url = self.get_image_url(urls)self.get_image(image_url)
​
if __name__ == '__main__':spider = GetImage('明星', 3)spider()
# spider = GetImage('雕', 3)# spider()
  • 初始化方法 __init__

    • 设置了爬取图片的默认关键词为"大雁",默认页数为1

    • 定义了百度图片搜索的请求头信息,其中包括了 User-Agent 和 Referer

  • get_param 方法

    • 将关键词转换为 URL 编码格式

    • 构建每一页图片搜索结果的链接参数

  • get_urls 方法

    • 根据参数列表构建每一页图片搜索结果的完整链接

  • get_image_url 方法

    • 发送请求获取每一页的图片链接

    • 解析 JSON 数据,提取每张图片的缩略图链

  • get_image 方法

    • 创建以搜索关键字命名的文件夹

    • 下载图片并保存到本地文件夹中

  • __call__ 方法

    • 调用上述方法实现图片下载功能

🥪图片爬取+图片保存

# 首先我们要导入相关的包
# request:提供爬虫相关的接口函数
# json:主要负责处理字典类型数据在字符串与字典之间进行转换
import requests
import json
import os
​
​
# 直接使用程序爬取网络数据会被网站识别出来,然后封禁该IP,导致数据爬
# 取中断,所以我们需要首先将程序访问页面伪装成浏览器访问页面
# User-Agent:定义一个真实浏览器的代理名称,表明自己的身份(是哪种浏览器),本demo为谷歌浏览器
# Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型
# Referer:浏览器向WEB服务器表明自己是从哪个网页URL获得点击当前请求中的网址/URL
# Connection:表示是否需要持久连接
# Accept-Language:浏览器申明自己接收的语言
# Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是
# 否支持压缩,支持什么压缩方法(gzip,deflate)
def getPicinfo(url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36","Accept": "*/*","Referer": "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E4%B8%AD%E5%9B%BD%E8%89%BA%E4%BA%BA&fenlei=256&rsv_pq=cf6f24c500067b9f&rsv_t=c2e724FZlGF9fJYeo9ZV1I0edbhV0Z04aYY%2Fn6U7qaUoH%2B0WbUiKdOr8JO4&rqlang=cn&rsv_dl=ib&rsv_enter=1&rsv_sug3=15&rsv_sug1=6&rsv_sug7=101","Host": "sp0.baidu.com","Connection": "keep-alive","Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,zh-TW;q=0.6","Accept-Encoding": "gzip, deflate"}# 根据url,使用get()方法获取页面内容,返回相应response = requests.get(url,headers)  # 成功访问了页面if response.status_code == 200:return response.text# 没有成功访问页面,返回Nonereturn None
​
#图片存放地址
Download_dir='picture'
if os.path.exists(Download_dir)==False:os.mkdir(Download_dir)
​
pn_num=1  #  爬取多少页
rn_num=10  #  每页多少个图片
​
for k in range(pn_num):  # for循环,每次爬取一页url="https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?resource_id=28266&from_mid=1&&format=json&ie=utf-8&oe=utf-8&query=%E4%B8%AD%E5%9B%BD%E8%89%BA%E4%BA%BA&sort_key=&sort_type=1&stat0=&stat1=&stat2=&stat3=&pn="+str(k)+"&rn="+str(rn_num)+"&_=1613785351574"res = getPicinfo(url)       # 调用函数,获取每一页内容json_str=json.loads(res)    # 将获取的文本格式转化为字典格式figs=json_str['data'][0]['result']  for i in figs:              # for循环读取每一张图片的名字name=i['ename']img_url=i['pic_4n_78']  # img_url:图片地址img_res=requests.get(img_url)  # 读取图片所在页面内容if img_res.status_code==200: ext_str_splits=img_res.headers['Content-Type'].split('/')ext=ext_str_splits[-1]  # 索引-1指向列表倒数第一个元素fname=name+"."+ext# 保存图片open(os.path.join(Download_dir,fname),  'wb' ).write(img_res.content)print(name,img_url,"saved")
  • 首先定义了一个函数getPicinfo(url),用于获取指定URL页面的内容。在请求头部添加了一些信息以伪装成浏览器访问页面,避免被网站封禁IP。通过requests.get(url, headers)方法发送GET请求,并返回响应的文本内容

  • 创建一个目录Download_dir用于存放下载的图片。如果目录不存在,则创建目录

  • 设置要爬取的页数pn_num和每页的图片数量rn_num

  • 使用for循环爬取每一页的图片。构造相应的URL,并调用getPicinfo(url)函数获取每一页的内容

  • 将获取的文本内容转化为字典格式json_str=json.loads(res)

  • 提取每张图片的名称和地址,并使用requests.get(img_url)方法获取图片所在页面的内容

  • 如果成功获取到图片内容(状态码为200),则通过open()函数将图片保存到指定的目录中

  • 打印图片的名称、地址和保存成功的提示信息

🥗有问题我们评论区见~

⭐点赞收藏不迷路~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/800804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux安装并配置Miniconda

miniconda官方文档: Miniconda — Anaconda 文档 官方文档中有讲到怎么安装Miniconda,如下: 以下是我得出的经验: 1. 新建新目录并下载和安装miniconda(安装过程中,当提示是否继续时,一直按回…

day75 js 正则表达式 window对象轮播图片调用定时器

一 正则表达式: RegExp 对象: 对字符串执行模式匹配的强大工具。 1 创建正则表达式对象 let reg /模式/修饰符 修饰符 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m", …

Azure的VFP和虚拟IP地址

Azure 的Virtual filtering platform (VFP) 是Azure 网络地址转换,端口转换和端口分配的基础。 下面我们来深入介绍一下VFP的工作方式。 VFP的出站动作。 对于客户端地址作为虚拟IP的出站目的地址的时候,VFP 驱动会负责做以下两个动作。 源地址转换。端口地址转换。VFP 和 S…

20240325-1-HMM

HMM 直观理解 马尔可夫链(英语:Markov chain),又称离散时间马尔可夫链(discrete-time Markov chain,缩写为DTMC),因俄国数学家安德烈马尔可夫(俄语:Андре…

【C++进阶】用哈希实现unordered_set和unordered_map的模拟

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:c大冒险 总有光环在陨落,总有新星在闪烁 前言: 之前我…

【C++ STL算法】sort 排序

文章目录 【 1. 基本原理 】【 2. sort 的应用 】实例 - sort 函数实现 升序排序和降序排序 函数名用法sort (first, last)基于 快速排序,对容器或普通数组中 [ first, last ) 范围内的元素进行排序,默认进行升序排序(从小到大)。…

2024年面试AI编译器岗经验总结

面试经历: 面试中必备的知识: 1.用C++实现一个卷积 (图解)一步一步使用CPP实现深度学习中的卷积 - GiantPandaCVGiantPandaCVhttp://giantpandacv.com/academic/%E7%AE%97%E6%B3%95%E7%A7%91%E6%99%AE/%E5%B0%BD%E8%A7%88%E5%8D%B7%E7%A7%AF%E7%A5%9E%E7%BB%8F%E7%BD%91%E…

git 常用命令和使用方法

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…

2014最新AIGC创作系统ChatGPT网站源码+AI绘画网站源码+GPT4-All联网搜索模型

一、文章前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持…

[C++][算法基础]字符串哈希(哈希表)

给定一个长度为 n 的字符串,再给定 m 个询问,每个询问包含四个整数 l1,r1,l2,r2,请你判断 [l1,r1] 和 [l2,r2] 这两个区间所包含的字符串子串是否完全相同。 字符串中只包含大小写英文字母和数字。 输入格式 第一行包含整数 n 和 m&#x…

HarmonyOS 应用开发-边缓存边播放案例

介绍 OhosVideoCache是一个支持边播放边缓存的库,只需要将音视频的url传递给OhosVideoCache处理之后再设置给播放器, OhosVideoCache就可以一边下载音视频数据并保存在本地,一边读取本地缓存返回给播放器,使用者无需进行其他操作…

Android Telephony框架

目录 一、简介二、应用层(Application)三、框架层(Framework)四、本地 RIL 层(RIL)五、驱动层(Modem)六、整体框架 一、简介 无论手机发展到如何智能的程度,最关键和重要的功能仍然是通讯,具体来说就是打电话、发短信、上网功能的使用。而整个 Android …

Centos 7 安装通过yum安装google浏览器

在CentOS 7上使用yum安装Google Chrome浏览器稍微复杂一些,因为Chrome并不直接包含在默认的Yum仓库中。按照以下步骤来操作: 1、添加Google Chrome仓库 首先,您需要手动添加Google Chrome的Yum仓库。打开终端,并使用文本编辑器&a…

MySQL高可用搭建方案MHA

MHA架构介绍 MHA是Master High Availability的缩写,它是目前MySQL高可用方面的一个相对成熟的解决方案,其核心是使用perl语言编写的一组脚本,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中&am…

使用 AI 生成正则表达式,告别正则烦恼

如果你有处理正则表达式的需求,那么这个网站(autoregex.xyz)一定要收藏好。 可以根据文字描述生成正则表达式。 默认是从文字到正则,不用选择。 输入框中输入描述,点击 ”GO“ 按钮。 等待一会儿,即可生…

get请求搜索功能爬虫

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency>…

mos管开关出现尖峰的原理? mos管开关的时候cs会出现尖峰,请问这是什么原因?

MOS管在开关过程中出现尖峰现象&#xff0c;通常是由于电路中的寄生参数和快速电压变化引起的。以下是一些导致尖峰出现的主要原因和原理&#xff1a; 寄生电容 在MOS管的源极&#xff08;S&#xff09;和漏极&#xff08;D&#xff09;之间存在寄生电容&#xff0c;这个电容在…

面试总结------2024/04/04---项目

1.面试官提问&#xff1a;你说你在项目中使用springsecurity jwt 实现了登录功能&#xff0c;能简单讲一下怎么实现的吗&#xff1f; 2.使用RabbitMQ实现订单超时取消功能 redis实现的劣势 订单状态定义 首先&#xff0c;我们需要定义订单的不同状态。在这个示例中&#xf…

【Java】单例模式

单例模式是面试中常考的设计模式之一 在面试中&#xff0c;面试官常常会要求写出两种类型的单例模式并解释原理 本文中&#xff0c;将从0到1的介绍单例模式究竟是什么 文章目录 ✍一、什么是设计模式&#xff1f;✍二、单例模式是什么&#xff1f;✍三、单例模式的类型**1.饿汉…

线上研讨会 | 新一代数字化技术赋能机器人及智能产线行业高质量发展

随着智能制造的快速推进&#xff0c;制造业转型升级到了关键阶段。越来越多的企业以数字化技术搭配智能机器人及智慧产线&#xff0c;主动实现数字化转型。达索系统3D体验平台是实现企业数字化转型的新一代数智化平台&#xff0c;基于型、数字驱动、数字化连续技术&#xff0c;…