1. 程式人生 > >使用python實現帶密碼的百度雲資源自動儲存以及資料夾建立

使用python實現帶密碼的百度雲資源自動儲存以及資料夾建立

實現功能

  • 將網盤的密碼自動輸入,得到真實的連結頁面,並得到引數將檔案自動儲存到指定的資料夾,資料夾可以自己建立

  • 只需要提供網盤的連結和密碼,以及自己登陸百度網盤後得到的兩個cookie

  • 可以在雲主機上執行(關於雲主機安裝chrome的介紹)

  • python的版本為3.6.5。
  • 使用selenium進行瀏覽器模擬。
  • 使用了谷歌的瀏覽器驅動(Handless Chrome,即不呼叫GUI的驅動)。
  • 參考的教程
  • 上面的教程主要是介紹了要操作的檔案的資訊的提取以及提供了實現。
  • 博主使用的是IE的開發者模式來進行網頁的解析,在清楚了諸如儲存,建立檔案的操作對應的連結後,之後就是觀察是否有是動態變數引數
    ,或者是cookie
  • 事實上一開始想要檢驗一下環境有沒有搭建錯誤的話,可以直接把請求的header以及url整個複製下來,使用python自帶的urllib庫進行測試。

使用的庫

import json
import re
import smtplib
import time
import requests

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys

實現流程

通過對瀏覽器環境的模擬,可以得到百度網盤的的非同步呼叫載入的有用資訊,從而實現對資源的自動儲存,具體資訊的解析上面的部落格說的比較詳細,這裡就不多贅述。
而獲得資訊後,所要進行的就是通過模擬HTTP請求

,通過POST請求將建立資料夾以及儲存檔案的動作實現
而所需要注意的就是POST的連結的引數,HTTP的header以及要提交的請求正文(以上資訊可在瀏覽器開發者模式下檢視),如果連結的引數或者請求正文的內容出錯則會返回錯誤碼errno:2,如果header裡面的cookie缺失了,並且該網盤連結需要密碼,則可能會返回錯誤碼errno:-9,這裡附上網友整理的常見錯誤碼

