【python--爬虫】百度图片爬虫

news/2024/12/28 22:49:56/

如何快速收集某个关键字的图片呢?有的小伙伴可能会说百度图片,bingo答对了!o( ̄▽ ̄)o,博主本次就讲解下如何爬取百度图片

环境准备

为了优雅的享用这盘python爬虫大餐,请各位读者大大准备要以下的内容哦!= ̄ω ̄=
一台可以上百度的win7或win10的电脑(32位64位的都可以)
火狐浏览器(版本没啥限制,最好用新一点的)
python(博主使用的python3.7)
requests库(版面没啥要求)
re库(这个是python自带的,不用准备)
最后还需要准备:点赞关注加评论(皮一下很开心o()q)

网页分析

又,又,又到了我们分析网页的时间了,请各位聪明睿智的读者大大,耐心观看,学习下博主的思路,看看博主是如何从网页中找到自己想要的信息的。( ̄_ ̄ )一本正经的胡说八道中。。。

首先我们打开百度图片首页,页面如下:
在这里插入图片描述比如说我搜索【可爱的猫猫图片】,
在这里插入图片描述好可爱,看的我心都要化了 (❤ ω ❤),我们按下【F12】,打开开发者工具,看下浏览器发出了哪些请求!
在这里插入图片描述首先点击【网络】,然后点击【重新加载】刷新下网页。
在这里插入图片描述点击 html切换到网页源码请求栏中。点击第一个请求。
在这里插入图片描述可以看到访问的网址是【https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=可爱的猫猫图片 】
可以看到请求的网址的最后一个参数是【word=可爱的猫猫图片】
正好是我们搜索的关键字,不妨大胆的猜测下,是不是修改最后面【word=】的值,就可以搜索不同的内容呢!

比如说我要搜索 【可爱的狗狗图片】,得到如下的一个网址
【https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=可爱的狗狗图片 】
在浏览器中打开验证下!
在这里插入图片描述成功的搜索到了狗狗的图片,证明我们的猜想是对的
通过修改【word=】的内容即可得到搜索对应的内容的网址。
现在返回猫猫网页。看看能不在网页源代码中找到图片的url
随便【右键】一张猫猫图片,在弹出的选项框中选择【查看元素】,即可条跳转到当前图片的代码
在这里插入图片描述在这里插入图片描述可以看到有着一个类似于图片网址的Url【https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=3055942732,3898330129&fm=26&gp=0.jpg 】我们使用浏览器打开该网址看看是不是就是我们要的那张图片
在这里插入图片描述好棒,我们猜对了,就是我们要的图片。ヾ(≧▽≦*)o
我们在回到图片页面按【ctrl + U】即可调出 收到的基础网页源码。为啥我要说基础网页源码,(ps:这个名词可能不太准确§( ̄▽ ̄)§,各位看官请见谅),众所周知现在好多的网页为了加快访问速度,采取的方式是,我先将网页框架写出来,具体的数据,通过js脚本进行填充。所以就有可能出现,在网页中存在某个值,但是在网页的基础源码中找不到的问题。该解释可能说的不是那么准确,请各位大佬多多指点!

现在我们就去网页的源代码中查找下是否存在有这个值,打开网页的基础源代码后可以看到如下画面。
在这里插入图片描述

我们按【ctrl + F】即可调出查找对话框,将图片的前面我们找到的图片网址【https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=3055942732,3898330129&fm=26&gp=0.jpg 】输入其中进行查找,
在这里插入图片描述可以看到在网页基础源码中找到了图片的网址,但是位置不太对,再挂观察下url存在的位置,看看是包含在哪的!
观察后可以看出图片url存在于字符串【“thumbURL”:"】和字符串【",“replaceUrl”】之间。现在图片的url我们也找到了存在的位置

分析总结

  1. 要搜索什么关键字的图片就将网址【https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=可爱的猫猫图片 】后面的【可爱的猫猫图片】替换成什么。就可以的到搜索页面的url。

  2. 图片的url存在于网页代码中字符串【“thumbURL”:"】和字符串【",“replaceUrl”】之间。

实战代码

  1. 设置前提参数
    依旧是我们的老传统,设置默认编码,作者,编写时间
# -*- coding:utf-8 -*-
#作者:猫先生的早茶
#时间:2019年5月22日

