Ajax 是一种用于创建快速动态网页的技术, 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

Ajax用一句话来说就是不需要刷整个新页面即可从服务器取得数据(局部刷新)

今天通过在百度图片中输入汽车,然后爬取搜索到的图片,并保存到本地目录来认识Ajax。

1. 分析百度图片网站

  • 找到真正的请求地址url

在百度图片上输入**“汽车”**后,右键检查,选择Network中的XHR,然后将网页向下拉,观察发现地址栏的网址并没有发生变化,而图片在增加。 在抓包工具的显示下可以看到有相应的ajax请求增加,点击其中一个文件可以看到详细的信息,请求返回的数据格式是json格式。

​ 比如第一个的请求网址为:https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=汽车&cl=2&lm=&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&word=汽车&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&pn=90&rn=30&gsm=5a&1545483113251=

​ 第二个的网址:https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=汽车&cl=2&lm=&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&word=汽车&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&pn=120&rn=30&gsm=78&1545483113861=

​ 通过对比两个网址可以发现只有pn和gsm的值发生了改变。pn代表的是页数,rn代表每页显示的图片数量。gsm是pn 的 16位显示。

​ 至于最后面的13位数字,因为默认情况下python的时间戳是以秒为单位输出的float ,这里通过把秒转换毫秒,然后四舍五入的方法获得13位的时间戳:这里在设置请求的url可以不用写进去。

import  time
print(int(round(time.time() * 1000)))
# 输出结果为当前13位的时间戳

​ queryWord,word为我们输入的关键字“汽车”通过urllib.parse.quote(关键字)加密后的组合。

​ 所以可以拼接处真正的请求地址url:

# offset为页数
params = {'pn': offset,'rn': 30,'gsm': str(hex(offset))}
url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E8%A1%97%E6%8B%8D&cl=&lm=&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=&copyright=&word=%E8%A1%97%E6%8B%8D&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=&fr=&expermode=&selected_tags='+ urlencode(params)
  • 找到我们要爬取的图片信息

    ​ 点击抓包工具中的preview>data,点开其中任意一个字典“1”找到我们要的图片链接

​ 发现一张图片有4种URL:fromURL,middleURL,thumbURL,objURL,前三种有反爬措施,因此采用 objURL,objURL是加密后的样子,加密的原理是每个字符或者字符串都有一个对应的字符或者字符串,在 加密过程中将原始的字符串替换即可。解密的详细讲解代码可在我的GitHub中查看,这里不再赘述。

​ 详细测试解密函数(decry)代码-地址:https://github.com/silas9187/Python_Web_crawler/blob/master/basic spider/BaiDu/百度图片链接解码测试.py

2.编写代码

​ 主要分为三个部分:①获取真正的请求url然后爬取信息,②然后获取图片新信息,③保存图片到本地文件夹

  1. getPage函数获取真正的请求url然后爬取信息
def getPage(offset):'''爬取信息'''# 定义参数params = {'pn': offset,'rn': 30,'gsm': str(hex(offset))}# 初始化url地址headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E6%B1%BD%E8%BD%A6&cl=2&lm=&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&word=%E6%B1%BD%E8%BD%A6&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&'+ urlencode(params)try:res = requests.get(url, headers=headers)if res.status_code == 200:return res.json()except:return None
  1. 然后getImage函数获取图片新信息

    图片的标题用循环的数字m替代

def getImage(json):'''获取图片信息'''# print(type(json))  # json 为字典(dict)数据data = json.get('data')m = 1if data:for item in data:try:if item.get("objURL"):image = decry(item.get("objURL")) # decry为解码图片链接的函数title = str(m) # 这里将m设置为每张图片的名字yield {'image': image,'title': title,}m += 1except error.URLError as e:print(e.reason)  # 输出错误信息
  1. saveImage函数存储图片信息到本地文件

    先在本地同目录下建立一个“mypic”文件夹用来存放图片

    def saveImage(item):'''储存图片信息'''#处理图片的存储路径path = os.path.join("./mypic/", item.get('title'))if not os.path.exists(path):os.makedirs(path)#图片路径的处理local_image_url = item.get("image")# 判断是否有objURL,没有则说明图片是一个网站链接if local_image_url:save_pic = path+"/"+local_image_url.split("/").pop(2)+".jpg"#存储图片urlretrieve(local_image_url, save_pic)
    

4.最后设置主函数调用,主程序传入offset参数的值

def main(offset):'''主函数'''json = getPage(offset)# print(content)for item in getImage(json):print(item)saveImage(item)if __name__ == "__main__":for i in range(1, 3):main(offset=i*30)# time.sleep(1)

3.运行代码

图片下载成功!!!!

完整代码地址:https://github.com/silas9187/Python_Web_crawler/blob/master/basic spider/BaiDu/BaiDu.py (有用的话,GitHub点个赞,谢谢)

