最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用Python自動(dòng)下載網(wǎng)站所有文件

 更新時(shí)間:2021年03月22日 16:10:35   作者:somenzz  
這篇文章主要介紹了如何用Python自動(dòng)下載網(wǎng)站所有文件,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下

最近維基 jie mi 徹底公開(kāi)了網(wǎng)站的全部文件,我就在想如何使用 Python 將其下載到本地永久保存,于是就有了這篇文章,寫(xiě)爬蟲(chóng)會(huì)遇到很多坑,借鑒他人經(jīng)驗(yàn),考慮越全面,出錯(cuò)的概率就越小。

假如一個(gè)網(wǎng)站,里面有很多鏈接,有指向文件的,有指向新鏈接的,新的鏈接點(diǎn)擊進(jìn)去后,仍然是有指向文件的,有指向新鏈接的,類似一個(gè)文件夾,里面即有文件,又有目錄,目錄中又有文件和目錄。如何從這樣的網(wǎng)站上下載所有的文件,并按網(wǎng)站的目錄結(jié)構(gòu)來(lái)保存這些文件呢?

關(guān)鍵詞:Python、下載、正則表達(dá)式、遞歸。

按照自頂向下來(lái)設(shè)計(jì)程序,我們整理自己的思路,然后使用 Python 語(yǔ)言來(lái)翻譯下即可。

思路:由于目錄的深度不固定,也不可能窮舉,且每一個(gè)目錄的處理方式和子目錄父目錄的處理流程都是一樣的,因此我們可以使用遞歸來(lái)下載所有文件。

遞歸代碼必須要有退出條件,退出條件要放在前面,本例中的遞歸退出條件就是:如果是文件就下載,下載完遞歸函數(shù)即完成任務(wù)。

總體思路:

1、給定一個(gè) url,判斷是否是文件,如果是文件,下載即可,然后函數(shù)結(jié)束。

2、如果給定 url 不是文件,那么訪問(wèn)該 url,并獲取它下面的所有鏈接。

3、遍歷步驟 2 產(chǎn)生的所有鏈接,遞歸的執(zhí)行步驟 1 和 2,直到程序運(yùn)行結(jié)束。

以上思路,用代碼描述如下:

import urllib.request
import requests
import re, os


def get_file(url):
 '''
 遞歸下載網(wǎng)站的文件
 :param url:
 :return:
 '''
 if isFile(url):
  print(url)
  try:
   download(url)
  except:
   pass
 else:
  urls = get_url(url)
  for u in urls:
   get_file(u)

前面導(dǎo)入的包在接下來(lái)函數(shù)中會(huì)用到,下面就是逐漸層向下,實(shí)現(xiàn)子功能。

判斷鏈接是否指向文件:

這里總結(jié) url 規(guī)律,很容易寫(xiě)出。

def isFile(url):
 '''
 判斷一個(gè)鏈接是否是文件
 :param url:
 :return:
 '''
 if url.endswith('/'):
  return False
 else:
  return True

下載文件:

下載文件時(shí)要從 url 中獲取文件應(yīng)該存儲(chǔ)的位置,并使用 os.makedirs 來(lái)創(chuàng)建多級(jí)目錄。然后使用 urllib.request.urlretrieve 來(lái)下載文件。

def download(url):
 '''
 :param url:文件鏈接
 :return: 下載文件,自動(dòng)創(chuàng)建目錄
 '''
 full_name = url.split('//')[-1]
 filename = full_name.split('/')[-1]
 dirname = "/".join(full_name.split('/')[:-1])
 if os.path.exists(dirname):
  pass
 else:
  os.makedirs(dirname, exist_ok=True)
 urllib.request.urlretrieve(url, full_name)

獲取 url 下的所有鏈接:

這里要具體網(wǎng)站具體分析,看看如何使用正則表達(dá)式獲取網(wǎng)頁(yè)中的鏈接,這樣的正則表達(dá)式可以說(shuō)是再簡(jiǎn)單不過(guò)了。

def get_url(base_url):
 '''
 :param base_url:給定一個(gè)網(wǎng)址
 :return: 獲取給定網(wǎng)址中的所有鏈接
 '''
 text = ''
 try:
  text = requests.get(base_url).text
 except Exception as e:
  print("error - > ",base_url,e)
  pass
 reg = '<a href="(.*)" rel="external nofollow" >.*</a>'
 urls = [base_url + url for url in re.findall(reg, text) if url != '../']
 return urls

這里有個(gè)小坑,就是網(wǎng)站有個(gè)鏈接是返回上級(jí)頁(yè)面的,url 的后輟是 '../' 這樣的鏈接要去掉,否則遞歸函數(shù)就限入了死循環(huán)。

接下來(lái)就是寫(xiě)主函數(shù),執(zhí)行任務(wù)了,慢慢等它下載完吧。

if __name__ == '__main__':
 get_file('https://file.wikileaks.org/file/')

其實(shí),還會(huì)存兩個(gè)問(wèn)題:

1、假如網(wǎng)站某頁(yè)有個(gè)鏈接它指向了首頁(yè),那么遞歸程序仍然會(huì)限入一個(gè)死循環(huán),解決方法就是將訪問(wèn)過(guò)的 url 保存在一個(gè)列表里(或者其他數(shù)據(jù)結(jié)構(gòu)),如果接下來(lái)要訪問(wèn)的 url 不在此列表中,那么就訪問(wèn),否則就忽略。

