进入百度图片,搜索关键字

比如搜索关键词“赵丽颖”——打开调制模式(F12)

众所周知,一般图片的url以json列表方式进行输出,所以我们直接去

XHR模块去查找json列表。(刚刷新时没有数据出现,这时我们只需要滚动

滚轮即可获得数据更新)如下图:

打开右方acjson连接进入预览,我们可以发现列表已经出现,这个json

的网址也很于一四,经过反复测试,发现规律如下:

https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E8%B5%B5%E4%B8%BD%E9%A2%96+%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word=%E8%B5%B5%E4%B8%BD%E9%A2%96+%E5%9B%BE%E7%89%87&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&cg=star&pn=30&rn=30&gsm=1e&1598868283333=
》》》》%%%%%%%%%%%%%%%%%%%%%%%》》》》

https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&word=赵丽颖+图片&pn=

对原网址进行删减,网址就变成如上所示,其中pn即pagenumber,其取值

规律为30*n(n=1,2,3,4,),word为关键词,可以有多个关键词,以“+”

连接。 此处over

接下来随便点开其中一个json内容,看看里面都有些什么元素:

我们发现,里面有各种url,其实从这些url的命名,我们大概也能猜到这

些url是什么东西了,比如hoverurl,,,hover是翱翔的意思,也就是显

示在最上面的图片,就是第一幅图里面那样,很多缩略版的图片聚集在

一个页面上的样式,而fromurl是此图片的来源。对于hoverurl没啥可说

的,没有经过加密,直接拿来就可以用。而fromurl经过加密(反正下载

fromurl又不用占你们百度的服务器,为啥加密呢)。接下来就对此解

密。

解密fromurl

fromurl的内容格式为:“ippr_z2C$qAzdH3FAzdH3Fooo_z&e3B33da_z&e3Bv54AzdH3F4xAzdH3F1ws7AzdH3Fg7AzdH3Fziw5stytg2AzdH3Fd9bbd_m_z&e3Bip4s”

这是一个网址加密而成,我们需要做的就是对其进行解密,这时我们需

要进入js里面进行断点调试之类。首先呢,我们需要的是随便点开一个

图片,这时图片的url就不再是hoverurl了,已经是由fromurl经过一系列

转换而成。

我们打开调试模式,在img里悬着一张图片(选择与其他图片url格式相

似的图片),查看其发起请求的过程


我们看到,第一张hover图片的url获取发起程序链为:search>base_a66ce51.js>url

fromurl则为 search > detailbase_c8da527.js。如此我们直接去detailbase_c8da527.js干活吧。

进入此js文件,我们crtl + F寻找fromURL字样,经过分析发现,81处fromURL只有一处是对其进

行赋值编码解码,其他的地方都为引用。

而解码函数即为uncompileurl,继续查找此函数,发现此函数代码如下:uncompileURL: function(t) { return /^(http|https)/.test(t) ? t : this.uncompile(t) }
其实这里test函数在js里面代表匹配,这一行意思是如果t中含有http或https,就执行

this.uncompile。既然网址,如果不为空,肯定含有,那我们就去找this.uncompile。

