首頁 > 軟體

利用Python抓取阿里雲盤資源

2022-02-22 13:01:58

前陣子阿里雲盤大火,送了好多的容量空間。而且阿里雲盤下載是不限速,這點比百度網路硬碟好太多了。這兩天看到一個第三方網站可以搜尋阿里雲盤上的資源,但是它的資源順序不是按時間排序的。這種情況會造成排在前面時間久遠的資源是一個已經失效的資源。小編這裡用 python 抓取後重新排序。

網頁分析

這個網站有兩個搜尋路線:搜尋線路一和搜尋線路二,本文章使用的是搜尋線路二。

開啟控制面板下的網路,一眼就看到一個 seach.html 的 get 請求。

上面帶了好幾個引數,四個關鍵引數:

  • page:頁數,
  • keyword:搜尋的關鍵字
  • category:檔案分類,all(全部),video(視訊),image(圖片),doc(檔案),audio(音訊),zip(壓縮檔案),others(其他),指令碼中預設寫 all
  • search_model:搜尋的線路

也是在控制面板中,看出這個網頁跳轉到阿里雲盤獲取真實的的連結是在標題上面的。用 bs4 解析頁面上的 div(class=resource-item border-dashed-eee) 標籤下的 a 標籤就能得到跳轉網路硬碟的地址,解析 div 下的 p 標籤獲取資源日期。

抓取與解析

首先安裝需要的 bs4 第三方庫用於解析頁面。

pip3 install bs4

下面是抓取解析網頁的指令碼程式碼,最後按日期降序排序。

import requests
from bs4 import BeautifulSoup
import string


word = input('請輸入要搜尋的資源名稱:')
    
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
}

result_list = []
for i in range(1, 11):
    print('正在搜尋第 {} 頁'.format(i))
    params = {
        'page': i,
        'keyword': word,
        'search_folder_or_file': 0,
        'is_search_folder_content': 0,
        'is_search_path_title': 0,
        'category': 'all',
        'file_extension': 'all',
        'search_model': 0
    }
    response_html = requests.get('https://www.alipanso.com/search.html', headers = headers,params=params)
    response_data = response_html.content.decode()
   
    soup = BeautifulSoup(response_data, "html.parser");
    divs = soup.find_all('div', class_='resource-item border-dashed-eee')
    
    if len(divs) <= 0:
        break

    for div in divs[1:]:
        p = div.find('p',class_='em')
        if p == None:
            break

        download_url = 'https://www.alipanso.com/' + div.a['href']
        date = p.text.strip();
        name = div.a.text.strip();
        result_list.append({'date':date, 'name':name, 'url':download_url})
    
    if len(result_list) == 0:
        break
    
result_list.sort(key=lambda k: k.get('date'),reverse=True)

範例結果:

模板

上面抓取完內容後,還需要將內容一個個複製到 google 瀏覽器中存取,有點太麻煩了。要是直接點選一下能存取就好了。小編在這裡就用 Python 的模板方式寫一個 html 檔案。

模板檔案小編是用 elements-ui 做的,下面是關鍵的程式碼:

<body>
    <div id="app">
        <el-table :data="table" style="width: 100%" :row-class-name="tableRowClassName">
            <el-table-column prop="date" label="日期" width="180"> </el-table-column>
            <el-table-column prop="name" label="名稱" width="600"> </el-table-column>
            <el-table-column label="連結">
              <template slot-scope="scope">
              <a :href="'http://'+scope.row.url" rel="external nofollow" 
                target="_blank"
                class="buttonText">{{scope.row.url}}</a>
            </template>
        </el-table>
    </div>

    <script>
      const App = {
        data() {
          return {
              table: ${elements}
            
          };
        }
      };
      const app = Vue.createApp(App);
      app.use(ElementPlus);
      app.mount("#app");
    </script>
  </body>

在 python 中讀取這個模板檔案,並將 ${elements} 關鍵詞替換為上面的解析結果。最後生成一個 report.html 檔案。

with open("aliso.html", encoding='utf-8') as t:
    template = string.Template(t.read())

final_output = template.substitute(elements=result_list)
with open("report.html", "w", encoding='utf-8') as output:
    output.write(final_output)

範例結果:

跳轉到阿里雲盤介面

完整程式碼

aliso.html

<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0" />
    <script src="https://unpkg.com/vue@next"></script>
    <!-- import CSS -->
    <link rel="stylesheet" href="https://unpkg.com/element-plus/dist/index.css">
    <!-- import JavaScript -->
    <script src="https://unpkg.com/element-plus"></script>
    <title>阿里雲盤資源</title>
  </head>
  <body>
    <div id="app">

        <el-table :data="table" style="width: 100%" :row-class-name="tableRowClassName">
            <el-table-column prop="date" label="日期" width="180"> </el-table-column>
            <el-table-column prop="name" label="名稱" width="600"> </el-table-column>
            <el-table-column label="連結">
              <template v-slot="scope">
              <a :href="scope.row.url"
                target="_blank"
                class="buttonText">{{scope.row.url}}</a>
            </template>
        </el-table>
    </div>

    <script>
      const App = {
        data() {
          return {
              table: ${elements}
            
          };
        }
      };
      const app = Vue.createApp(App);
      app.use(ElementPlus);
      app.mount("#app");
    </script>
  </body>
</html>

aliso.py

# -*- coding: UTF-8 -*-

import requests
from bs4 import BeautifulSoup
import string


word = input('請輸入要搜尋的資源名稱:')
    
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
}

result_list = []
for i in range(1, 11):
    print('正在搜尋第 {} 頁'.format(i))
    params = {
        'page': i,
        'keyword': word,
        'search_folder_or_file': 0,
        'is_search_folder_content': 0,
        'is_search_path_title': 0,
        'category': 'all',
        'file_extension': 'all',
        'search_model': 2
    }
    response_html = requests.get('https://www.alipanso.com/search.html', headers = headers,params=params)
    response_data = response_html.content.decode()
   
    soup = BeautifulSoup(response_data, "html.parser");
    divs = soup.find_all('div', class_='resource-item border-dashed-eee')
    
    if len(divs) <= 0:
        break

    for div in divs[1:]:
        p = div.find('p',class_='em')
        if p == None:
            break

        download_url = 'https://www.alipanso.com/' + div.a['href']
        date = p.text.strip();
        name = div.a.text.strip();
        result_list.append({'date':date, 'name':name, 'url':download_url})
    
    if len(result_list) == 0:
        break
    
result_list.sort(key=lambda k: k.get('date'),reverse=True)
print(result_list)

with open("aliso.html", encoding='utf-8') as t:
    template = string.Template(t.read())

final_output = template.substitute(elements=result_list)
with open("report.html", "w", encoding='utf-8') as output:
    output.write(final_output)

總結

用 python 做一些小爬蟲,不僅去掉網站上煩人的廣告,也更加的便利了。

以上就是利用Python抓取阿里雲盤資源的詳細內容,更多關於Python抓取雲盤資源的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com