Python爬取藍奏雲直鏈(獲取真實文件地址)

最近在用藍奏雲,這款雲盤無限速而且操做分享簡單,自認爲挺好的一個雲盤,因此研究瞭如何經過藍奏雲分享連接獲取文件最終地址。你可能問爬取直鏈有什麼用,我說一下個人需求,個人服務器學生機帶寬是1m,很小。我運營着本身的app,我想要爲用戶提供升級更新,若是把最新安裝包放在我服務器上,1m就是128k/s,下載一個10m的安裝包都要好長時間,可是若是咱們將安裝包放在雲盤上,每次用戶請求更新,咱們只須要即時獲取安裝包在藍奏雲的真實地址返回給用戶,這樣用戶直接從獲取藍奏雲獲取apk文件,下載速度比直接從自身1m帶寬服務器快多了。因此,藍奏雲能夠做爲咱們存放共享資源文件的地方。php

  1. 直接以我雲盤上存放的一首歌爲例子,講解如何爬取藍奏雲直鏈。這個音樂分享地址爲https://www.lanzous.com/i3xcmaf
    Snipaste_2019-04-27_00-26-54.png
  2. 先貼完整代碼
#coding=utf-8
from bs4 import BeautifulSoup
import requests
import re
import json

#藍奏雲分享文件連接地址
url = 'https://www.lanzous.com/i3xcmaf'

#header頭,注意那個referer必需要與上面文件分享地址url相同
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.3',
    'referer': url
}

# 獲取分享頁面html文件
res = requests.get(url,headers=headers)

# 引入BeautifulSoup庫對html進行處理,獲取iframe中的出現的js文件
soup = BeautifulSoup(res.text,'html.parser')
url2 = 'https://www.lanzous.com/'+soup.find('iframe')['src']
res2 = requests.get(url2,headers=headers)

# 正則提取請求三個參數
a = re.findall(r'var a = \'([\w]+?)\';',res2.text)
params = re.findall(r'var [\w]{6} = \'([\w]+?)\';',res2.text)

# 請求下載地址
url3 = 'https://www.lanzous.com/ajaxm.php'
data = {
    'action':'down_process',
    'file_id':params[0],
    't':params[1],
    'k':params[2],
}
res3 = requests.post(url3,headers=headers,data=data)
res3 = json.loads(res3.content)

# 請求最終重定向地址
url4 = res3['dom']+'/file/'+res3['url']
headers2 = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
}
res4 = requests.head(url4, headers=headers2)
print res4.headers['Location']

複製代碼
  1. 先打開咱們例子中的分享連接
    Snipaste_2019-04-27_01-04-43.png

4.先來看看目前藍奏雲真實地址是什麼格式,直接選中電信下載右鍵,複製連接,其格式相似https://vip.d0.baidupan.com/file/?UzVSbA4/BDUFDAU9UWRdMVRrVGxf6QqRB4hWuQXCAapUsVWFC8tSJgR/C30LuFzmUbQO4wXTALBReFU+VXkDMVN1UmMOOgQ8BTYFDFFsXThUM1RpXzMKOgcyVmQFbAE1VHJVZAslUjsEYwttC2dcZFE+DjMFbwA0UXBVI1V5Az9TYVI1DmIEaQV8BWNRMV1zVDxUZl8vCmoHNFY1BWwBNFRlVTQLYVIwBGMLbQtuXDxROA4+BT4ANlFuVWdVawM3U2RSNQ42BDMFYAUxUT1dOFQ9VGVfNAomB21WIAVqASZUIVVxCzNSdAQ7CzkLYlxlUTwOPwVpADRRYFV1VX0Da1M+UmAONQRtBWIFZlEwXWpUPFRoXzkKOgc5VmEFdwEmVCFVcgtrUjcEfA==,相似這種,前面是文件服務器域名,後面跟着看着像base64格式的字符串。(拿這個連接複製到瀏覽器地址欄,回車就會建立下載任務,但其實這還不是最終地址,若是直接請求這個,獲得的只是html文件,它重定向後纔是真實文件地址,這點大坑,後面具體介紹) html

Snipaste_2019-04-27_01-05-59.png

  1. F12進入開發者模式,刷新網頁,列表會發現一個ajaxm.php文件,右面preview看見具體返回的響應內容,dom,url和剛纔上一步猜的真實地址格式正好相符,拼接一下就是地址。
    Snipaste_2019-04-27_01-05-20.png
  2. 切換headers,看到這是一個post請求,看一下下面的請求參數,咱們只要搞到這幾個參數怎麼生成的,就能構造post請求,拼接返回內容中的dom和url造成下載地址。

Snipaste_2019-04-27_01-17-00.png

