这次我们来分析一下Ajax(至于Ajax是什么意思请自行百度了,这里就不过多解释),爬取一些高清壁纸,等待下载到本地之后,然后我们再慢慢的筛选这些壁纸。那么这次的目标就是搜狗壁纸,啥1280*720的,1366*768的,1920*1080的统统拿下,先看一下本次目标URL :

http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD&from=home#%E5%85%A8%E9%83%A8%269

可以看到,在壁纸这一大标题之下有很多的小栏目标题,世界风光、动物、明星、影视、日韩明星、汽车......后面还有美女栏哦~~哈哈,接下来我们将这些统统纳入囊中,开始分析。

打开浏览器的开发者工具,我们在这个页面多往下翻动几页,然后观察一下,找到我们要的列表和请求的Ajax数据:

从上面可以看到,壁纸的分类在请求的html文档中有,我们可以使用正则表达式将这个分类提取出来。下面则是请求的Ajax数据:

category:壁纸

tag:全部

start:0

len:15

width:1366

height:768

大概可以知道tag就是壁纸的所属的类,start观察其他几个请求可以发现是起始页,每次增长为15(起始就是下一页),width和

height不用说就是我们期望的图片分辨率了,下面代码就是找到这些分类和我们期望的壁纸分辨率:

header = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}#通过输入尺寸大小和壁纸种类返回壁纸资源的url
def get_wallPaperTypeAndDpi():dpi = ((1920, 1080), (1366, 768), (1280, 720)) #暂时只添加这几种常见的分辨率url = 'http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD&from=home'try:response = requests.get(url, headers = header)if response.status_code == 200:allTop = re.findall('var jsonTag = (\[.*?\]);' ,response.text, re.S)wallPaperList = allTop[0][2:-2]wallPaperList = wallPaperList.split('","')  #获取到列表for num,item in zip(range(1,30), wallPaperList):print(num, item)type_num = input('输入期望的壁纸类型:')for num,(x,y) in zip(range(1,4), dpi):print(num, x, '*',y)dpi_num = input('输入期望的壁纸类型:')print(wallPaperList[int(type_num) - 1],dpi[int(dpi_num) - 1])return  wallPaperList[int(type_num) - 1],dpi[int(dpi_num) - 1]else:print('response.status_code = ', response.status_code)except:print('请求失败或者输入有误!')

然后构造url:

#获取其中一类图片的资源列表
def get_url(dpi = (1920, 1080), start = 0, picType = '全部'):params = {'category': '壁纸','tag': picType,'start': start,'len': '15','width': dpi[0],'height': dpi[1],}print(params)return 'http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?' + urlencode(params)

我们在这些其中一个图片点击进去之后,可以看到有一个下载字样,我们点击这个下载,然后图片就自动下载了。我们在图片下载的地方可以看到这个图片的下载链接为:

http://imgstore02.cdn.sogou.com/v2/thumb/dl/11546631.jpg?appid=10150005&referer=sogou.com&url=https://img01.sogoucdn.com/app/a/100520021/7dd43e802a873bf2d9eff8b7488618b7

再看一下之前请求的Ajax数据里面,去all_items里面找一找,可以发现一些规律,id=11546631,pic_url = https://img01.sogoucdn.com/app/a/100520021/7dd43e802a873bf2d9eff8b7488618b7,这个和图片的下载地址貌似找到了联系,这样就可以断定,图片的高清下载地址就是:

http://imgstore02.cdn.sogou.com/v2/thumb/dl/' + id + '.jpg?appid=10150005&referer=sogou.com&url=' + pic_url,

然后在js脚本里搜索一下imgstore关键字,发现确实就是我们想的那样,下载地址就是那样构造的:

只是那个b值是随机构造的,所以我们就写一个固定值,1-4都是可以的,所以就可以写出得到高清图片的下载地址函数:

#获取图片的下载url
def get_imageUrl(url):response = requests.get(url, headers=header)if response.status_code == 200:all_items = response.json().get('all_items')if all_items != None:for item in all_items:pic_url = item.get('pic_url')id = item.get('id')yield {'url' : 'http://imgstore04.cdn.sogou.com/v2/thumb/dl/' + str(id) + '.jpg?appid=10150005&referer=sogou.com&url=' + pic_url,'title' : str(id) + '.jpg'}

