当前位置: 首页 > news >正文

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

前言

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

去百度图片去抓取图片吧

打开百度图片网站,点击搜索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 requestsdef 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=0while(flag):print('第',request_count+1,'次下载中')# 获取urldownload_num=request_count*30url= 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=Falsereturn# 有数据就去下载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=0while(flag):print('第',request_count+1,'次下载中')# 获取urldownload_num=request_count*30url= 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=Falsereturn# 有数据就去下载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任何你喜欢的内容')

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Vue3】计算属性
  • Android Studio关于Gradle及JDK问题解决
  • 安装 VMware vSphere vCenter 8.0
  • leetcode简单题27 N.119 杨辉三角II rust描述
  • 【React】JSX基础
  • Debezium日常分享系列之:Debezium2.7版本PostgreSQL数据库连接器
  • 艺术成分很高的完全自定义的UITabBar(很简单)
  • org.springframework.context.ApplicationContext发送消息
  • filebeat把日志文件上传到Es中配置(ES7版本)
  • 喜讯丨泰迪智能科技实力中标湖北民族大学数学与统计学院一流专业实验室建设项目
  • js | Core
  • 代码随想录学习 day54 图论 Bellman_ford 算法精讲
  • Oracle线上执行SQL特别慢的原因分析
  • Spring Boot(八十一):Sa-Token快速实现API接口签名安全校验
  • 《JavaSE》---21.<简单认识Java的集合框架包装类泛型>
  • ES6指北【2】—— 箭头函数
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • Babel配置的不完全指南
  • C语言笔记(第一章:C语言编程)
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Js基础知识(一) - 变量
  • mongo索引构建
  • SQLServer之索引简介
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue脚手架vue-cli
  • - 概述 - 《设计模式(极简c++版)》
  • 搞机器学习要哪些技能
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 世界上最简单的无等待算法(getAndIncrement)
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 突破自己的技术思维
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 数据库巡检项
  • ​批处理文件中的errorlevel用法
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​学习一下,什么是预包装食品?​
  • ​业务双活的数据切换思路设计(下)
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #mysql 8.0 踩坑日记
  • #数据结构 笔记三
  • (35)远程识别(又称无人机识别)(二)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (九十四)函数和二维数组
  • (四)opengl函数加载和错误处理
  • (转)Linq学习笔记
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .Net Core 微服务之Consul(二)-集群搭建