第一行 # -- coding:utf-8 --的意思是:设置该程序运行时使用的编码格式为utf-8编码
第二行是设置作者是谁,可省略
第三行是设置编写时间,可省略

  1. 导入模块
    导入我们后面要使用的模块
import requests
import re

requests库用于下载网页代码,和下载图片等。
re库 ,正则表达式,用于提取出来网页源码中我们想要的内容

  1. 设置变量
main_url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=可爱的猫猫图片'
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:66.0) Gecko/20100101 Firefox/66.0','Referer':'https://www.baidu.com',}
name = 0

这个main_url 指的是图片搜索页面的url,也就是【网页分析】中的第二张图片
header,存储的是浏览器头部信息。
header中User-Agent 存储的信息,相当于告诉服务器访问他的设备的信息,比如说,我的这个信息相当于告诉对方,我使用的是通过一台win10,64位的电脑的火狐浏览器访问的。至于这个Referer相当于告诉对方我是通过网址【https://www.baidu.com】跳转过来的。
至于这个name,是用于后期生成图片名称

  1. 下载网页
    现在我们定义一个函数专门用于下载网页代码
def get_html(url):'''下载网页'''html = requests.get(url=url,headers=header).textreturn html

我编写了一个名为get_html的函数专门用于下载网页代码,调用这个函数时需要传递进来一个网址作为参数。
函数中写着,使用requests库的get方法去下载网页代码,将函数调用时传递进来的Url作为get方法中请求的url的参数,将前面设置的header作为请求头的参数。将下载到的内容以文本的形式存储再变量html中,然后将变量html,也就时下载到的网页的源代码作为函数执行的结果弹出。

我们来看看执行效果:

html = get_html(main_url)
print (html)

在这里插入图片描述成功的将网页的源代码下载到了! (。・∀・)

  1. 提取图片url
    我们可以获取到网页的源代码了,还需要将图片的url提取出来。
def get_img_url(data):'''匹配出图片的url'''url_re = re.compile('"thumbURL":"(.*?)","replaceUrl"')url_list = url_re.findall(data)return url_list

这里我先创建了一个名为get_img_url的函数专门用于提取网页源码中图片的url,调用该函数时需要将网页的源代码作为参数传递进来,首先我先使用re.compile将【“thumbURL”:"(.*?)",“replaceUrl”】编译成正则表达式的格式,那么这个正则表达式匹配的格式是如何来的呢?我们在分析总结中提到了图片的存在于网页代码中字符串【“thumbURL”:"】和字符串【",“replaceUrl”】之间。那么这个(.*?)又是从哪来的呢?这个是正则表达式的一个匹配条件,采用的是非贪婪模式。具体的细节博主将会在后面出一篇专门讲正则表达式的帖子,各位读者只要知道我们爬取网页时写的最多的匹配条件就是这个。= ̄ω ̄= 博主这里先贴一张当初学正则时记录的笔记图片
在这里插入图片描述正如图中讲到的,url_re = re.compile('"thumbURL":"(.*?)","replaceUrl"')就是讲正则匹配的条件编译成正则的格式,然后使用url_list = url_re.findall(data)讲搜索到的所有内容存入 url_list中。最后使用return讲匹配到的url_list作为程序的执行结果弹出。

我们执行看下效果。

html = get_html(main_url)
url_list = get_img_url(html)
print (url_list)

在这里插入图片描述可以看到我们将图片的url都提取出来了。比如说我复制第一个url,在浏览器打开验证下【https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=3055942732,3898330129&fm=26&gp=0.jpg 】
在这里插入图片描述是我们需要爬取的图片 现在图片的url 也有了,就差下载保存了。感觉自己棒棒的( ̄︶ ̄)。

  1. 下载图片
    我们还需要在python程序所在的目录中创建一个名为【picture】的文件夹专门用于保存图片
def get_img(url):'''下载并保存图片'''global namename += 1file_name = 'picture\\{}.jpg'.format(name)img = requests.get(url=url,headers=header).contentwith open(file_name,'wb') as save_img:save_img.write(img)

