国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python批量下載網(wǎng)站馬拉松照片的完整步驟

2020-01-04 13:55:41
字體:
供稿:網(wǎng)友

前言

目前學習python幾個月了,由于自己比較喜歡跑馬拉松,已經(jīng)跑過了很多場比賽,前些天就寫了個簡單的爬蟲爬取了網(wǎng)上三千多場馬拉松比賽的報名信息。

今年5月27日,我又參加了巴圖魯關(guān)門山壹佰越野50公里組的比賽,這里的“巴圖魯”源自蒙古語“英雄”的意思,這場比賽也是出了名的虐,地點在遼寧省本溪市 · 關(guān)門山國家森林公園,累計爬升3655m。當天早上六點準時出發(fā),剛跑沒多久就來了很長一段陡峭的臺階……此處省略一萬字……最終經(jīng)過很多小時的艱苦奮戰(zhàn)完成了比賽。

賽后去官網(wǎng)想找?guī)讖埡每吹膱D片發(fā)朋友圈,打開官網(wǎng)賽事圖片鏈接到了愛運動的一個網(wǎng)頁http://runnerbar.com/yd_runnerbar/album/pc?type=3&activity_id=10712,這是個單頁面的網(wǎng)頁,不斷滾動會自動加載更多的圖片,我把頁面一點點滾動找了很長一段時間根本找不到我的照片,刷新一下頁面照片又從頭開始了,實在不能忍。于是,我想要不把圖片全部下載到本地查看吧,想干就干。

1. 分析

1.1 Chrome調(diào)試

在chrome瀏覽器里輸入快捷鍵Cmd + Opt + I(Windows上是F12,或Ctrl + Shift + I),將調(diào)試選項切到Network,如下

python,批量下載,照片

一個個觀察此網(wǎng)頁發(fā)送的請求,找到和圖片相關(guān)的請求

python,批量下載,照片

這是一個get請求,初步分析里面的參數(shù),activity_id代表賽事id,page和pageSize分別代表頁數(shù)和每頁大小,接著將請求放在postman上印證

python,批量下載,照片

1.2請求分析

在postman里加了三個參數(shù)成功返回了一個json格式的值,第一階段很順利,接著分析里面的返回值,下面取了其中的一個元素

{"album": { "activity_photo_count": 6984, "searchResultList": [ {  "id": "32926651",  "uid": 50392,  "name": "巴圖魯關(guān)東越野",  "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里包含了圖片總數(shù)量activity_photo_count和圖片信息的數(shù)組searchResultList。每張圖片包含了id、uid、user_img、create_time等等,和圖片路徑相關(guān)的有三個值分別是user_img、url_hq、url_lq,其中的user_img打開后發(fā)現(xiàn)是賽事的宣傳logo,剩下的url_hq、url_lq根據(jù)命名就很容易猜想到這是對應的兩種尺寸的圖片,用瀏覽器分別打開,果不其然正是想要的圖片路徑。

2.代碼

2.1

上面已經(jīng)知道了請求url和參數(shù),下面就是需要將這些用代碼實現(xiàn)出來。首先是發(fā)請求

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內(nèi)容在上面已經(jīng)貼出來了這里就不再重復,接著解析這個json

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

這里就取到了圖片總數(shù)量和圖片信息的數(shù)組,這個請求參數(shù)是page和pageSize,一個請求只能取到一部分圖片信息并不能把所有的圖片都取出來。那能不能把所有圖片分成一頁返回呢?于是在postman上做了實驗,將page=1,pageSize=10000發(fā)送,結(jié)果并不是想要的,真正返回的圖片數(shù)量是100。說明這個接口做了校驗,每個分頁最大數(shù)量是100。看來投機取巧是不行了,分頁還是要做的。

首先將單個請求封裝成方法,傳入page返回對應page的圖片信息數(shù)組

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'] = countreturn activity

圖片的做數(shù)量是count,每頁分100張圖片,起點是第1頁,那么總的分頁數(shù)量就是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,查看本地文件

幾千張圖片很快下載到了本地

python,批量下載,照片

這時又有了新的想法,既然可以下載關(guān)門山越野的圖片,是不是可以把愛運動里所有的圖片都下載下來,說干就干。于是我將賽事id定義成參數(shù),寫個方法遍歷id。改動了幾行從新運行,幾個小時后程序還在運行但是圖片占用的大小已經(jīng)超過了7G,

python,批量下載,照片

打開文件里面包含了各個賽事的圖片,眼看圖片越來越多加上我的mac存儲空間有限最終停止了下載,但是這個思路應該是可行的。

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

最后 

整個過程從開始到結(jié)束都在一天內(nèi)完成的,代碼里也沒有什么復雜的邏輯,但完成之后心里還是有很多的滿足感。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 桃园市| 延川县| 民权县| 海安县| 云浮市| 潞城市| 定远县| 黔西县| 方城县| 永善县| 枣阳市| 凤山县| 二连浩特市| 五寨县| 女性| 林西县| 修文县| 沂源县| 夏河县| 商洛市| 盐津县| 兰州市| 右玉县| 奈曼旗| 安多县| 库伦旗| 益阳市| 三亚市| 磐石市| 西畴县| 苍溪县| 阳山县| 敖汉旗| 江安县| 崇礼县| 靖安县| 扶余县| 阳春市| 静海县| 阿巴嘎旗| 奎屯市|