最近尝试将百度的图片爬取下来,下面讲解下我的整个爬取思路的流程。首先打开百度图片首页,输入搜索图片的关键字,浏览器就展示给我们许多的指定图片。

我们知道,爬取图片的核心在于获取到对应图片的url。我一如往常般的打开网页源代码,F12审查元素来获取指定图片在源代码的位置。可是发现源代码里根本就找不到。

这个时候我就想到,这应该是通过js请求来获取到图片的。所以我下一个目标就是找到js请求的url及其所带的参数。为了方便省时,我并没有使用Fidder来分析,而是直接F12中的network中来查看。果不其然,成功找到了请求图片的url。如下图所示,随着你的鼠标向下滚动,js会不停请求,依此获得更多的图片。每个url请求的参数都可在Query String Parameters中查看。

通过观察我们可以发现以下几点:

  1. 每一次请求的url参数,几乎都一样,只有一个参数是不同的,那就是pn,他指的是当前页面中已经展示的图片数目。
  2. url参数的queryWord、word是搜索的关键字,对于不同关键字的搜索,这两个参数是不同的。
  3. url参数rn指的是每次获取图片的数量,可以发现,一次请求的返回图片数量是30.
  4. url的协议、ip、端口、目录成分为:https://image.baidu.com/search/acjson

得到每一次的请求,我们的下一个目标就是得到每一次请求返回的30个图片的url。所以我们需要对请求的响应进行分析。可以发现它是以json的数据返回的。返回的内容最外面是一对{},我们所要的信息在key为data中。data的值是一个大小为31的数组,其中最后一个元素是一个空字典。data的每一个元素又是一个字典,而我们需要的图片url就在key为thumbURL内。如下图所示:

获取到图片url,这时我们就可以请求获取图片了。即requests.get(url,headers=headers).content,再将得到的图片写进文件。这里要注意的是,图片请求的请求头中一定要携带User-Agent和Referer,否则会被返回403.

附带demo

import requests
import os
import urllibclass Spider_baidu_image():def __init__(self):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 = '刘亦菲壁纸'self.keyword = input("请输入搜索图片关键字:")self.paginator = int(input("请输入搜索页数,每页30张图片:"))# self.paginator = 50# print(type(self.keyword),self.paginator)# exit()def get_param(self):"""获取url请求的参数,存入列表并返回:return: """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&oe=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=&force=&cg=star&pn={}&rn=30&gsm=78&1557125391211='.format(keyword,keyword,30*i))return paramsdef get_urls(self,params):"""由url参数返回各个url拼接后的响应,存入列表并返回:return:"""urls = []for i in params:urls.append(self.url+i)return urlsdef 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_urldef 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+'\\{}.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(self.keyword,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 = Spider_baidu_image()spider()

爬取百度图片——详细思路相关推荐

  1. 详细分析如何利用python批量爬取百度图片

    这篇文章主要写的是利用python网络爬虫批量来爬取百度图片并保存到文件夹中. 首先我们打开百度图片这个网页:https://image.baidu.com/ 我们现在随便搜一个类型的图片,比如小狗, ...

  2. python3爬取百度图片

    python3爬取百度图片 最终目的:能通过输入关键字进行搜索,爬取相应的图片存储到本地或者数据库 首先打开百度图片的网站,搜索任意一个关键字,比如说:水果,得到如下的界面 分析: 1.百度图片搜索结 ...

  3. json返回的img图片被原样输出_爬取百度图片,并下载至本地

    爬取百度图片 一:本节目标 本次爬取的目标是百度图片,将图片下载到本地 二:准备工作 安装Scrapy.Python3 三:爬取思路 我们需要实现的是下载图片,所以需要获取图片的真实链接 四:爬取分析 ...

  4. HttpClient 爬取百度图片

    HttpClient 爬取百度图片 以前写的一篇爬取百度图片的博客是我第一次用Java接触爬虫的相关知识,当时使用的Java的原生类库,写的不是很好,特别是对于分页的处理(导致许多图片重复下载了)以及 ...

  5. Python 爬虫实例(1)—— 爬取百度图片

    爬取百度图片  在Python 2.7上运行 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author: loveNightimport json ...

  6. python爬取百度图片(用于深度学习中数据集的收集)

    6_python爬取百度图片(用于深度学习中数据集的收集)(6-20181225-) 参考: https://blog.csdn.net/guyuealian/article/details/7873 ...

  7. 如何使用python爬取百度图片_python实现爬取百度图片的方法示例

    本文实例讲述了python实现爬取百度图片的方法.分享给大家供大家参考,具体如下: import json import itertools import urllib import requests ...

  8. python爬去百度图片_python实现爬取百度图片的方法示例

    本文实例讲述了python实现爬取百度图片的方法.分享给大家供大家参考,具体如下: import json import itertools import urllib import requests ...

  9. python爬虫百度图片_python实现爬取百度图片的方法示例

    本文实例讲述了python实现爬取百度图片的方法.分享给大家供大家参考,具体如下: import json import itertools import urllib import requests ...

  10. Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片

    Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...

最新文章

  1. 读取手柄_中高端游戏手柄比选,北通宙斯才是游戏的最佳拍档
  2. 济南电子机械工程学校计算机专业班主任,济南电子机械工程学校庆祝2020年教师节暨表彰大会隆重举行...
  3. 使用Anemometer基于pt-query-digest将MySQL慢查询可视化
  4. MADDPG中环境怎么配置,multiagent包解决
  5. 神经网络与深度学习——TensorFlow2.0实战(笔记)(六)(Matplotlib绘图基础<折线图和柱状图>python)
  6. 【Day10】项目中如何处理安全问题
  7. PHP 编写和使用web服务 第一节
  8. 关于RTB实时竞价的基本原理
  9. Visual Studio 2012 更新包2发布,附离线安装方法及下载
  10. ModuleNotFoundError: No module named 'cv2' (安装cv2)
  11. 求 逆矩阵 公式推导
  12. android factorymode下回路测试无声音问题解析
  13. 一文看懂马尔科夫过程
  14. linux用命令行快速切换目录
  15. win32项目中使用 skia渲染的一个编译问题
  16. 用计算机用语说唯美的话,古风说说唯美句子
  17. 客厅智能化(5、6)
  18. 痴狂青年孙正义竟然按50年规划行事
  19. 标宋2号 仿宋3号 调整行间距
  20. 微软服务器数据降温,降温新招!微软要把数据中心建在海里

热门文章

  1. openGL 例子:创建一个二十面体
  2. 快速排序实验报告 c语言,快速排序算法的C语言实现
  3. 深圳禾正医院自控系统案例|能迪科技canlead中央空调净化系统
  4. theano java_theano安装问题(示例代码)
  5. cropper裁剪图片并上传
  6. 【数理逻辑四】谓词逻辑及形式系统 【中】
  7. 如何选择合适的地图注记手段
  8. 计算机软件卸载不了怎么办,有的软件卸载不干净,应该怎么办?
  9. 链表C语言和C++两种方式实现
  10. 远程桌面控制软件Teamviewer免费版安装