源码地址: https://github.com/halibobo/runnerbar-image

前言

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

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

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存储空间有限最终停止了下载,但是这个思路应该是可行的。

源码地址: https://github.com/halibobo/runnerbar-image

最后

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

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

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

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

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

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

  2. python批量下载必应图片

    梗概:我是个化验师,我们可是也要我们做PPT,医学知识往往繁多复杂,要是有比较好的照片配合文字,可以大大增加PPT的效果.必应这个网站可以搜索到比较有价值的医学图片,要是你输入一个医学名词,同样的搜索 ...

  3. python批量下载网页文件-Python批量下载网页图片详细教程

    目标:爬取某个网站上n多页的链接,每个链接有n多张图片,每一页对应一个文件夹,每个文件夹包含n个链接所对应的文件夹. 步骤1:获得网页的所有链接,访问所有链接,获得链接里的图片地址. 步骤2:根据图片 ...

  4. python 批量下载网页图片_Python实现多线程批量下载图片

    <派森>(Python)3.13 win32 英文安装版 类型:编程工具大小:21M语言:英文 评分:8.7 标签: 立即下载 爬取图片可真的是一个可遇不可求的机会. 有需求就会动力. 目 ...

  5. python 批量下载网页图片_手把手教你爬取天堂网1920*1080大图片(批量下载)——实战篇|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ /1 前言/ 上篇文章 手把手教你爬取天堂网1920*1080大图片(批量下载)--理论篇我们谈及了天堂网 ...

  6. 用IDM 和 python 批量下载webp图片

    今天遇到了一个新的需求.网站上有许多webp图片,直接打开它,拒绝访问,浏览器打开也403,一看就是被保护了.写了python批量来下也失败.最后用IDM试一下,居然可以下载.但是一个一个下载太麻烦了 ...

  7. python批量下载txt图片批量导入到ppt

    初步有各个楼盘图片的相关网址,想批量导入到ppt,编相应序号,保证每一张一个楼盘,每页展示6-8张图片.第一步:根据相关网址批量下载图片 相关网址放入file_url_text.txt中,形成列表 ​ ...

  8. python批量下载网页图片_python批量下载网站马拉松照片的完整步骤

    前言 目前学习python几个月了,由于自己比较喜欢跑马拉松,已经跑过了很多场比赛,前些天就写了个简单的爬虫爬取了网上三千多场马拉松比赛的报名信息. 今年5月27日,我又参加了巴图鲁关门山壹佰越野50 ...

  9. python批量下载马拉松照片

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

最新文章

  1. php webuploader大文件,web uploader 上传大文件总结
  2. GDI+ 中发生一般性错误(生成验证码时出现的错误)
  3. 人工神经网络相对于支持向量机有什么优势? [关闭]
  4. 如何列出Git 1.7+中的所有远程分支?
  5. Linux0.11 中对地址的管理
  6. Java虚拟机详解04----GC算法和种类【重要】
  7. python 抓取“煎蛋妹子图”并分页存在本地(普通版和多线程版)
  8. 前端学习(3335):ant design中按钮尺寸的大小
  9. .NET 4.0 调用 C dll 触发 AccessViolationException 异常的处理方案
  10. BIO与NIO、AIO的区别
  11. linux下修改当前目录下图像文件并删除
  12. sql server与java实例_史上最全:PostgreSQL DBA常用SQL查询语句(建议收藏学习)
  13. Java学习路线,Java SE,EE,ME的区别,SSM框架基本概念
  14. 线程基础阶段性总结和扩展(二)——ThreadLock
  15. 阿里巴巴矢量图库的引用以及更新
  16. 如何解决百度识图中图片被限制百度防盗链破解方法
  17. Python中机器学习模型的几种保存方式
  18. PHP利用SMTP发送邮件,测试ok
  19. 服务器网页多重定向,浏览器提示该网页包含太多服务器重定向是什么意思 - 卡饭网...
  20. 解决:wordpress 安装主题时,要求FTP

热门文章

  1. 二叉树的深度优先搜索
  2. Unity 动画系统 03 动画间的连接问题
  3. uni-app打包安卓apk后无法请求数据
  4. KLing源码(在屏幕实时显示键盘操作)下载及编译(Win10,VS2022)
  5. 一加9pro怎么样 哈苏摄像引领智能手机新潮流
  6. macOS下VSCode 使用记录(使用调试运行 Python/C 等)
  7. c语言生日创意代码_生日快乐c语言
  8. 基于Android Studio开发的旅游记录与分享APP源码,Android旅游路线记录与分享APP源码
  9. APP服务器:你想知道的都在这里
  10. Java程序的运行过程(执行流程)分析