最后得到了高清的壁纸图片下载链接,就直接拿这个链接地址去下载就好了,下面是下载保存图片的方法:

#保存图片
def save_image(image_info):global  COUNTsavePath = 'F:\\picture\\wallPaper\\'try:response = requests.get(image_info.get('url'), headers=header)savePath = savePath + image_info.get('title')if response.status_code == 200:if not os.path.isfile(savePath):with open(savePath, 'wb') as f:f.write(response.content)print(image_info.get('title'),' ->OK\n')COUNT += 1  #用于计数成功下载了多少张图片except requests.ConnectionError:print('保存图片失败.')

最后将所有的代码都贴上:

import re,os
import requests
from urllib.parse import urlencodeheader = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
COUNT = 0
#通过输入尺寸大小和壁纸种类返回壁纸资源的url
def get_wallPaperTypeAndDpi():dpi = ((1920, 1080), (1366, 768), (1280, 720)) #暂时只添加这几种常见的分辨率url = 'http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD&from=home'try:response = requests.get(url, headers = header)if response.status_code == 200:allTop = re.findall('var jsonTag = (\[.*?\]);' ,response.text, re.S)wallPaperList = allTop[0][2:-2]wallPaperList = wallPaperList.split('","')  #获取到列表for num,item in zip(range(1,30), wallPaperList):print(num, item)type_num = input('输入期望的壁纸类型:')for num,(x,y) in zip(range(1,4), dpi):print(num, x, '*',y)dpi_num = input('输入期望的壁纸类型:')print(wallPaperList[int(type_num) - 1],dpi[int(dpi_num) - 1])return  wallPaperList[int(type_num) - 1],dpi[int(dpi_num) - 1]else:print('response.status_code = ', response.status_code)except:print('请求失败或者输入有误!')#获取其中一类图片的资源列表
def get_url(dpi = (1920, 1080), start = 0, picType = '全部'):params = {'category': '壁纸','tag': picType,'start': start,'len': '15','width': dpi[0],'height': dpi[1],}print(params)return 'http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?' + urlencode(params)#获取图片的下载url
def get_imageUrl(url):response = requests.get(url, headers=header)if response.status_code == 200:all_items = response.json().get('all_items')if all_items != None:for item in all_items:pic_url = item.get('pic_url')id = item.get('id')yield {'url' : 'http://imgstore04.cdn.sogou.com/v2/thumb/dl/' + str(id) + '.jpg?appid=10150005&referer=sogou.com&url=' + pic_url,'title' : str(id) + '.jpg'}#保存图片
def save_image(image_info):global  COUNTsavePath = 'F:\\picture\\wallPaper\\'try:print(image_info.get('url'))response = requests.get(image_info.get('url'), headers=header)savePath = savePath + image_info.get('title')if response.status_code == 200:if not os.path.isfile(savePath):with open(savePath, 'wb') as f:f.write(response.content)print(image_info.get('title'),' ->OK\n')COUNT += 1except requests.ConnectionError:print('Failed to Save Image.')picType,dpi = get_wallPaperTypeAndDpi()
for num in range(0, 90, 15):imageUrl = get_imageUrl(get_url(dpi, num, picType))for x in imageUrl:save_image(x)
print('总共下载%d张'%COUNT)

运行结果图,有些重复的图片,但是分辨率是不同的:

