- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python批量下载网站马拉松照片的完整步骤由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
目前学习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格式的值,第一阶段很顺利,接着分析里面的返回值,下面取了其中的一个元素 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
{
"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和参数,下面就是需要将这些用代码实现出来。首先是发请求 。
1
2
3
4
|
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 。
1
2
3
4
5
|
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的图片信息数组 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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'
]
=
items
activity[
'count'
]
=
count
return
activity
|
图片的做数量是count,每页分100张图片,起点是第1页,那么总的分页数量就是count/100+2,分页的代码就应该是这样的 。
1
2
|
for
i
in
range
(
1
,
int
(count
/
100
+
2
)):
data
=
getraceinfo(
id
,i)[
'items'
]
|
这里只是贴了一小段代码,完整代码可以参见上面的github地址 。
2.2 下载 。
有了图片在url,下载图片就更简单了,直接上代码 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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 。
最后 。
整个过程从开始到结束都在一天内完成的,代码里也没有什么复杂的逻辑,但完成之后心里还是有很多的满足感.
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:https://dahei.me/2018/06/21/python批量下载马拉松图片/ 。
最后此篇关于python批量下载网站马拉松照片的完整步骤的文章就讲到这里了,如果你想了解更多关于python批量下载网站马拉松照片的完整步骤的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有这个网站,这个特定页面是安全的,但是当它回发时,它回发到一个不安全的页面。如何解决? 我正在使用 ASP.NET 向导。我有这个页面 - checkout.aspx,页面包含这个控件 checko
我有 2 个 azure 网站 - 两个独立的项目 我现在有 2 个网址: myazurewebsite.azurewebsites.net myazureblog.azurewebsites.net
我有 2 个 azure 网站 - 两个独立的项目 我现在有 2 个网址: myazurewebsite.azurewebsites.net myazureblog.azurewebsites.net
环境: 旧网站: React 托管在 Heroku URL( http://sameurl.com ) 新网站: Java 托管在 Heroku URL ( http://sameurl.com )
我已在 Windows Azure 上注册了一个测试帐户来对其进行测试。我构建了一个 Hello world ASP.NET Web 应用程序 + 数据库只是为了测试。 我安装了 Visual Stu
我有一个可以收集和显示各种测量值的产品(不会详细介绍)。正如人们所期望的那样,显示部分是一个数据库+建立在其之上的网站(使用 Symfony)。 但是,我们可能还会创建一个 API 来向第三方公开数据
这个问题在这里已经有了答案: Software keyboard resizes background image on Android (16 个答案) 关闭 8 年前。 我有一个类似的问题:So
这个问题似乎很常见,但我真的无法根据现有答案解决问题。 我有一个简单的 maven 项目,没有任何复杂的部署配置等,并且想在点击“mvn site”时生成一个 Maven CheckStyle 报告。
有没有人看过有关何时进行横向扩展与纵向扩展的最佳选择的任何分析或信息。什么时候一个比另一个更有意义。 目前,在标准模式和基本模式下,2 个小型实例的费用与 1 个中型实例的费用相同。 拥有 2 个小型
有没有办法找到 azure 网站何时停止? (我通过门户网站停止了网站,但我不记得是什么时候......) 我正在寻找一些日志,但没有找到任何有用的内容。 谢谢。 最佳答案 您拥有的最接近的是 azu
我目前在 Azure VM 的 IIS 中拥有一个网站。我已将该站点复制到 2 个可用区域中的 2 个虚拟机上。 这可以保护网站免遭停机。 我需要为高负载时刻实现一些可扩展性。这似乎就是创建音阶集的目
我有一个托管在 Azure 上的网站 ( http://mike-ward.azurewebsites.net/ )。我从 Azure 门户设置了一个指向(引用?)我的网站的 Azure CDN。根据
我有一个 Azure 网站(不是 Web 角色),有 2 个槽:生产和暂存。 我只想为生产插槽启用 CDN,而不是为登台启用,问题是我找不到识别主机插槽的方法。 RoleEnvironment 不可用
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。 4年前关
我们正在考虑将一些网站从 Azure 云服务迁移到 Azure 网站(事情似乎就是这样进行的)。显然,我们被明确告知云服务不会保留文件系统状态,因为它们会在机器故障时重新部署。 我假设网站是基于 Bl
我有一个 Azure 网站,需要使用在 VM 上运行的 Elasticsearch 服务。 虽然我需要能够锁定对 Elasticsearch 的访问,以便只有 Azure 网站可以访问它,但我似乎无法
我有一个 azure 网站,位于 yis3.azurewebsites.net - 我已将其提升为“共享”网站,以便我可以使用自定义域。我拥有从 123-reg.co.uk 购买的域名 yorkshi
我正在使用 abcPDF 动态创建 PDF。 我想保存这些 PDF,以便客户随时检索。最简单的方法(也是我现在在当前服务器上所做的方法)是将完成的 PDF 保存到文件系统。 看来我一直坚持使用 blo
我们正在尝试了解 Windows Azure 管理 API 为 Azure 网站(而非 Webroles)返回的监控数据的复杂性 例如,下图描述了为 CPUTime 检索的数据点。它似乎表明,在晚上
看起来真的很愚蠢,因为我找不到它: 门户网站似乎不太直观,我如何为一个“网站”付费并在其中运行最多 500 个网站?我想当我通过单击左下角的加号添加“网站”时,我添加了整个虚拟机而不是子站点。如何仅添
我是一名优秀的程序员,十分优秀!