Snipaste_2019-04-27_01-17-16.png

7.這幾個參數是如何生成的,右鍵看一下分享連接網站源代碼,其中箭頭標註的這個就是那個三個框 電信下載 聯通下載 普通下載 頁面 ajax

Snipaste_2019-04-27_01-21-23.png
8. 點進去,就出現下面這個頁面
Snipaste_2019-04-27_01-22-15.png
9. f12進入開發者模式,看一下具體內容,能夠看到方框標註的這幾個就是生成的用於文件請求參數,箭頭標註的和前面須要post請求的參數正好對應,至此咱們清楚了步驟。
Snipaste_2019-04-27_01-23-06.png
10. 首先,請求最初分享連接界面html文件,用BeautifulSoup解析拿到iframe中src,這個就是下載頁面的地址,其次而後請求這個src也就是下載頁面的地址,用正則表達式提取方框的三個參數(第一個a參數一直都是down_process,不變),而後對這個網址https://www.lanzous.com/ajaxm.php進行post請求,就拿到地址了。

#coding=utf-8
from bs4 import BeautifulSoup
import requests
import re
import json

#藍奏雲分享文件連接地址
url = 'https://www.lanzous.com/i3xcmaf'

#header頭,注意那個referer必需要與上面文件分享地址url相同
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.3',
    'referer': url
}

# 獲取分享頁面html文件
res = requests.get(url,headers=headers)

# 引入BeautifulSoup庫對html進行處理,獲取iframe中的出現的js文件
soup = BeautifulSoup(res.text,'html.parser')
url2 = 'https://www.lanzous.com/'+soup.find('iframe')['src']
res2 = requests.get(url2,headers=headers)

# 正則提取請求三個參數
a = re.findall(r'var a = \'([\w]+?)\';',res2.text)
params = re.findall(r'var [\w]{6} = \'([\w]+?)\';',res2.text)

# 請求下載地址
url3 = 'https://www.lanzous.com/ajaxm.php'
data = {
    'action':'down_process',
    'file_id':params[0],
    't':params[1],
    'k':params[2],
}
res3 = requests.post(url3,headers=headers,data=data)
res3 = json.loads(res3.content)

# 請求最終地址
url4 = res3['dom']+'/file/'+res3['url']
print url4
複製代碼

Snipaste_2019-04-27_01-34-29.png
11. 可是,咱們用get請求這個地址,打印返回內容發現裏面是html內容
Snipaste_2019-04-27_01-37-07.png

  1. 這點坑我好久,我看了一下瀏覽器那個ajax請求,狀態碼是302重定向,我試了很久仍是返回html,我最後乾脆將瀏覽器的headers頭所有加進去了,發現重定向成功了,返回的就是音樂文件,裏面二進制亂碼。我headers頭一個個刪除看哪條信息是有用的,最後發現Accept-Language必需要有,這點好坑的
    Snipaste_2019-04-27_01-40-14.png
  2. 知道了這個,咱們拿到那個下載地址,而後再重定向一下就能夠了,注意獲取重定向地址沒必要進行get請求,由於這回請求整個文件,直接request.head()進行請求,而後打印res.headers['Location']就是重定向信息,這樣請求只是請求頭信息,沒必要請求整個文件。
  3. 最後貼上完整代碼
#coding=utf-8
from bs4 import BeautifulSoup
import requests
import re
import json

#藍奏雲分享文件連接地址
url = 'https://www.lanzous.com/i3xcmaf'

#header頭,注意那個referer必需要與上面文件分享地址url相同
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.3',
    'referer': url
}

# 獲取分享頁面html文件
res = requests.get(url,headers=headers)

# 引入BeautifulSoup庫對html進行處理,獲取iframe中的出現的js文件
soup = BeautifulSoup(res.text,'html.parser')
url2 = 'https://www.lanzous.com/'+soup.find('iframe')['src']
res2 = requests.get(url2,headers=headers)

# 正則提取請求三個參數
a = re.findall(r'var a = \'([\w]+?)\';',res2.text)
params = re.findall(r'var [\w]{6} = \'([\w]+?)\';',res2.text)

# 請求下載地址
url3 = 'https://www.lanzous.com/ajaxm.php'
data = {
    'action':'down_process',
    'file_id':params[0],
    't':params[1],
    'k':params[2],
}
res3 = requests.post(url3,headers=headers,data=data)
res3 = json.loads(res3.content)

# 請求最終重定向地址
url4 = res3['dom']+'/file/'+res3['url']
headers2 = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
}
res4 = requests.head(url4, headers=headers2)
print res4.headers['Location']

複製代碼
相關文章
相關標籤/搜索