python爬虫系列(2):分析Ajax 爬取搜狗高清壁纸相关推荐

  1. python爬虫学习笔记分析Ajax爬取果壳网文章

    有时在使用requests抓取页面会遇到得到的结果与在浏览器 中看到的结果不一样,在浏览器检查元素中可以看到的正常的显示的网页数据,但是requests请求得到的结果却没有.这是因为requests请 ...

  2. [Python3网络爬虫开发实战] --分析Ajax爬取今日头条街拍美图

    [Python3网络爬虫开发实战] --分析Ajax爬取今日头条街拍美图 学习笔记--爬取今日头条街拍美图 准备工作 抓取分析 实战演练 学习笔记–爬取今日头条街拍美图 尝试通过分析Ajax请求来抓取 ...

  3. python手机壁纸超清_详解Python静态网页爬取获取高清壁纸

    前言 在设计爬虫项目的时候,首先要在脑内明确人工浏览页面获得图片时的步骤 一般地,我们去网上批量打开壁纸的时候一般操作如下: 1.打开壁纸网页 2.单击壁纸图(打开指定壁纸的页面) 3.选择分辨率(我 ...

  4. 爬虫爬取大量高清壁纸图片

    爬虫爬取大量高清壁纸 思路: 首先从网页入手,观察网页整体结构,因为本段代码使用的是Xpath解析(想了解Xpath解析可以看上一篇) import requests from lxml import ...

  5. python爬取4k高清壁纸(多线程版)

    刚学了多线程,于是把上次写的博客拿出来进行改写, 原文链接:python爬取4k高清壁纸(再也不怕没有壁纸了) 爬取过程已经在上一次写过了,可以点击原文链接查看. 废话不多说,直接上多线程代码: im ...

  6. python爬虫:使用scrapy框架抓取360超清壁纸(10W+超清壁纸等你来爬)

    目的:闲着无聊,利用爬虫爬取360超清壁纸,并将其数据存储至MongoDB/MySQL中,将图片下载至指定文件夹. 要求:确保以安装MongoDB或者MySQL数据库.scrapy框架也肯定必须有的: ...

  7. Python爬虫实战 | 利用多线程爬取 LOL 高清壁纸

    来源:公众号[杰哥的IT之旅] 作者:阿拉斯加 ID:Jake_Internet 如需获取本文完整代码及 LOL 壁纸,请为本文右下角点赞并添加杰哥微信:Hc220088 获取. 一.背景介绍 随着移 ...

  8. python壁纸高清图片_详解Python静态网页爬取获取高清壁纸

    前言 在设计爬虫项目的时候,首先要在脑内明确人工浏览页面获得图片时的步骤 一般地,我们去网上批量打开壁纸的时候一般操作如下: 1.打开壁纸网页 2.单击壁纸图(打开指定壁纸的页面) 3.选择分辨率(我 ...

  9. python爬取4k高清壁纸(再也不怕没有壁纸了)

    今天突然想换壁纸,在网上找了一圈没有找到满意的,正好学了爬虫,于是我就想把它们全都爬取下来,慢慢挑选. 这次爬取的目标是:彼岸图网动漫壁纸 接下来,我将详细讲解爬取过程: 首先点开网站,右键–检查 观 ...

最新文章

  1. 使用Node.js写一个简单的api接口
  2. 《秦时明月世界》手游如何用Unity定制化渲染管线?
  3. 基于Axure的火车购票APP
  4. 语义信息增强的激光雷达SLAM
  5. 我找到一个价值5.5万美元的 Facebook OAuth账户劫持漏洞
  6. PIC单片机开发工具
  7. 【资料】印度数学家拉马努金
  8. PS从复制图层到的项目
  9. 菜鸟打印自定义区域设置
  10. babylon101| 09. Intersect Collisions - mesh(网格交叉碰撞)
  11. 压缩短视频的软件哪个好?视频压缩软件免费版哪个好?最好的视频压缩工具
  12. 自建cdn搭建_自建CDN
  13. 西电软工oop面向对象程序设计实验二上机报告
  14. SaaS、PaaS、IaaS的区别
  15. 破解mifare Classic(M1)非接触式射频IC卡--Mifare crack Hack 笔记二
  16. w ndows7共享,七仔教你学Windows 7:玩转家庭网络共享
  17. 医疗器械系统测试用例编写实操(二)流程图分析法
  18. 吴恩达深度学习 | (20) 序列模型专项课程第一周学习笔记
  19. eclipse环境下如何配置tomcat
  20. CSP-J信息学奥赛考试大纲(入门级)

热门文章

  1. 分享两个获取文档资源的网站和软件
  2. Git Pull failed: Failed to start Git process…\JetBrains\IntelliJIdea2021.1\tmp\intelliji-git-askpass
  3. 大学培养模式之CDIO回忆录
  4. Flask后端笔记(二)request、bort、响应、session、钩子
  5. 苹果备忘录怎么调字体大小_苹果备忘录误删了怎么恢复?快速恢复,只要收藏这两招!...
  6. 各国数据网站大全(尤其适用美赛这种需要很多数据的)
  7. 多旋翼飞行器设计与控制·Pixhawk4以及外部设备接线(笔记004)
  8. 金山毒霸2006完美梦幻无限期升级版(8月31号更新)
  9. 基础Java练习08:由卡号计算幸运数字
  10. 计蒜客T3144----受力平衡(乘法逆元应用)