header構建以及初始化

    def init_head(self, bdclnd):
        self.headers = {
            'Accept': '*/*',
            'Accept-Encoding'
: 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.8', 'Connection': 'keep-alive', 'Content-Length': '161', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', #這裡如果是連結需要密碼,則需要多加一個叫BDCLND的cookie,不需要密碼則不用 #STOKEN,BDUSS都可以直接用瀏覽器裡面的cookie 'Cookie': 'BDCLND=%s;BDUSS=%s;STOKEN=%s' % (bdclnd, self.bduss, self.stoken), 'Host': 'pan.baidu.com', 'Origin': 'https://pan.baidu.com', 'Referer': 'https://pan.baidu.com/s/1mjI3AEs', #可以直接在瀏覽器的開發者模式下找自己User-Agent 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' ' (KHTML, like Gecko) Chrome/64.0.3282.140 ' 'Safari/537.36 Edge/17.17134', 'X-Requested-With': 'XMLHttpRequest', }
    def __init__(self, bduss, stoken, bdstoken, password):
	    #這裡的bdstoken是url的引數,在百度雲隨便操作看一下就可以了,貌似對身份驗證沒有影響
	    #bduss和stoken都是百度下的cookie
        self.bdstoken = bdstoken
        self.bduss = bduss
        self.stoken = stoken
        #網盤的密碼
        self.password = password
        chrome_options = Options()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')
        #這裡的--no-sandbox針對的是Linux的雲主機,如果不加可能無法啟動,至少博主啟動不了
        #如果是使用windows,就安裝谷歌瀏覽器,並找到安裝路徑下的啟動程式
        #如果是Linux就有點麻煩,必須經過一些配置
        #兩者都需要下載谷歌驅動
        chrome_options.add_argument("--no-sandbox")
        # chrome_options.binary_location = 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
        # self.driver = webdriver.Chrome(chrome_options=chrome_options)
        chrome_options.binary_location = '/opt/google/chrome/chrome'
        self.driver = webdriver.Chrome(executable_path='/opt/google/chrome/chromedriver', chrome_options=chrome_options)

雲主機Linux安裝谷歌瀏覽器的小教程

2018-06-05 23:24:11 cd /etc/yum.repos.d/
2018-06-05 23:24:20 vim google-chrome.repo
2018-06-05 23:36:41 yum -y install google-chrome-stable --nogpgcheck

google-chrome.repo檔案的內容

[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl.google.com/linux/linux_signing_key.pub

檔案儲存所需資訊的獲取

    def get_file_info(self, url):
	    # 使用sleep是因為ajax是非同步載入,防止頁面沒有完全載入
        self.driver.get(url)
        time.sleep(1)
        self.driver.get(url)
        # 輸入網盤密碼框,這裡直接取input框的第一個
        elem = self.driver.find_elements_by_tag_name('input')[0]
        # 模擬輸入
        elem.send_keys(self.password)
        #模擬回車
        elem.send_keys(Keys.ENTER)
        time.sleep(3)
        # 初始化header,並得到'BDCLND'這個cookie
        self.init_head(self.driver.get_cookie('BDCLND')['value'])
        
        #元素解析,程式碼全部來自於他人
        script_list = self.driver.find_elements_by_xpath("//body/script")
        inner_html = script_list[-1].get_attribute("innerHTML")

        pattern = 'yunData.SHARE_ID = "(.*?)"[\s\S]*yunData.SHARE_UK = "(.*?)"[\s\S]*yunData.FILEINFO = (.*?);[\s\S]*'
        # [\s\S]*可以匹配包括換行的所有字元,\s表示空格,\S表示非空格字元
        srch_ob = re.search(pattern, inner_html)

        share_id = srch_ob.group(1)
        share_uk = srch_ob.group(2)

        file_info_jsls = json.loads(srch_ob.group(3))
        path_list_str = u'['
        for file_info in file_info_jsls:
            path_list_str += u'"' + file_info['path'] + u'",'

        path_list_str = path_list_str[:-1]
        path_list_str += u']'

        return share_id, share_uk, path_list_str

資料夾建立以及檔案儲存

    def transfer(self, share_id, uk, filelist_str, path_t_save):
	    #share_id和uk都要通過解析得到, filelist_str為自己一開始設定的儲存位置
	    #注意,這裡由於可以自動建立資料夾,所以保證了資料夾一定存在
	    #如果資料夾不存在,直接儲存彙報errno:2的錯誤
        # 通用引數
        ondup = "newcopy"
        async = "1"
        channel = "chunlei"
        clienttype = "0"
        web = "1"
        app_id = "250528"
        #博主使用自己瀏覽器上的好像沒什麼影響
        logid = "MTUyODI4ODUxNjk0NjAuODAxMTA1MDc2ODE4Njg0Mw=="
        # 儲存檔案的連結
        url_trans = "https://pan.baidu.com/share/transfer?shareid=%s" \
                    "&from=%s" \
                    "&ondup=%s" \
                    "&async=%s" \
                    "&bdstoken=%s" \
                    "&channel=%s" \
                    "&clienttype=%s" \
                    "&web=%s" \
                    "&app_id=%s" \
                    "&logid=%s&clienttype=0" % (
                        share_id, uk, ondup, async, self.bdstoken, channel, clienttype, web, app_id, logid)

		#建立資料夾得請求正文
		#注意在瀏覽器看到得是url編碼格式
        create_floder = {
	        # 不知道是什麼,大部分情況為空
            'block_list': '[]',
            'isdir': '1',
            # 儲存的位置,建立資料夾
            'path': path_t_save
        }
        # 建立資料夾的連結
        url_create = 'https://pan.baidu.com/api/create?a=commit' \
                     '&channel=chunlei' \
                     '&web=1' \
                     '&app_id=250528' \
                     '&bdstoken=%s' \
                     '&logid=%s' \
                     '&clienttype=0' % (self.bdstoken, logid)
        response = requests.post(url_create, data=create_floder, headers=self.headers)
        print(response.content)

		# 儲存檔案的請求正文
        form_data = {
            'filelist': filelist_str,
            'path': path_t_save,
        }
        response = requests.post(url_trans, data=form_data, headers=self.headers)
        print(response.content)

        jsob = json.loads(response.content)

        if "errno" in jsob:
            return jsob["errno"]
        else:
            return None

相關推薦

使用python實現密碼資源自動儲存以及資料建立

實現功能 將網盤的密碼自動輸入,得到真實的連結頁面,並得到引數將檔案自動儲存到指定的資料夾,資料夾可以自己建立 只需要提供網盤的連結和密碼,以及自己登陸百度網盤後得到的兩個cookie 可以

python實現簡單的自動下載

pan odin ret lines spa lee 自動 資源 class 最近女同讓我幫助從百度雲下載200個文件,給了我連接和提取碼,這種重復的工作不適合人做寫了一個簡單的爬蟲 #coding=utf-8 ‘‘‘ 自動填寫提取碼下載百度雲資源 方法: for 讀

Python爬蟲實戰:抓取並儲存資源(附程式碼)

尋找並分析百度雲的轉存api 首先你得有一個百度雲盤的賬號,然後登入,用瀏覽器(這裡用火狐瀏覽器做示範)開啟一個分享連結。F12開啟控制檯進行抓包。手動進行轉存操作:全選檔案->儲存到網盤->選擇路徑->確定。點選【確定】前建議先清空一下抓包記錄,這樣可以精確定位到轉存的api,這就是

神級python碼農教你爬取並儲存資源,你懂得~

網路爬蟲又被稱為網路機器人,網頁蜘蛛,在FOAF社群中間稱為網頁追逐者。是按照一定的規則,自動抓取資訊的程式或者指令碼。這篇文章主要介紹Python爬蟲框實戰之抓取並儲存百度雲資源!免費給廣大python愛好者提供資源!)   尋找並分析百度雲的轉存api 首先你得有一個

Python爬取並快閃記憶體微信群裡的資源

需求背景: 最近誤入一個免費(daoban)資源的分享群(正經臉),群裡每天都在刷資源連結。但是大家都知道,百度雲的分享連結是很容易被河蟹的,群裡除了分享連結外,就是各種抱怨 “怎麼又失效了”,“又河蟹了...”。本著學習技術的初心,於是我就開始研究怎樣自動爬取微信群的訊息並

Python機器學習教程全集

doc sina com gin .com p s l口 shuf www vl握換猶2n竊春8http://www.docin.com/sina_6264039129 6aq韶06壞s雷鼗6mchttp://huiyi.docin.com/sina_6263958852

python實現簡單的搜索

python 百度 爬蟲#!/usr/bin/python # coding=utf-8 import urllib import urllib2 #實現百度關鍵字查詢的小例子 #定義基礎url url = "http://www.baidu.com/s?" #定義請求頭信息 headers = {"U

資源下載加速軟件推薦:proxyee-down

center 不用 檢測 都是 ali 安裝 png 開會 進行 百度雲是個好東西(現在叫百度網盤不過我還是習慣叫百度雲),2個T的免費容量可以存視頻、軟件包等各式文件,就是下載速度有點讓人看不下去,不開會員的話就算你是百兆光纖還是量子通信都是被限速的,做為一個商業公司還是

Linux終端使用wget下載資源 解決資料過分大傳輸不到伺服器上的問題

很多時候為了方便將大檔案放到百度雲盤中作為共享資源。 在windows下和Linux桌面系統中,使用瀏覽器很容易下載百度雲盤裡的共享資源,但當我們使用Linux字元介面的時候,就會變的很麻煩。 一直在找解決的方法,有人使用百度雲應用,通過百度雲Linux客戶端來解決檔案上傳與下載問題。

mac下加速下載資源

說明:windows下有大神開發的工具,可以繞過百度的客戶端限制快速下載。最近使用mac也遇到這樣的問題,在網上查找了,解決辦法總結如下(操作成功) 下載安裝Aria2GUI 下載chrome擴充套件https://github.com/acgotaku/Ba

Linux 環境下載資源

Ubuntu 系統從百度網盤下載大檔案不方便 安裝Firefox 外掛地址 https://addons.mozilla.org/zh-CN/firefox/addon/baidu-pan-exporter/ 安裝後重啟Firefox,然後百度雲下載介面就會多出一個選項:匯出下載&nbs

Python入門視頻質量如何?

背景 最大 進入 中心 通過 原來 百度雲 百度 fff 百度雲網盤跟其他網盤不一樣的地方是:百度雲網盤是一個集群。這是一個大的百度雲,覆蓋你網絡生活的方方面面,給我們帶來了極大的便利。相信有很大一部分同學在找學習視頻的時候,都會到百度雲上找。那麽Python入門視頻百度雲

厲害了,我的國資源

電影燃爆了,雖然是紀錄片,但是不妨礙它成為一部熱血大片。脫離電影來說,這是偉大祖國的故事,展現了很多歷史珍貴的瞬間,真的是看出了滿滿的自豪感。由中央電視臺和中國電影股份有限公司聯合出品的大型紀錄電影《厲害了,我的國》。影片不僅記錄了中國橋、中國路、中國車、中國港、中國網等一個

神器| 資源搜尋(內含福利!)

每天進步一點點,距離大腿又近一步! 每日一言:清醒時做事,糊塗時讀書,大怒時睡覺 昨天其實有推文,但感覺寫點不好,就刪掉了,實在抱歉!給大家推薦幾款神器,請注意查收了! 雲盤精靈可以搜尋全網百度雲資源,功能強大,自帶資源失效監測,你想要的資源這裡

命令列使用wget下載資源

步驟一:在百度雲把需要下載的資源共享出來 例如我的檔案的下載映象 http://pan.baidu.com/s/1i3D5rU1 步驟二:獲取共享資源的實際下載地址 通過在瀏覽器中先點選下載,再拷貝下載連結獲取 https://d11.baidupcs.com/fil

Linux終端使用wget下載資源 解決資料過分大傳輸不到伺服器上的問題

很多時候為了方便將大檔案放到百度雲盤中作為共享資源。 在windows下和Linux桌面系統中,使用瀏覽器很容易下載百度雲盤裡的共享資源,但當我們使用Linux字元介面的時候,就會變的很麻煩。 一直在找解決的方法,有人使用百度雲應用,通過百度雲Linux客戶端來解決檔案上

linux 命令列使用wget下載資源

步驟一:在百度雲把需要下載的資源共享出來。 比如我這裡分享一個windows 的下載映象 http://pan.baidu.com/s/1o6rdkW6 步驟二:獲取共享資源的實際下載地址,這個可以在瀏覽器中先點選下載,再拷貝下載連結(各種手段都可以,這個不多手) htt

ubuntu命令列使用wget下載資源

命令列使用wget下載百度雲資源 步驟一:在百度雲把需要下載的資源共享出來 例如我的檔案的下載映象 https://pan.baidu.com/s/1lGjbeZn0tn5b1PNcf8Qx5A 步驟二:獲取共享資源的實際下載地址 通過在瀏覽器中先點選下載,再

【Java視訊教程等資源分享】

韓順平javase(87講)密碼:hsp789 韓順平javaee(66講)密碼:hsp789 韓順平J2EE視訊實戰教程(20講)密碼:hsp789  2016黑馬java EE + hadoop大資料(壓縮版) 黑馬java的基

Linux終端利用BaiduPCS-Go 直接下載資源

之所以使用BaiduPCS-Go 只是因為我在騰訊雲上的Linux系統貌似只給我一個終端,要從百度雲上下載檔案也只能在 終端操作 關於下載速度的話,筆者 下載了一個500M 的資料集 上次在騰訊雲上下載 很不穩定   這次在虛擬機器上下載 速度快的很  相比百度雲客戶