uncompile: function(e) {
if (!e)
return “”;
var i = e.replace(r, function(n, r) {
return t[r]
});
return i.replace(n, function(n, r) {
return t[r]
})
}`c

,这一看就知道是对我们fromurl那一串看不懂的东西进行编解码。

此函数,先执行i-r替换,然后对i-n替换,这些替换模式名字为r,n,一般在此函数上方,往上查

var t = {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",_z2C$q: ":","_z&e3B": ".",AzdH3F: "/"}, n = /([a-w\d])/g, r = /(_z2C\$q|_z&e3B|AzdH3F)/g;

好了,先i-r替换,即先把网址中的/与.与:弄出来,他们都是字符串,如果先i-n就把他们改变了

就替换不成了。(在python的re中$代表匹配字符串结尾,所以需要对其转

义,"_z2C$q">"_z2C$q")。好了,大致就是这样,接下来附上scrapy项目爬取过程全部文件。

spider:

import scrapy
from baidu_pic.items import BaiduPicItem
import json
import re
t = {'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",'_z2C$q': ":","_z&e3B": ".",'AzdH3F': "/"}
k = list(t.keys())
class PicUrlSpider(scrapy.Spider):name = 'pic_url'allowed_domains = ['image.baidu.com']# start_urls = ['https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&word=赵丽颖+图片&pn=30']def start_requests(self):#构建starturl——list,就是那个json每30一页for i in range(1,101):num = 30 * iurl = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&word=赵丽颖+图片&pn=%s"%numyield scrapy.Request(url, callback=self.parse)def parse(self, response):item = BaiduPicItem()res = json.loads(response.text)['data']for data in res:item['pic_url'] = data['middleURL']#这里就是hoverurlurl = data["objURL"]url=re.sub('AzdH3F','/',url)url=re.sub("_z&e3B", ".", url)url=re.sub('_z2C\$q',":", url)res = []for i in url:if i in k:i = t[i]res.append(i)url=''.join(res)item['big_url'] = url#这里是fromurlyield item

item

class BaiduPicItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()pic_url = scrapy.Field()big_url = scrapy.Field()pass

pipeline

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
import scrapy#一定要记得,本次我使用了scrapy自带的图片下载中间件,需要用的scrapy.Requests
from scrapy.pipelines.images import ImagesPipeline#导入scrapy自带的图片下载中间件
import mysql.connector#把url写入数据库
# 图片下载
class ImgspiderPipeline(ImagesPipeline):#这里就是新建的一个类,继承scrapy自带的图片下载中间件,里面自定义一个图片下载函数def get_media_requests(self, item, info):yield scrapy.Request(item['big_url'],meta={'item':item})#如果url为列表,就需要循环,但我们的item都是单一url
config={'host':'localhost','port':'3306','database':'baidupic','user':'root',"password":'XXXXXXXXXXXX','charset': 'utf8','use_unicode': True,'get_warnings': True}
# url存入数据库
class BaiduPicPipeline:def __init__(self):self.conn = mysql.connector.Connect(**config)self.cur = self.conn.cursor()# 初始化数据库的连接def open_spider(self, spider):self.cur.execute("drop table if exists 赵丽颖;")sql = "create table 赵丽颖(id int primary key not null auto_increment,pic_url mediumtext,big_url mediumtext);"self.cur.execute(sql)#创建表def process_item(self, item, spider):sql = "insert into 赵丽颖(pic_url,big_url) values('%s','%s');"%(item['pic_url'],item['big_url'])self.cur.execute(sql)self.conn.commit()print(item['pic_url'])return item
#写入数据库def close_spider(self, spider):self.cur.close()self.conn.close()#关闭数据库

setings

BOT_NAME = 'baidu_pic'SPIDER_MODULES = ['baidu_pic.spiders']
NEWSPIDER_MODULE = 'baidu_pic.spiders'# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'baidu_pic (+http://www.yourdomain.com)'
USER_AGENT =  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36 Edg/85.0.564.41"
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
RETRY_ENABLED = True
RETRY_TIMES = 2
DOWNLOADER_MIDDLEWARES = {'baidu_pic.middlewares.BaiduPicDownloaderMiddleware': 543,
}# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {#    'scrapy.extensions.telnet.TelnetConsole': None,
#}# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
IMAGES_STORE = 'E:\ImageSpider'#此地很重要,设置默认下载图片目录
ITEM_PIPELINES = {'baidu_pic.pipelines.BaiduPicPipeline': 300,'baidu_pic.pipelines.ImgspiderPipeline':1
}#把pipeline中的图片下载pipeline与url存入mysqlpipeline

百度图片api获取(包含获取原网址)相关推荐

  1. 【百度地图API】自行获取区域经纬度的工具

    原文:[百度地图API]自行获取区域经纬度的工具 摘要:上一章教大家如何建立自己的行政区域地图.这次为大家提供一个,可视化选择区域,并且能自动生成经纬度代码的工具.工具的源代码完全公开,并且做了详尽的 ...

  2. 【百度地图API】如何获取行政区域的边界?

    [百度地图API]如何获取行政区域的边界? 摘要:以前教过大家如何自行获取行政区域,或者自定义获取一个区域的边界值.今天来教大家直接调用百度地图API1.3(目前最新版本)来获取行政区域的边界值. - ...

  3. 百度地图API调用实现获取经纬度以及标注

    一.申请AK 百度搜索百度地图API,进入官网文档,按照官网文档提示注册百度账号并申请AK.申请AK 填写相关信息,应用名称随意.应用类型根据协议来选择. 二.编写代码 根据官网的代码(入门引用和获取 ...

  4. 【百度地图api】之获取当前用户地理位置-浏览器定位

    1.通过html5 获取当前gps坐标,不过这种一般PC网页很多都不适用,一般用作手机网页 HTML5 Geolocation API (地理位置应用程序接口) 目前PC浏览器支持情况: Firefo ...

  5. java调用百度地图api简单示例--获取国内任意两地之间距离

    老师让我们从百度地图的api上获取数据源最为两地运输距离,结果百度地图api的开发文档居然连个示例都没有...于是上网找了半天,都是一百多行的源码,我就想用个api,你给我这玩意???终于最后还是找到 ...

  6. springboot8==调用百度地图API从浏览器获取经纬度,后端使用geodesy依赖计算配送距离

    见百度地图API调用文档 jspopularGL | 百度地图API SDK ================ <!--引入百度地图API用于从浏览器获取当前经纬度--> <scri ...

  7. 【百度地图API】如何获取行政区域的边界? (转载)

    摘要:以前教过大家如何自行获取行政区域,或者自定义获取一个区域的边界值.今天来教大家直接调用百度地图API1.3(目前最新版本)来获取行政区域的边界值. ----------------------- ...

  8. 【百度地图API】如何获取行政区域的边界?(转载)

    转自:http://www.cnblogs.com/milkmap/archive/2012/04/11/2442430.html 摘要:以前教过大家如何自行获取行政区域,或者自定义获取一个区域的边界 ...

  9. 奥维查看行政边界_【百度地图API】如何获取行政区域的边界? (转载)

    摘要:以前教过大家如何自行获取行政区域,或者自定义获取一个区域的边界值.今天来教大家直接调用百度地图API1.3(目前最新版本)来获取行政区域的边界值. ----------------------- ...

  10. java调用百度地图API根据地理位置获取经纬度

    前言: 自己申请一个百度地图得账号,然后创建自己需要服务拿到Ak 下载地址:登录百度帐号 https://lbsyun.baidu.com/apiconsole/key 1.第一步:申请账号,这一步大 ...

最新文章

  1. 重磅!亚马逊将在2019年全面弃用Oracle数据库
  2. c语言visit函数指针,C++中的函数指针总结
  3. wxWidgets随笔(11)-wxFrame类
  4. 2020年末总结,脚踏实地,一步一个脚印——致敬自己一年的心酸历程
  5. Sharepoin学习笔记—架构系列--03 Sharepoint的处理(Process)与执行模型(Trust Model) 2
  6. linux查看内核版本信息
  7. 《C++ Primer 4th》读书笔记 第7章-函数
  8. 金昌搜索引擎优化网络推广_网络推广优化企业服务
  9. 基于matlab 的图像重建,基于Matlab的2D-FFT图像重建软件的设计
  10. license是什么_云数据库时代,AWS凭什么执牛耳?
  11. Struts第八篇【资源国际化、对比JSP的资源国际化】
  12. 转:阿里负责人揭秘面试潜规则
  13. WKWebView详解
  14. Svn 中文语言包安装
  15. 准确生成电信、联通、移动IP地址段
  16. 163个人邮箱注册申请流程,公司邮箱怎么注册?
  17. vue3 + js-cookie加密解密(普通版本/TS版本)
  18. 怎么卸载计算机自带游戏,电脑自带游戏怎么删除
  19. centos 编译安装cmake和常见过程错误解决办法(linux系统均适用,以爬坑。。)
  20. 专题2(附篇):平面问题的差分解之差分公式的推导

热门文章

  1. 安卓逆向_2 --- Androidkiller,apktool、dex2jar、jd-gui、jadx反编译工具 的 安装、设置及使用教程
  2. ITween插件学习记录
  3. 软件测试师的工作流程是什么?
  4. python实现批量下载视频_python批量下载抖音视频
  5. HUAWEI内网最新发布了一份452页网络协议手册,GitHub一夜霸榜
  6. NI-VISA监听收发命令 同步或异步读写 示例C和C#源码National Instruments程控电源操作步骤安捷伦
  7. mac linux 引导分区,Paragon ExtFS For Mac v10.0.829 | Linux分区数据读写驱动 _ 黑苹果乐园...
  8. [11]ESP32+三轴磁罗盘HMC5883L移植与调试
  9. 电脑编辑安卓分区_20分钟轻松解决安卓手机分区问题 干货篇
  10. MLA格式应该如何正确引用?