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

2024-04-08 23:12

本文主要是介绍百度松果菁英班——机器学习实践五:明星图片爬取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

飞桨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.chinasem.cn/article/886629

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识