爬取unsplash圖片

作為今天的一個小練習,爬取了這個網站的一些圖片,這個網站的圖片都是動態加載(往下拉,又會加載出圖片),沒有用requests爬過動態的網站,因為我一直找不出他們的規律,這個網站也是在試了很久之后,network抓包,發現在XHR里邊發現了一個情況,就是下拉的時候,每到一個地方會觸發一個請求,

通過觀察,大概可以總結出來一個規律,請求的url中變化的就是page部分,猜測應該是從0開始變化的,per_page通過觀察是用來控制一次返回的是多少張圖片的,一次12張。看每個url給我們返回的東西,是一個json格式的。
這時可以發現,下載的url也就是中間紅框的那個地方是變化的,也就是圖片的id。那么想要下載圖片,就得得到圖片的id,有了這個思路,就可繼續分析,剛在也發現了,加載圖片頁面的url:https://unsplash.com/napi/photospage=3&per_page=12&order_by=latest每次觸發,變化的只是page=后邊的數字,那么就可以通過for循環構造下拉到底時觸發的請求的url來獲取圖片的id。我是這么構造的:

urls = []
    for i in range(10):
        url = 'https://unsplash.com/napi/photos?page='+str(i)+'&per_page=12&order_by=latest'#構造url動態的
        urls.append(url)

我把它放在了一個列表里邊,然后我再遍歷url列表發起請求,得到json文件,然后通json.loads將json文件轉為字典去取得圖片的id。

ids = []
def getHtml(url):
    headers = {
        'User-Agent': 'Mozilla/5.0'
    }
    try:
        r = requests.get(url,headers =headers) # , verify=False
        r.raise_for_status()
        r.encoding = 'utf-8'
        return r.text
    except:
        print('爬取失敗')
        return ''

def getId(html):  #獲取圖片的id
    jd = json.loads(html) #轉為字典
    for j in jd:
        ids.append(j['id'])  #得到圖片的id并放入到列表里邊
def main():
   for url in urls:
        html = getHtml(url)
        getId(html)

在取到圖片的id之后,就可以通過id去構造獲得圖片的url:https://unsplash.com/photos/-iFhGZP_mhk/download
photos/這部分是id/download,那就可以構造出圖片的url了

    img_urls = []
    for id in ids:
        ul = 'https://unsplash.com/photos/'+id+'/download' #構造下載圖片的url
        img_urls.append(ul)

構造的部分url
['https://unsplash.com/photos/DaQmfmkA20w/download ', 'https://unsplash.com/photos/_SBsVi4kmkY/download ', 'https://unsplash.com/photos/4uYv2fEZ5PU/download ', 'https://unsplash.com/photos/4JnHWc2tuFE/download ' ]
然后就可以通過構造的url去發起請求下載圖片了,最后保存到imges文件夾下。

可能是由于網速的限制,太慢了,只保存了幾張。

完整代碼:
import requests
import json

ids = [] #設置成全局是因為我想存我取到的所有id
i = 0
def getHtml(url):
    headers = {
        'User-Agent': 'Mozilla/5.0'
    }
    try:
        r = requests.get(url,headers =headers) # , verify=False
        r.raise_for_status()
        r.encoding = 'utf-8'
        return r.text
    except:
        print('爬取失敗')
        return ''

def getId(html):
    jd = json.loads(html)
    for j in jd:
        ids.append(j['id'])

def getImg(url):
    global i
    for u in url:
        r = requests.get(u)#,verify=False,stream=True
        f = open('imges/'+ids[i]+'.jpg','ab')
        f.write(r.content)
        print('保存第{}張圖片成功'.format(i+1))
        i += 1
    print('全部圖片保存完成,共{}張圖片'.format(i+1))

def main():
    urls = []
    img_urls = []
    for i in range(10):
        url = 'https://unsplash.com/napi/photos?page='+str(i)+'&per_page=12&order_by=latest'#構造url動態的
        urls.append(url)
    for url in urls:
        html = getHtml(url)
        getId(html)
    for id in ids:
        ul = 'https://unsplash.com/photos/'+id+'/download' #構造下載圖片的url
        img_urls.append(ul)
    print(img_urls)
    getImg(img_urls)
main()
問題:

1、下載的速度太慢,不知道為什么。
2、保存的圖片有下載失敗的,可能是受網速的影響,直接在瀏覽器訪問也特別慢

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • APP定位 ? 圖片壁紙 采用Splash網站,提供的后臺支持,開發的第三方圖片壁紙客戶端。 API 說明 地...
    人失格閱讀 3,880評論 0 1
  • 聲明:本文講解的實戰內容,均僅用于學習交流,請勿用于任何商業用途! 一、前言 強烈建議:請在電腦的陪同下,閱讀本文...
    Bruce_Szh閱讀 12,783評論 6 28
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,973評論 19 139
  • 人生在世,就是要聰明地活,優雅地笑看人生。讀書使人明智,使人優雅。聰明的人活得愜意,傻笨的人總是在困境里面撞得頭破...
    淘氣2016閱讀 11,541評論 1 1
  • 說明:由于最新的2.0版本與下面的1.0版本圖文有很大的不同,所以請注意有些地方的變化,不過其實功能都大同小異! ...
    小游123閱讀 1,004評論 0 0