源码地址: github.com/halibobo/ru…
文章地址: https://dahei.me

前言

目前学习python几个月了,由于自己比较喜欢跑马拉松,已经跑过了很多场比赛,前些天就写了个简单的爬虫爬取了网上三千多场马拉松比赛的报名信息。 今年5月27日,我又参加了巴图鲁关门山壹佰越野50公里组的比赛,这里的“巴图鲁”源自蒙古语“英雄”的意思,这场比赛也是出了名的虐,地点在辽宁省本溪市 · 关门山国家森林公园,累计爬升3655m。当天早上六点准时出发,刚跑没多久就来了很长一段陡峭的台阶......此处省略一万字......最终经过很多小时的艰苦奋战完成了比赛。

赛后去官网想找几张好看的图片发朋友圈,打开官网赛事图片链接到了爱运动的一个网页runnerbar.com/yd_runnerba…,这是个单页面的网页,不断滚动会自动加载更多的图片,我把页面一点点滚动找了很长一段时间根本找不到我的照片,刷新一下页面照片又从头开始了,实在不能忍。于是,我想要不把图片全部下载到本地查看吧,想干就干。

1. 分析

1.1 Chrome调试

在chrome浏览器里输入快捷键Cmd + Opt + I(Windows上是F12,或Ctrl + Shift + I),将调试选项切到Network,如下

一个个观察此网页发送的请求,找到和图片相关的请求 这是一个get请求,初步分析里面的参数,activity_id代表赛事id,page和pageSize分别代表页数和每页大小,接着将请求放在postman上印证

1.2请求分析

在postman里加了三个参数成功返回了一个json格式的值,第一阶段很顺利,接着分析里面的返回值,下面取了其中的一个元素

