爬取百度图片,想爬谁就爬谁

news2024/11/13 12:45:36

前言

既然是做爬虫,那么肯定就会有一些小心思,比如去获取一些自己喜欢的资料等。

去百度图片去抓取图片吧

打开百度图片网站,点击搜索xxx,打开后,滚动滚动条,发现滚动条越来越小,说明图片加载是动态的,应该是通过ajax获取数据的,网站地址栏根本不是真正的图片地址。按F12打开开发者模式,我们边滚动边分析,发现下面的url才是真正获取图片地址的。

https://image.baidu.com/search/acjson?tn=resultjson_com&logid=xxxxxxx&ipn=rj&ct=201326592&is=&fp=result&fr=&word=你搜索的内容&queryWord=你搜索的内容&cl=&lm=&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=&copyright=&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=&expermode=&nojc=&isAsync=&pn=120&rn=30&gsm=78&1721292699879=

盲目分析分析,其中pn=120,这有可能就是page number,这里的pn rn 很有可能就是page_size row_num,然后再去试着修改pn值为0,30,60去试试,发现果然数据不同,得。实锤了…
下面是pn=30的数据

在这里插入图片描述
(太严格了,只能发图片了,不知道能不能通过)
通过分析可知,data中就是真正的图片数据,好了我们可以拿到url,拿到各种数据了。

用python去爬取数据

这要分几个步骤:

  • 我们是循环爬取数据的
  • 爬取数据后还得保存到文件夹中
  • 所以要引入os 以及 requests库

上代码

创建文件夹
# 需要用来创建文件夹
import os
# 在当前目录创建文件夹,咱就简单的弄吧,别搞复杂的
def mkdir_dir_at_curr_path(dir_name):
    try:
        os.mkdir(dir_name)
        print('文件夹:',dir_name,'创建成功')
    except FileExistsError:
        print('文件夹:',dir_name,'已经存在')

def get_headers():
    return {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36",
         "Access-Control-Allow-Credentials": "true",
         "Access-Control-Allow-Origin": "https://m.baidu.com, https://www.baidu.com, http://m.baidu.com,http://www.baidu.com",
         "Connection":"keep-alive",
         "Content-Encoding": "br",
         "Content-Type":"application/json"}
定义url以及headers

因为是循环爬取,所以url肯定是动态的,也就是改一下pn的值,查询的人物的名称,保证通用性。而且发现单纯的请求返回的数据不正常,这个时候我们就得加上headers了,这个没办法,百度肯定会有一些防御性的措施来防止爬虫捣乱。

# 需要发送请求
import requests

def get_headers():
    return {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36",
         "Access-Control-Allow-Credentials": "true",
         "Access-Control-Allow-Origin": "https://m.baidu.com, https://www.baidu.com, http://m.baidu.com,http://www.baidu.com",
         "Connection":"keep-alive",
         "Content-Encoding": "br",
         "Content-Type":"application/json"}
def get_url(search_name,page_size):
    url='https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8332766429333445053&ipn=rj&ct=201326592&is=&fp=result&fr=&word='+search_name+'&queryWord='+search_name+'&cl=2&lm=&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&expermode=&nojc=&isAsync=&pn='+str(page_size)+'&rn=30&gsm=3c&1721294093333='
    return url

下载的主体逻辑
# 定义函数去下载图片
def down_load_pics(search_name):
    # 创建文件夹
    mkdir_dir_at_curr_path(search_name)
    #是否继续循环去下载
    flag=True
    # 确定是第几次下载
    request_count=0
    while(flag):
        print('第',request_count+1,'次下载中')
        # 获取url
        download_num=request_count*30
        url= get_url(search_name,download_num)

        # 获取请求头
        headers=get_headers()
        #发送请求获得响应数据
        resp=requests.get(url,headers=headers)
        # 确定是json数据了
        jsonData=resp.json()
        if 'data' not in jsonData or jsonData['data']==[] or jsonData['data']==[{}]:
            print('已经全部下载完成')
            # 下载完了就要跳出循环
            flag=False
            return
        # 有数据就去下载
        for item in jsonData['data']:
            if 'thumbURL' in item and 'fromPageTitleEnc' in item and search_name in item['fromPageTitleEnc']:
                # 图片的真正地址
                sub_url=item['thumbURL']
                if sub_url.startswith('http'):
                    response=requests.get(sub_url)
                    # 文件夹中文件数量,用来计算下载图片名称
                    file_size= len(os.listdir(search_name))
                    # 下载后图片名称下标
                    pic_index=file_size+1
                    #图片名称
                    curr_file_name=search_name+'_'+str(pic_index)
                    # 将下载好的图片数据保存到文件夹中
                    with open(str(search_name+'/'+curr_file_name)+'.jpg','wb') as f:
                        f.write(response.content)
                    print('第',pic_index,'张图片下载完成')
        # 准备下一次循环
        request_count = request_count + 1

