爬取百度图片——详细思路
最近尝试将百度的图片爬取下来,下面讲解下我的整个爬取思路的流程。首先打开百度图片首页,输入搜索图片的关键字,浏览器就展示给我们许多的指定图片。
我们知道,爬取图片的核心在于获取到对应图片的url。我一如往常般的打开网页源代码,F12审查元素来获取指定图片在源代码的位置。可是发现源代码里根本就找不到。
这个时候我就想到,这应该是通过js请求来获取到图片的。所以我下一个目标就是找到js请求的url及其所带的参数。为了方便省时,我并没有使用Fidder来分析,而是直接F12中的network中来查看。果不其然,成功找到了请求图片的url。如下图所示,随着你的鼠标向下滚动,js会不停请求,依此获得更多的图片。每个url请求的参数都可在Query String Parameters中查看。
通过观察我们可以发现以下几点:
- 每一次请求的url参数,几乎都一样,只有一个参数是不同的,那就是pn,他指的是当前页面中已经展示的图片数目。
- url参数的queryWord、word是搜索的关键字,对于不同关键字的搜索,这两个参数是不同的。
- url参数rn指的是每次获取图片的数量,可以发现,一次请求的返回图片数量是30.
- 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©right=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©right=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()
爬取百度图片——详细思路相关推荐
- 详细分析如何利用python批量爬取百度图片
这篇文章主要写的是利用python网络爬虫批量来爬取百度图片并保存到文件夹中. 首先我们打开百度图片这个网页:https://image.baidu.com/ 我们现在随便搜一个类型的图片,比如小狗, ...
- python3爬取百度图片
python3爬取百度图片 最终目的:能通过输入关键字进行搜索,爬取相应的图片存储到本地或者数据库 首先打开百度图片的网站,搜索任意一个关键字,比如说:水果,得到如下的界面 分析: 1.百度图片搜索结 ...
- json返回的img图片被原样输出_爬取百度图片,并下载至本地
爬取百度图片 一:本节目标 本次爬取的目标是百度图片,将图片下载到本地 二:准备工作 安装Scrapy.Python3 三:爬取思路 我们需要实现的是下载图片,所以需要获取图片的真实链接 四:爬取分析 ...
- HttpClient 爬取百度图片
HttpClient 爬取百度图片 以前写的一篇爬取百度图片的博客是我第一次用Java接触爬虫的相关知识,当时使用的Java的原生类库,写的不是很好,特别是对于分页的处理(导致许多图片重复下载了)以及 ...
- Python 爬虫实例(1)—— 爬取百度图片
爬取百度图片 在Python 2.7上运行 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author: loveNightimport json ...
- python爬取百度图片(用于深度学习中数据集的收集)
6_python爬取百度图片(用于深度学习中数据集的收集)(6-20181225-) 参考: https://blog.csdn.net/guyuealian/article/details/7873 ...
- 如何使用python爬取百度图片_python实现爬取百度图片的方法示例
本文实例讲述了python实现爬取百度图片的方法.分享给大家供大家参考,具体如下: import json import itertools import urllib import requests ...
- python爬去百度图片_python实现爬取百度图片的方法示例
本文实例讲述了python实现爬取百度图片的方法.分享给大家供大家参考,具体如下: import json import itertools import urllib import requests ...
- python爬虫百度图片_python实现爬取百度图片的方法示例
本文实例讲述了python实现爬取百度图片的方法.分享给大家供大家参考,具体如下: import json import itertools import urllib import requests ...
- Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片
Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...
最新文章
- 读取手柄_中高端游戏手柄比选,北通宙斯才是游戏的最佳拍档
- 济南电子机械工程学校计算机专业班主任,济南电子机械工程学校庆祝2020年教师节暨表彰大会隆重举行...
- 使用Anemometer基于pt-query-digest将MySQL慢查询可视化
- MADDPG中环境怎么配置,multiagent包解决
- 神经网络与深度学习——TensorFlow2.0实战(笔记)(六)(Matplotlib绘图基础<折线图和柱状图>python)
- 【Day10】项目中如何处理安全问题
- PHP 编写和使用web服务 第一节
- 关于RTB实时竞价的基本原理
- Visual Studio 2012 更新包2发布,附离线安装方法及下载
- ModuleNotFoundError: No module named 'cv2' (安装cv2)
- 求 逆矩阵 公式推导
- android factorymode下回路测试无声音问题解析
- 一文看懂马尔科夫过程
- linux用命令行快速切换目录
- win32项目中使用 skia渲染的一个编译问题
- 用计算机用语说唯美的话,古风说说唯美句子
- 客厅智能化(5、6)
- 痴狂青年孙正义竟然按50年规划行事
- 标宋2号 仿宋3号 调整行间距
- 微软服务器数据降温,降温新招!微软要把数据中心建在海里