{
"album": {"activity_photo_count": 6984,"searchResultList": [{"id": "32926651","uid": 50392,"name": "巴图鲁关东越野","user_name": null,"user_img": "http://oss.runnerbar.com/img/user_upload/origin/20180526/1527305285356_fb59065d_18ce_478b_a3aa_259783f4cd5b.jpg","create_time": 1527313780000,"image_height": 3648,"image_width": 5472,"orientation": 1,"url_hq": "http://oss.runnerbar.com/img/watermark/user_upload/origin/20180526/1527313783392_235c5cea_5d0c_4cd7_afc6_0ba37cdc7c1d.jpg?quality=h","url_lq": "http://oss.runnerbar.com/img/watermark/user_upload/origin/20180526/1527313783867_7d986351_fde4_418a_8fb3_1723dcb38aec.jpg","content": null,"is_like": 0,"like_count": null,"comment_count": 0}}
复制代码

这是个json格式,最外层里有个album元素,album里包含了图片总数量activity_photo_count和图片信息的数组searchResultList。每张图片包含了id、uid、user_img、create_time等等,和图片路径相关的有三个值分别是user_img、url_hq、url_lq,其中的user_img打开后发现是赛事的宣传logo,剩下的url_hq、url_lq根据命名就很容易猜想到这是对应的两种尺寸的图片,用浏览器分别打开,果不其然正是想要的图片路径。

2.代码

2.1

上面已经知道了请求url和参数,下面就是需要将这些用代码实现出来。首先是发请求

url='http://m.yundong.runnerbar.com/yd_mobile/share/album.json'
para = {'activity_id':id,'page':page,'pageSize':100}
header = {}
r = requests.post(url,data=para,headers= header)
复制代码

请求的返回值是json,json内容在上面已经贴出来了这里就不再重复,接着解析这个json

json_r = r.json()
parsed_json = json_r['album']['searchResultList']
activity = {}
items = []
count = json_r['album']['activity_photo_count']
复制代码

这里就取到了图片总数量和图片信息的数组,这个请求参数是page和pageSize,一个请求只能取到一部分图片信息并不能把所有的图片都取出来。那能不能把所有图片分成一页返回呢?于是在postman上做了实验,将page=1,pageSize=10000发送,结果并不是想要的,真正返回的图片数量是100。说明这个接口做了校验,每个分页最大数量是100。看来投机取巧是不行了,分页还是要做的。 首先将单个请求封装成方法,传入page返回对应page的图片信息数组

def getRaceInfo(id,page):url='http://m.yundong.runnerbar.com/yd_mobile/share/album.json'para = {'activity_id':id,'page':page,'pageSize':100}header = {}r = requests.post(url,data=para,headers= header)json_r = r.json()parsed_json = json_r['album']['searchResultList']activity = {}items = []count = json_r['album']['activity_photo_count']for item in parsed_json:# print(item['user_img'])items.append(item)activity['items'] = itemsactivity['count'] = count
return activity
复制代码

图片的做数量是count,每页分100张图片,起点是第1页,那么总的分页数量就是count/100+2,分页的代码就应该是这样的

for i in range(1,int(count/100+2)):data = getRaceInfo(id,i)['items']
复制代码

这里只是贴了一小段代码,完整代码可以参见上面的github地址

2.2 下载

有了图片在url,下载图片就更简单了,直接上代码

def save_img(img_url,file_name,file_path='book'):
#保存图片到磁盘文件夹 file_path中,默认为当前脚本运行目录下的 book\img文件夹
try:if not os.path.exists(file_path):print('文件夹',file_path,'不存在,重新建立')#os.mkdir(file_path)os.makedirs(file_path)#获得图片后缀file_suffix = os.path.splitext(img_url)[1]#拼接图片名(包含路径)filename = '{}{}{}{}'.format(file_path,os.sep,file_name,file_suffix)#下载图片,并保存到文件夹中urllib.request.urlretrieve(img_url,filename=filename)
except IOError as e:print('文件操作失败',e)
except HTTPError as e:print('Error code: ', e.code)
except Exception as e:print('错误 :',e)
复制代码

运行python,查看本地文件 几千张图片很快下载到了本地

这时又有了新的想法,既然可以下载关门山越野的图片,是不是可以把爱运动里所有的图片都下载下来,说干就干。于是我将赛事id定义成参数,写个方法遍历id。改动了几行从新运行,几个小时后程序还在运行但是图片占用的大小已经超过了7G, 打开文件里面包含了各个赛事的图片,眼看图片越来越多加上我的mac存储空间有限最终停止了下载,但是这个思路应该是可行的。

源码地址: github.com/halibobo/ru…

最后

整个过程从开始到结束都在一天内完成的,代码里也没有什么复杂的逻辑,但完成之后心里还是有很多的满足感。

最后贴上一句我很喜欢的赛事宣传语

   和一群志同道合的人,一起奔跑在理想的路上,回头有一路的故事,低头有坚定的脚步,抬头有清晰的远方。—— 致巴图鲁er
复制代码

转载于:https://juejin.im/post/5c065bbc6fb9a049c30b02b8

python批量下载马拉松照片相关推荐

  1. python批量下载马拉松图片

    源码地址: https://github.com/halibobo/runnerbar-image 前言 目前学习python几个月了,由于自己比较喜欢跑马拉松,已经跑过了很多场比赛,前些天就写了个简 ...

  2. python批量下载百度照片

    需要指定关键字和爬虫的页数 #!/usr/bin/python # _*_ coding: utf-8 _*_''' Created on 2018年8月23日程序逻辑,通过requests包的方法, ...

  3. python下载网页里面所有的图片-Python批量下载网页图片详细教程

    很多朋友在网上查找批量下载图片的方法~发觉挺凌乱的,无从下手.这里绿茶小编就来跟大家分享下使用Python批量下载图片方法. 目标:爬取某个网站上n多页的链接,每个链接有n多张图片,每一页对应一个文件 ...

  4. 群里又会python的吗_自从会了Python在群里斗图就没输过,Python批量下载表情包!...

    原标题:自从会了Python在群里斗图就没输过,Python批量下载表情包! 导语 最近图慌,于是随便写了个表情包批量下载的脚本,没什么技术含量,纯娱乐性质. 让我们愉快地开始吧~ 开发工具 Pyth ...

  5. python批量下载b站_python 批量下载bilibili视频的gui程序

    运行效果: 完整代码: # !/usr/bin/python # -*- coding:utf-8 -*- # time: 2019/07/02--08:12 __author__ = 'Henry' ...

  6. Python 批量下载SIGMOD,VLDB的论文 Mac OS

    这里写自定义目录标题 Python 批量下载SIGMOD,VLDB的论文 Mac OS 实现 0.要爬取的网站 1.下载单篇论文 2.获得所有论文的链接 完整代码 Python 批量下载SIGMOD, ...

  7. 教你怎么使用python批量下载图片

    教你怎么使用python批量下载图片 文章目录 教你怎么使用python批量下载图片 前言 一.运行环境 1. win10 2. python==3.7.2 二.需要用到的参数 1. download ...

  8. python批量下载模库网图片

    这里写自定义目录标题 python批量下载模库网图片 步骤: 代码 python批量下载模库网图片 步骤: 获取页数 获取列表页 获取图片链接和名字相关字典 创建存放图片的文件夹 下载图片 代码 im ...

  9. python怎么批量下载年报_使用Python批量下载Wind数据库中的PDF报告

    原标题:使用Python批量下载Wind数据库中的PDF报告 背景 最近小编出于工作需要,准备在Wind金融数据终端批量下载上市公司2019年第一季度业绩预告.通过相关的条件检索,发现其相关数据有近百 ...

最新文章

  1. 音视频技术开发周刊(第122期)
  2. Windows下UltraEdit查看Objective-C代码高亮工具
  3. 再见,Spark!Flink已成气候!
  4. centos8安装mysql_CentOS8+FreeRadius+Mysql8.0+daloRadius建立Radius服务器
  5. 一张图剖析企业大数据平台的核心架构
  6. Opencv--获取Mat图像数据的方式
  7. 【BZOJ 1801】【AHOI 2009】中国象棋(递推DP)
  8. (8)Node.js 模块介绍
  9. iOS开发:icon和启动图尺寸(转)
  10. S2SH新手框架结构的准备工作只需要导入这些文件
  11. tp3.2.3 命令模式
  12. 解决Vivado仿真卡在executing simulate step
  13. matlab 正交导频序列,导频序列和训练序列的区别
  14. 51nod 1534 棋子游戏 博弈
  15. 移动硬盘linux双系统,在移动硬盘安装Linux(Ubuntu)双系统
  16. HTML 和文字有关的标签(2)
  17. 简历背景图片设置html代码,怎么在简历中添加背景图片
  18. 区块与共识(一):解决竞选记账权的问题
  19. Android 静音检测
  20. 计算机与信息科学学士,计算机与信息科学理科学士

热门文章

  1. python 判断list 中重复元素最后1次出现的位置
  2. 商业插画师走尺:“声音主播”的画画世界
  3. php社区果蔬网站 毕业设计-附源码211548
  4. IMU-CAM联合标定测试(只依靠数据集)
  5. PC端页面适配px转rem
  6. 揭秘!从iphone8的上市看苹果的供应链!
  7. Redis | 跳跃表
  8. 【数据结构】求二叉树深度的算法
  9. 简述一下索引的匹配原则_索引最左匹配原则
  10. oracle 删除补全日志组_Oracle 补充日志(Supplemental Logging)说明