爬取百度图片

一:本节目标

本次爬取的目标是百度图片,将图片下载到本地

二:准备工作

安装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=&copyright=&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图片被原样输出_爬取百度图片,并下载至本地相关推荐

  1. python如何爬取图片_百度图片爬虫-python版-如何爬取百度图片?

    上一篇我写了如何爬取百度网盘的爬虫,在这里还是重温一下,把链接附上: http://5912119.blog.51cto.com/5902119/1771391 这一篇我想写写如何爬取百度图片的爬虫, ...

  2. python爬取百度迁徙动态图_爬取动态图片—以百度图片为例

    一:何谓动态加载图片 所谓动态加载图片即指html刚加载时,图片时没有的,然后通过json发生有关图片的数据,在插入到html里面去,以到底快速打开网页的目的,那么问题来了?我们如何找到加载文件的js ...

  3. HttpClient 爬取百度图片

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

  4. 【Python】爬虫入门6:爬取百度图片搜索结果(基于关键字爬图)

    源代码 #!/usr/bin/env python # -*- coding: UTF-8 -*-# 需求:爬取百度图片# noinspection PyUnresolvedReferences im ...

  5. Java爬取百度图片人脸识别下载高颜值小姐姐图片

    前言: 最近想下载一些比较好看的妹子图片,但又不想去网上一张张的看,于是就想通过爬取图片进行人脸识别下载. 1.首先:在爬取图片时,通过Java请求时会遇到百度安全认证机制,在这里可以模拟浏览器的请求 ...

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

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

  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. python3爬取百度图片

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

最新文章

  1. Go进阶(3): 函数+闭包+defer
  2. 读书笔记_代码大全2第七章_高质量的子程序
  3. 初识图机器学习(part5)--图表示学习2.0
  4. SAP Fiori 应用里图标(Icon)的渲染原理和使用技巧
  5. see rebel case 无法越狱_周星驰为什么不拍喜剧,王晶:年纪大了,无法面对自己...
  6. 第三届类型文学研讨会小记(转)
  7. [2020多校A层11.22]party(概率期望/近似)
  8. Unity客户端开发优化要点
  9. JVM001_类文件结构
  10. OC开发_Storyboard——绘制和视图
  11. 虚拟linux系统首次登入,第一次在虚拟机启动我们的Linux系统
  12. DataGridView 控件中DataBind( )方法不能使用的情况的解决方案
  13. mysql安装包及安装教程(附网盘地址)
  14. 学计算机高中应选什么科目,新高考选哪些科目可以报计算机?高中生如何进步?...
  15. Android 获取照相机图片或本地图片
  16. 【Python】实现一个小说下载器,可以打包成exe(附原码)
  17. 人生, 不求活得完美,但求活得实在
  18. Smartbi如何解决传统报表工具制作的问题
  19. 九宫怎么排列和使用_九宫格排列与浏览的简单功能
  20. [UE4]如何下载并编译UE4源码

热门文章

  1. 知行动手实验室可以用来做什么?
  2. 台式计算机技术参数响应表,联想台式电脑配置推荐及参数详情【图文】
  3. 两种语言“争霸赛”,PHP速度领先C#
  4. 中国互联网大会首届智能网联论坛举行 数字技术驱动交通出行行业创新发展
  5. 涉及上千款,2021 Chrome插件性能影响分析报告新鲜出炉
  6. 面试官:Object o = new Object() 占用了多少字节?
  7. TCP 半连接队列和全连接队列满了,怎么破?
  8. GitHub 热点速览:刷 LeetCode 的正确姿势!
  9. 微软 CEO 萨提亚·纳德拉:不要重复造轮子,提升技术强密度
  10. ​为什么你应该申请去小型的初创公司实习?