这里我在请求地址里限制关键字为汽车,也可以自己输入关键字,将它编码后(加密关键字用urllib.parse.quote())作为参数拼接到地址中。

如果觉得对你有帮助的话,请给文章点个赞,谢谢支持!

Python爬虫爬取Ajax加载的百度图库相关推荐

  1. selenium爬取Ajax加载的网页(以微博为例)

    Tip:我写了一篇直接构造请求获取微博数据的文章,不使用selenium,直接访问url获取到json数据,然后解析即可得到想要的数据的文章,请参考微博博主动态及相册的请求构造规律 ========= ...

  2. python selenium 爬取js加载的内容为空,Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容...

    1,引言 在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor.本文记录了确定gsExtractor的技术路线过程中所做的编程实验.这是第二部分,第一 ...

  3. python爬取js加载的数据_Python爬虫:爬取JS加载数据的网页

    比如简书: Paste_Image.png 我们来写个程序,爬取简书网站随便一个作者的所有文章,再对其所有文章进行分词统计 程序运行统计的结果见文章: 我统计了彭小六简书360篇文章中使用的词语 需要 ...

  4. python requests+json爬取ajax加载 爱彼迎深圳所有房源

    目的: 爬取爱彼迎深圳所有房源的房主,价格,房源介绍等信息 步骤如下: step1:获取房源页面url 登陆爱彼迎网站,搜索深圳房源 https://zh.airbnb.com/s/homes?ref ...

  5. 爬取ajax加载的豆瓣电影

    (一)前提:找到ajax异步加载的包接口,注意第一个电影名 我们把Request URL网址复制到地址栏得到: 上图是json格式数据,且第一个电影一致,说明我们找到了正确的ajax的json接口 出 ...

  6. python爬虫爬取股票评论,调用百度AI进行语义分析, matlab观察股票涨跌和评论的关系

    文章自己写的,代码自己调试的,但是思想是拿来的哈哈,不能叫严格意义上的 原创哦 一.爬股票的评论 环境:win7 aconda2python2.7,pycharm3.5 professional 1. ...

  7. python爬虫爬取网页指定数据(百度百科)

    首先我选取的爬取数据是所有季度参演过的嘉宾然后检查网页代码,找到要爬取的数据那部分,这里需要爬取的是table标签 我用的是jupyter notebook写的代码,设置url与Headers,先写一 ...

  8. python爬虫动态加载页面_Python+Selenium爬取动态加载页面(2)

    注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ...

  9. python爬取js加载的数据_JS动态加载数据不会爬?老司机教你两个方法爬取想要的数据...

    学习Python的人绝大部分都是在用Python做爬虫,毕竟对于爬虫而言Python是不二选. 但是一般简单的静态页面网站还是很好爬取的,对于很多动态加载的网站就不知道怎么办了,今天小编就给大家介绍两 ...

最新文章

  1. python代码大全p-Python网络爬虫实战项目代码大全(长期更新,欢迎补充)
  2. 在Vista操作系统中通过manifest文件使VC应用程序获得管理员权限
  3. 方法练习1_比较两个数字是否相同
  4. altium pcb 信号高亮_在PCB设计中高效的放置元件技巧
  5. Linux下Rails3 + Lighttpd + fcgi部署研究
  6. mysql导出表结构_mysql导入导出表结构及表数据及执行sql文件
  7. Knn原理及Python实现、数据展示
  8. RESTful开发风格
  9. css无效 https_【CSS非全解02】CSS基础-文档流
  10. AndroidStudio_安卓原生开发_搭建AdnroidStudio环境并配置SDK---Android原生开发工作笔记136
  11. 重新打包版Inno Setup 5.4.3
  12. python智能化推荐_windows python flask
  13. 关于handler的再次讨论
  14. (转)数字货币平台的交易风险
  15. android开题报告模板下载,毕业设计开题报告模板
  16. Linux内核数据结构之哈希表
  17. 灵棋排盘(七政四余)入门指导—排盘与框架
  18. matconvnet安装编译教程
  19. 高维统计理论 Gauss与Rademacher复杂度
  20. 模拟电路6(共射基本放大电路的组成及工作原理)

热门文章

  1. 软硬皆施,WMS仓库管理系统+PDA,实现效率狂飙
  2. Alta 429板卡在安装厂家自带的驱动后,没法运行自带的例子的解决方法
  3. Axure8.0.0.3303破解及汉化
  4. Android camera预览流程
  5. python自动化配置路由器_H3C MSR 系列路由器 配置指导(V7)-R0304-6W105
  6. 2022java学习路线总结—纯干货分享
  7. 谷歌开源Android上Roboto无衬线字体家族
  8. 2019年职称计算机考题,2019年职称计算机考试Excel备考试题(一)
  9. IntelliJ IDEA 2021下载、安装
  10. 一、Unity环境安装