最后可以去测试一下了

测试
if __name__ == '__main__':
    down_load_pics('你搜索的内容')

真的是perfect!完全达到预期!在这里插入图片描述
现在是不是感觉自己很帅啊哈哈

下面附上完整的代码,朋友们记得点个赞哦~~

# 需要发送请求
import requests
# 需要用来创建文件夹
import os

# 定义函数去下载图片
def down_load_pics(search_name):
    # 创建文件夹
    mkdir_dir_at_curr_path(search_name)
    #是否继续循环去下载
    flag=True
    # 确定是第几次下载
    request_count=0
    while(flag):
        print('第',request_count+1,'次下载中')
        # 获取url
        download_num=request_count*30
        url= get_url(search_name,download_num)

        # 获取请求头
        headers=get_headers()
        #发送请求获得响应数据
        resp=requests.get(url,headers=headers)
        # 确定是json数据了
        jsonData=resp.json()
        if 'data' not in jsonData or jsonData['data']==[] or jsonData['data']==[{}]:
            print('已经全部下载完成')
            # 下载完了就要跳出循环
            flag=False
            return
        # 有数据就去下载
        for item in jsonData['data']:
            if 'thumbURL' in item and 'fromPageTitleEnc' in item and search_name in item['fromPageTitleEnc']:
                # 图片的真正地址
                sub_url=item['thumbURL']
                if sub_url.startswith('http'):
                    response=requests.get(sub_url)
                    # 文件夹中文件数量,用来计算下载图片名称
                    file_size= len(os.listdir(search_name))
                    # 下载后图片名称下标
                    pic_index=file_size+1
                    #图片名称
                    curr_file_name=search_name+'_'+str(pic_index)
                    # 将下载好的图片数据保存到文件夹中
                    with open(str(search_name+'/'+curr_file_name)+'.jpg','wb') as f:
                        f.write(response.content)
                    print('第',pic_index,'张图片下载完成')
        # 准备下一次循环
        request_count = request_count + 1
def get_headers():
    return {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36",
         "Access-Control-Allow-Credentials": "true",
         "Access-Control-Allow-Origin": "https://m.baidu.com, https://www.baidu.com, http://m.baidu.com,http://www.baidu.com",
         "Connection":"keep-alive",
         "Content-Encoding": "br",
         "Content-Type":"application/json"}
def get_url(search_name,page_size):
    url='https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8332766429333445053&ipn=rj&ct=201326592&is=&fp=result&fr=&word='+search_name+'&queryWord='+search_name+'&cl=2&lm=&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&expermode=&nojc=&isAsync=&pn='+str(page_size)+'&rn=30&gsm=3c&1721294093333='
    return url
# 在当前目录创建文件夹,咱就简单的弄吧,别搞复杂的
def mkdir_dir_at_curr_path(dir_name):
    try:
        os.mkdir(dir_name)
        print('文件夹:',dir_name,'创建成功')
    except FileExistsError:
        print('文件夹:',dir_name,'已经存在')

if __name__ == '__main__':
    down_load_pics('xxx任何你喜欢的内容')

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

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

相关文章

Wordpress文章分享到微信朋友圈不带图像问题的解决

目录 一、插件选择 二、插件安装 三、获取微信公众号管理信息 1、登录微信公众平台 2、配置“JS接口安全域名” 3、至安全中心设置“IP白名单” 4、获得“开发者ID(AppID)” 5、获得“开发者密码(AppSecret)” 四、配置插件 五、验证 WordPress装配好后,可…

10.11和10.8那个大(各种ai的回答)

问题:10.11和10.8两个数哪个大 腾讯混元 ✔️ chatGPT ❎ 通义千问 ❎ 文心一言 ✔️ 智谱清言 ❎ 讯飞星火 ✔️ C知道 ❎ 豆包 ✔️

matlab 声音信号希尔伯特黄变换

1、内容简介 略 91-可以交流、咨询、答疑 2、内容说明 略 Hilbert-Huang变换(HHT)是一种基于经验的数据分析方法 方法。它的扩展基础是自适应的,因此它可以从非线性和非平稳过程中产生具有物理意义的数据表示。这个 适应性的优势是有代价…

代码随想录第二天 | 数组 | 双指针法、滑动窗口、螺旋数组

来源 代码随想录数组第二天 有序数组的平方 数组其实是有序的, 只不过负数平方之后可能成为最大数了。 那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。 此时可以考虑双指针法了,i指向起始位置&…

matlab永磁同步电机反馈试验装置的设计和永磁同步电机仿真