首先我定义了一个名为get_img的函数用于下载并保存图片,调用该函数时需要传递一个图片的url作为参数。global name的作用是啥呢?相当于设置这个函数可以修改全局变量name的值。name +=1 的作用是每次执行函数就将name的值增加一。 file_name = 'picture\\{}.jpg'.format(name)设置图片保存的名称。img = requests.get(url=url,headers=header).content使用requests库的get方法下载图片,将函数调用时传递进来的图片url作为请求的url,将前面设置的header作为请求头,将下载到的数据以二进制的形式保存在变量img中。

    with open(file_name,'wb') as save_img:save_img.write(img)

将下载的图片二进制数据保存下来

我们执行后看下效果

html = get_html(main_url)
url_list = get_img_url(html)
for url in url_list:get_img(url)print ("正在下载第{}张图片".format(name))

在这里插入图片描述可以看到下载了30张图片
在这里插入图片描述

完整代码

# -*- coding:utf-8 -*-
#作者:猫先生的早茶
#时间:2019年5月22日import requests
import remain_url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=可爱的猫猫图片'
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:66.0) Gecko/20100101 Firefox/66.0','Referer':'https://www.baidu.com',}
name = 0def get_html(url):'''下载网页'''html = requests.get(url=url,headers=header).textreturn htmldef get_img_url(data):'''匹配出图片的url'''url_re = re.compile('"thumbURL":"(.*?)","replaceUrl"')url_list = url_re.findall(data)return url_listdef get_img(url):'''下载并保存图片'''global namename += 1file_name = 'picture\\{}.jpg'.format(name)img = requests.get(url=url,headers=header).contentwith open(file_name,'wb') as save_img:save_img.write(img)html = get_html(main_url)
url_list = get_img_url(html)
for url in url_list:get_img(url)print ("正在下载第{}张图片".format(name))

http://www.ppmy.cn/news/682396.html

相关文章

可爱的小狗们

我属狗,也非常喜欢狗,这里发几张漂亮的小狗图片,收藏一下,呵呵. 转载于:https://blog.51cto.com/cdmatong/7537

和谐生活图片欣赏:狗狗 猫猫 我

成员介绍: 狗狗: 名字:miki 年龄:11个月 性别:MM 性格:温和,有时候会很淘气,经常不让我上网,我一动鼠标,她就用嘴拱我的手。 猫猫: 名字&#xff…

【知识星球】猫猫狗狗与深度学习那些事儿

欢迎大家来到《知识星球》专栏,这两天有三AI知识星球会更新一些猫狗相关的数据集和任务,可爱的猫猫狗狗对深度学习可是做出了不少的贡献呢。 作者&编辑 | 言有三 有三AI知识星球-数据集 Oxford-IIIT Pet Oxford-IIIT Pet Dataset是一个猫狗数据集&am…

万物皆可AI,狗狗也不例外

文/ 智能相对论(ID:aixdlun) 作者/ 离离 ​ 近年来,科技的进步让富豪们对宠物有了新的选择。除了具有名贵血统的猫狗和赛马,“饲养”带有尖端科技的AI机器狗似乎也正在形成一种风潮。 四月二十九日,梅耶…

【阶段四】Python深度学习06篇:深度学习项目实战:卷积神经网络进行狗狗图像分类项目

本篇的思维导图: 项目背景 应用Keras框架构建卷积神经网络进行狗狗图像分类的预测,以及模型的优化。主要用来熟悉Keras卷积层、池化层网络的使用以及模型的优化方法。 数据获取 本次建模数据来源于网络,数据项统计如下: 数据集为狗狗数据集,来自全国各地的狗狗图像…

数据结构--栈的引用--前中后缀表达式(前部分)

数据结构–栈的引用–前中后缀表达式(前部分) 常见的算数表达式 由三个部分组成: 操作数、运算符、界限符 \color{red}操作数、运算符、界限符 操作数、运算符、界限符 ps:界限符是必不可少的,反映了计算的先后顺序 波兰表达式(让计算机更容易识别的算数表达式) Reverse Po…

初识React/JSX

JSX ​​​​​​​推荐使用小括号包裹jsx

《长安十二时辰(中亚,套装共2册)》马伯庸 (作者)电子书网盘下载

下载地址:点我内容简介唐天宝三年,元月十四日,长安。大唐皇都的居民不知道,上元节辉煌灯火亮起之时,等待他们的,将是场吞噬一切的劫难。突厥、狼卫、绑架、暗杀、烈焰、焚城,毁灭长安城的齿轮已…