json返回的img图片被原样输出_爬取百度图片,并下载至本地
爬取百度图片
一:本节目标
本次爬取的目标是百度图片,将图片下载到本地
二:准备工作
安装Scrapy、Python3
三:爬取思路
我们需要实现的是下载图片,所以需要获取图片的真实链接
四:爬取分析
我们选取爬取的站点是:http://image.baidu.com/。打开链接,是百度图片搜索的界面,输入搜索关键词,跳转到需要下载图片界面。
打开开发者工具,切换到XHR过滤器,下拉图形条,即可看到下方会出现很多Ajax请求,这些请求就是获取图片链接的Ajax请求,如下图所示。
我们打开第一个Ajax请求,它的链接为:https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E8%AF%81%E4%BB%B6%E7%85%A7&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E8%AF%81%E4%BB%B6%E7%85%A7&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn=30&rn=30&gsm=1e&1557471667356=,详情如下图所示。
请求是GET类型,返回结果是JSON格式,我们将其展开后可看到图片的基本星系。接下来我们只需要构造这个请求的参数。此链接有很多参数,如下图所示:
其中最主要的参数是:queryWord,word,1557471667356,pn。前两个参数是搜索关键词,第三个是时间戳参数,最后一个是和分页有关的参数。
五:新建项目
接下来我们用Scrapy来实现这个抓取过程。首先创建一个项目,命令如下所示
Scrapy startproject baiduspider
进入项目中,新建一个Spider,名为baidu,命令如下所示:
scrapy genspider baidu http://img.baidu.com
我们首先修改Spider,配置各个Ajax的URL,实现start_requests()方法,然后用parse_html()进行解析,如下所示
class BaiduSpider(scrapy.Spider):
name = 'baidu'
allowed_domains = ['img.baidu.com']
start_urls = ['http://img.baidu.com/']
def start_requests(self):
base_url='http://image.baidu.com/search/acjson?'
for page in range(30,1200,30):
timestamp = int(round(time.time() * 1000))
data={
'tn': 'resultjson_com',
'ipn': 'rj',
'ct': '201326592',
'is':None,
'fp': 'result',
'queryWord': '证件照',
'cl': '2',
'lm': '-1',
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid':None,
'st': '-1',
'z':None,
'ic': '0',
'hd': '0',
'latest': '0',
'copyright':'0',
'word': '证件照',
's':None,
'se':None,
'tab':None,
'width':None,
'height':None,
'face': '0',
'istype': '2',
'qc':None,
'nc': '1',
'fr':None,
'expermode':None,
'force':None,
'pn': page,
'rn': '30',
'gsm': '1e',
'%s'%(timestamp):None
}
url=base_url+urlencode(data)
yield scrapy.Request(url=url, callback=self.parse_html)
def parse_html(self, response):
item=BaiduspiderItem()
html=json.loads(response.text)
if html:
results=html['data']
for result in results:
try:
item['img_url']=result['objURL']
yield item
except:
pass
六:创建Item
接下来我们解析图片url,如下所示
class BaiduspiderItem(scrapy.Item):
img_url=scrapy.Field()
七:下载图片
item['img_url']来源于Json中的objURL,objURL是加密的图片url链接,需要解密才可以获得图片的真实链接,直接放代码
import requests
import os
import uuid
path=r'半身美女'
class BaiduspiderPipeline(object):
def process_item(self, item, spider):
str_table = {
'_z2C$q': ':',
'_z&e3B': '.',
'AzdH3F': '/'
}
char_table = {
'w': 'a',
'k': 'b',
'v': 'c',
'1': 'd',
'j': 'e',
'u': 'f',
'2': 'g',
'i': 'h',
't': 'i',
'3': 'j',
'h': 'k',
's': 'l',
'4': 'm',
'g': 'n',
'5': 'o',
'r': 'p',
'q': 'q',
'6': 'r',
'f': 's',
'p': 't',
'7': 'u',
'e': 'v',
'o': 'w',
'8': '1',
'd': '2',
'n': '3',
'9': '4',
'c': '5',
'm': '6',
'0': '7',
'b': '8',
'l': '9',
'a': '0'
}
char_table = {ord(key): ord(value) for key, value in char_table.items()}
for key, value in str_table.items():
item['img_url'] = item['img_url'].replace(key, value)
item['img_url'] = item['img_url'].translate(char_table)
try:
if item['img_url'].startswith('http'):
response=requests.get(item['img_url'],timeout=3)
if response.status_code==200:
with open(os.path.join(path, str(uuid.uuid1()).replace('-', '_') + '.jpg'), 'wb') as f:
f.write(response.content)
return None
return None
except ConnectionError:
return None
八:运行
到此位置,整个百度图片的实现完毕了。沃恩运行如下命令启动爬虫
scrapy crawl baidu
九:结果
json返回的img图片被原样输出_爬取百度图片,并下载至本地相关推荐
- python如何爬取图片_百度图片爬虫-python版-如何爬取百度图片?
上一篇我写了如何爬取百度网盘的爬虫,在这里还是重温一下,把链接附上: http://5912119.blog.51cto.com/5902119/1771391 这一篇我想写写如何爬取百度图片的爬虫, ...
- python爬取百度迁徙动态图_爬取动态图片—以百度图片为例
一:何谓动态加载图片 所谓动态加载图片即指html刚加载时,图片时没有的,然后通过json发生有关图片的数据,在插入到html里面去,以到底快速打开网页的目的,那么问题来了?我们如何找到加载文件的js ...
- HttpClient 爬取百度图片
HttpClient 爬取百度图片 以前写的一篇爬取百度图片的博客是我第一次用Java接触爬虫的相关知识,当时使用的Java的原生类库,写的不是很好,特别是对于分页的处理(导致许多图片重复下载了)以及 ...
- 【Python】爬虫入门6:爬取百度图片搜索结果(基于关键字爬图)
源代码 #!/usr/bin/env python # -*- coding: UTF-8 -*-# 需求:爬取百度图片# noinspection PyUnresolvedReferences im ...
- Java爬取百度图片人脸识别下载高颜值小姐姐图片
前言: 最近想下载一些比较好看的妹子图片,但又不想去网上一张张的看,于是就想通过爬取图片进行人脸识别下载. 1.首先:在爬取图片时,通过Java请求时会遇到百度安全认证机制,在这里可以模拟浏览器的请求 ...
- Python 爬虫实例(1)—— 爬取百度图片
爬取百度图片 在Python 2.7上运行 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author: loveNightimport json ...
- 如何使用python爬取百度图片_python实现爬取百度图片的方法示例
本文实例讲述了python实现爬取百度图片的方法.分享给大家供大家参考,具体如下: import json import itertools import urllib import requests ...
- python爬去百度图片_python实现爬取百度图片的方法示例
本文实例讲述了python实现爬取百度图片的方法.分享给大家供大家参考,具体如下: import json import itertools import urllib import requests ...
- python3爬取百度图片
python3爬取百度图片 最终目的:能通过输入关键字进行搜索,爬取相应的图片存储到本地或者数据库 首先打开百度图片的网站,搜索任意一个关键字,比如说:水果,得到如下的界面 分析: 1.百度图片搜索结 ...
最新文章
- Go进阶(3): 函数+闭包+defer
- 读书笔记_代码大全2第七章_高质量的子程序
- 初识图机器学习(part5)--图表示学习2.0
- SAP Fiori 应用里图标(Icon)的渲染原理和使用技巧
- see rebel case 无法越狱_周星驰为什么不拍喜剧,王晶:年纪大了,无法面对自己...
- 第三届类型文学研讨会小记(转)
- [2020多校A层11.22]party(概率期望/近似)
- Unity客户端开发优化要点
- JVM001_类文件结构
- OC开发_Storyboard——绘制和视图
- 虚拟linux系统首次登入,第一次在虚拟机启动我们的Linux系统
- DataGridView 控件中DataBind( )方法不能使用的情况的解决方案
- mysql安装包及安装教程(附网盘地址)
- 学计算机高中应选什么科目,新高考选哪些科目可以报计算机?高中生如何进步?...
- Android 获取照相机图片或本地图片
- 【Python】实现一个小说下载器,可以打包成exe(附原码)
- 人生, 不求活得完美,但求活得实在
- Smartbi如何解决传统报表工具制作的问题
- 九宫怎么排列和使用_九宫格排列与浏览的简单功能
- [UE4]如何下载并编译UE4源码
热门文章
- 知行动手实验室可以用来做什么?
- 台式计算机技术参数响应表,联想台式电脑配置推荐及参数详情【图文】
- 两种语言“争霸赛”,PHP速度领先C#
- 中国互联网大会首届智能网联论坛举行 数字技术驱动交通出行行业创新发展
- 涉及上千款,2021 Chrome插件性能影响分析报告新鲜出炉
- 面试官:Object o = new Object() 占用了多少字节?
- TCP 半连接队列和全连接队列满了,怎么破?
- GitHub 热点速览:刷 LeetCode 的正确姿势!
- 微软 CEO 萨提亚·纳德拉:不要重复造轮子,提升技术强密度
- ​为什么你应该申请去小型的初创公司实习?