1、内容简介 略 85-可以交流、咨询、答疑 2、内容说明 略 摘要:得益于电力电子器件及控制技术的高速发展,使得电机的应用越来越方便及精确,适应了实际应用对电机性能及质量提出的更高要求和标准。同时电机测试技术也因为电力电子技术的发…

c++ primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作

c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作 c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作 文章目录 c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作16.3.3 对矢量可执行的其他操作…

Idea中git如何进行回退操作

当你的代码已经提交并且推送到远程仓库了如何进行回退 1.首先找到你需要回退到的提交记录 假设你要回退到当前大营销模板位置,右键当前分支然后选中rest 点击后,若需要保留之前提交记录到本地则可以选择max或者soft 选择后进行回退操作,最后将…

全代码 | 随机森林在回归分析中的经典应用

公众号后台记录了发表过文章的各项阅读指标包括:内容标题,总阅读人数,总阅读次数,总分享人数,总分享次数,阅读后关注人数,送达阅读率,分享产生阅读次数,首次分享率&#…

《低代码指南》——Oracle APEX : AI在低代码开发中的创新应用

在低代码开发领域,我们正在目睹人工智能(AI)集成所带来的显著进展。Oracle公司最新推出的APEX 24.1版本,便是这一趋势的明显体现,其集成的AI功能旨在极大提高开发者的生产力,同时简化应用程序的创建过程。 Contents 将变革性的AI整合到低代码平台 将AI技术引入低代码平台…

UniMERNet - 数学公式识别转LaTeX

文章目录 一、关于 UniMERNet演示视频 二、快速入门1、克隆repo并下载模型2、安装3、运行UniMERNet 四、评估1、下载UniMER-Test数据集2、运行评估代码3、与SOTA方法的性能比较(BLEU)4、不同方法的可视化结果 五、UniMER数据集1、导言2、数据集下载 六、…

【Linux 13】文件系统

文章目录 🌈 一、前言🌈 二、文件操作的系统接口⭐ 1. 打开文件 open⭐ 2. 关闭文件 close⭐ 3. 写入文件 write⭐ 4. 读取文件 read 🌈 三、文件描述符⭐ 1. 文件描述符介绍⭐ 2. 提前被分配的文件描述符 0 1 2⭐ 3. 文件描述符的分配规则 &…

【Qt】Qt的坐标转换(mapToGlobal)

1、QPoint QWidget::mapToGlobal(const QPoint &pos) const 将小部件坐标转换为全局坐标。mapToGlobal(QPoint(0,0))可以得到小部件左上角像素的全局坐标。2、QPoint QWidget::mapToParent(const QPoint &pos) const 将小部件坐标转换为父部件坐标。如果小部件没有父部…

Linux内存的概念及管理

1、内存概念 内存是指计算机中所安装的随机存取内存的容量,储存是指计算机内硬盘的容量。硬盘应当是计算机的“外存”。内存应当是在主板上的一些存储器,用来保存CPU运算使用过程中的中间数据和计算结果,当不用这些数据时,它们被保…

鸿蒙仓颉语言【Redis仓颉语言客户端】

特性 支持RESP2和RESP3协议接口设计兼容jedis接口语义丰富的管理命令支持支持单连接多线程模式支持发布订阅模式支持哨兵模式和集群模式完备的单元测试覆盖架构简洁,易于扩展 开发计划 2024.3.22 完成支持单机模式的RESP2和RESP3协议的客户端,提供Bet…

实际生活中网段不通的典型分析及处理方案

关于端口: 应用层: FTP TELNET SMTP DNS TFTP SNMP 端口号: 21 23 25 53 69 161 传输层: TCP UDP(DNS两个都占…

7月21日,贪心练习

大家好呀,今天带来一些贪心算法的应用解题、 一,柠檬水找零 . - 力扣(LeetCode) 解析: 本题的贪心体现在对于20美元的处理上,我们总是优先把功能较少的10元作为找零,这样可以让5元用处更大 …

野兔在线工具箱系统全新升级改版,基于TP8和yetuadmin后台实现

野兔在线工具箱系统全新升级改版,基于TP8和yetuadmin后台实现 系统名称:野兔在线工具系统 系统语言:支持多语言,大概有20种 系统源码:不加密,开源 系统开发:PHPMySQL (基于thinkphp8&#x…

重发布路由策略实验

实验要求 1.搭建拓扑 路由策略分析: 拓扑左边是rip协议,右边是ospf协议,想要实现全网可达可以采用多点双向重发布的方式。 对于rip协议使用偏移列表来干涉选路,对于ospf协议采用路由策略来干涉选路 2.配置ip r1 [AR1]interfac…

【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理

初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油!时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索…

什么是机器学习以及机器学习如今的社会现状!!

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…