2、如果下載的過(guò)程中程序突然報(bào)錯(cuò)退出了,由于下載文件較慢,為了節(jié)約時(shí)間,那么如何讓程序從報(bào)錯(cuò)處繼續(xù)運(yùn)行呢?這里可采用分層遞歸,一開(kāi)始時(shí)先獲取網(wǎng)站的所有一級(jí) url 鏈接,順序遍歷這些一級(jí) url 鏈接,執(zhí)行上述的 get_file(url) ,每訪問(wèn)一次一級(jí) url 就將其索引位置加1(索引位置默認(rèn)為0,存儲(chǔ)在文件中或數(shù)據(jù)庫(kù)中),程序中斷后再運(yùn)行時(shí)先讀取索引,然后從索引處開(kāi)始執(zhí)行即可。另外,每下載成功一個(gè)文件,就把對(duì)應(yīng)的 url 也保存在文件中或數(shù)據(jù)庫(kù)中,如果一級(jí) url 下的鏈接已經(jīng)下載過(guò)文件,那么就不需要重新下載了。

以上就是用Python自動(dòng)下載網(wǎng)站所有文件的詳細(xì)內(nèi)容,更多關(guān)于python 自動(dòng)下載網(wǎng)站文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python技巧之變長(zhǎng)和定長(zhǎng)序列拆分

    Python技巧之變長(zhǎng)和定長(zhǎng)序列拆分

    這篇文章主要給大家分享的是Python技巧之變長(zhǎng)和定長(zhǎng)序列拆分,Python中的任何序列(可迭代的對(duì)象)都可以通過(guò)賦值操作進(jìn)行拆分,包括但不限于元組、列表、字符串、文件、迭代器、生成器等。想了解更多詳細(xì)的小伙伴請(qǐng)參考下面文章內(nèi)容
    2021-12-12
  • python 實(shí)現(xiàn)分頁(yè)顯示從es中獲取的數(shù)據(jù)方法

    python 實(shí)現(xiàn)分頁(yè)顯示從es中獲取的數(shù)據(jù)方法

    今天小編就為大家分享一篇python 實(shí)現(xiàn)分頁(yè)顯示從es中獲取的數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • python剪切視頻與合并視頻的實(shí)現(xiàn)

    python剪切視頻與合并視頻的實(shí)現(xiàn)

    這篇文章主要介紹了python剪切視頻與合并視頻的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • python調(diào)用git出錯(cuò)的解決

    python調(diào)用git出錯(cuò)的解決

    這篇文章主要介紹了python調(diào)用git出錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Python基礎(chǔ)詳解之郵件處理

    Python基礎(chǔ)詳解之郵件處理

    這篇文章主要介紹了Python基礎(chǔ)詳解之郵件處理,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Django實(shí)現(xiàn)視頻播放的具體示例

    Django實(shí)現(xiàn)視頻播放的具體示例

    本文主要介紹了Django實(shí)現(xiàn)視頻播放的具體示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>
    2022-05-05
  • python如何使用正則表達(dá)式的前向、后向搜索及前向搜索否定模式詳解

    python如何使用正則表達(dá)式的前向、后向搜索及前向搜索否定模式詳解

    這篇文章主要給大家介紹了關(guān)于python如何使用正則表達(dá)式的前向、后向搜索及前向搜索否定模式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-11-11
  • Python裝飾器用法實(shí)例總結(jié)

    Python裝飾器用法實(shí)例總結(jié)

    這篇文章主要介紹了Python裝飾器用法,結(jié)合實(shí)例形式總結(jié)分析了Python裝飾器的功能、原理及常見(jiàn)使用方法,需要的朋友可以參考下
    2018-05-05
  • Python2比較當(dāng)前圖片跟圖庫(kù)哪個(gè)圖片相似的方法示例

    Python2比較當(dāng)前圖片跟圖庫(kù)哪個(gè)圖片相似的方法示例

    這篇文章主要介紹了Python2比較當(dāng)前圖片跟圖庫(kù)哪個(gè)圖片相似的方法,結(jié)合實(shí)例形式分析了Python文件目錄操作及圖形運(yùn)算相關(guān)使用技巧,需要的朋友可以參考下
    2019-09-09
  • Python IDLE清空窗口的實(shí)例

    Python IDLE清空窗口的實(shí)例

    今天小編就為大家分享一篇Python IDLE清空窗口的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06

最新評(píng)論

区。| 九寨沟县| 通江县| 玉龙| 秦安县| 连云港市| 蒙自县| 垦利县| 那坡县| 孙吴县| 罗山县| 天气| 许昌县| 绵竹市| 武定县| 湖北省| 东台市| 库伦旗| 宜昌市| 襄汾县| 定南县| 阳山县| 开平市| 浦城县| 维西| 潞城市| 内乡县| 平乡县| 轮台县| 根河市| 扶风县| 麻江县| 宕昌县| 新建县| 菏泽市| 孟津县| 依安县| 兴和县| 沾化县| 同心县| 酒泉市|