中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何爬取并下載電影天堂中的3千多部電影

發布時間:2021-07-26 11:40:17 來源:億速云 閱讀:200 作者:小新 欄目:開發技術

小編給大家分享一下Python如何爬取并下載電影天堂中的3千多部電影,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

這次我們要爬取的網站是:《電影天堂》,屯一些電影,等無聊的時候拿出來看看,消遣消遣也是不錯。

Python如何爬取并下載電影天堂中的3千多部電影

這次的網站,從爬蟲的技術角度上來講,難度不大,而且可以說是非常簡單了。但是,它實用啊!你想嘛,早上上班前跑一下爬蟲,晚上回家以后已經有幾十部最新大片在你硬盤里等著你啦,累了一天躺床上看看電影,這種感覺是不是很爽啊。

而且正因為這個爬蟲比較簡單,所以我會寫的稍微細一點,爭取讓 python 小白們也能盡可能看懂,并且能夠在這個爬蟲的基礎上修改,得到爬取這個網站其他板塊或者其他電影網站的爬蟲。

寫在前面的話

在編寫爬蟲程序之前,我先捋一捋我們的思路。

  1. 爬蟲的原理,是通過給定的一個 URL(就是類似于 http://www.baidu.com 這樣的,俗稱網址的東東) 請求,去訪問一個網頁,獲取那個網頁上的源代碼(不知道源代碼的,隨便打開一個網頁,右鍵,查看網頁源代碼,出來的一大堆像亂碼一樣的東西就是網頁源代碼,我們需要的數據就藏在這些源代碼里面)并返回來。

  2. 然后,通過一些手段(比如說json庫,BeautifulSoup庫,正則表達式等)從網頁源代碼中篩選出我們想要的數據(當然,前提是我們需要分析網頁結構,知道自己想要什么數據,以及這些數據存放在網頁的哪兒,存放的位置有什么特征等)。

  3. 最后,將我們獲取到的數據按照一定的格式,存儲到本地或者數據庫中,這樣就完成了爬蟲的全部工作。

當然,也有一些 「騷操作」,如果你嫌爬蟲效率低,可以開多線程(就是相當于幾十只爬蟲同時給你爬,效率直接翻了幾十倍);如果擔心爬取頻率過高被網站封 IP,可以掛 IP 代理(相當于打幾槍換個地方,對方網站就不知道你究竟是爬蟲還是正常訪問的用戶了);如果對方網站有反爬機制,那么也有一些騷操作可以繞過反爬機制(有點黑客攻防的感覺,有木有!)。這些都是后話了。

爬蟲部分

一、分析網站結構(以動作片電影為例)

1. 分析網頁的 URL 的組成結構

首先,我們需要分析網頁的 URL 的組成結構,主要關注兩方面,一是如何切換選擇的電影類型,二是網頁如何翻頁的。

點擊網頁上的電影類型的按鈕,觀察地址欄中的 URL ,發現網址和電影類型的關系如下:

電影類型網址
劇情片https://www.dy2018.com/0/
喜劇片https://www.dy2018.com/1/
動作片https://www.dy2018.com/2/
愛情片https://www.dy2018.com/3/
科幻片https://www.dy2018.com/4/
動畫片https://www.dy2018.com/5/
懸疑片https://www.dy2018.com/6/
驚悚片https://www.dy2018.com/7/
恐怖片https://www.dy2018.com/8/
記錄片https://www.dy2018.com/9/
............
災難片https://www.dy2018.com/18/
武俠片https://www.dy2018.com/19/
古裝片https://www.dy2018.com/20/

發現規律了吧,以后如果想爬其他類型的電影,只要改變 url 中的數字即可,甚至你可以寫一個循環,把所有板塊中的電影全部爬取下來。

隨便打開一個分類,我們滾動到頁面的最下面,發現這里有翻頁的按鈕,點擊按鈕翻頁的同時,觀察 url 的變化。

頁碼URL
第一頁https://www.dy2018.com/2/index.html
第二頁https://www.dy2018.com/2/index_2.html
第三頁https://www.dy2018.com/2/index_3.html
第四頁https://www.dy2018.com/2/index_4.html

除了第一頁是 「index」外,其余頁碼均是 「index_頁碼」的形式。

所以我們基本掌握了網站的 url 的構成形式,這樣我們就可以通過自己構造 url 來訪問任意類型電影的任意一頁了,是不是很酷。

2. 分析網站的頁面結構

其次,我們分析一下網站的頁面結構,看一看我們需要的信息都藏在網頁的什么地方(在這之前我們先要明確一下我們需要哪些數據),由于我們這個目的是下載電影,所以對我有用的數據只有兩個,電影名稱和下載電影的磁力鏈接。

按 F12 召喚出開發者工具(這個工具可以幫助你快速定位網頁中的元素在 html 源代碼中位置)。

Python如何爬取并下載電影天堂中的3千多部電影

然后,我們可以發現,電影列表中,每一部電影的信息存放在一個 <table> 標簽里,而電影的名字,就藏在里面的一個 <a> 標簽中。電影下載的磁力鏈接在電影的詳情頁面,而電影詳情頁面的網址也在這個 <a> 標簽中( href 屬性的值)。

Python如何爬取并下載電影天堂中的3千多部電影

 而下載的磁力鏈接,存放在 <tbody> 標簽下的 <a> 標簽中,是不是很好找啊!

最后我們來縷一縷思路,一會兒我們準備這樣操作:通過前面的網址的構造規則,訪問到網站的某一頁,然后獲取到這個頁面里的所有 table 標簽(這里存放著電影的數據),然后從每一個 table 標簽中找到存有電影名稱的 a 標簽(這里可以拿到電影名稱以及詳情頁面的網址),然后通過這里獲取的網址訪問電影的詳情頁面,在詳情頁面挑選出 <tbody> 標簽下的 <a> 標簽(這里存放著電影的下載鏈接),這樣我們就找到了我們所需要的全部數據了,是不是很簡單啊。

二、爬蟲編碼階段 

爬蟲的程序,我一般習慣把它分成五個部分, 一是主函數,作為程序的入口,二是爬蟲調度器,三是網絡請求函數,四是網頁解析函數,五是數據存儲函數。

  1. get_data :其參數是目標網頁 url,這個函數可以模擬瀏覽器訪問 url,獲取并將網頁的內容返回。

  2. parse_data :其參數是網頁的內容,這個函數主要是用來解析網頁內容,篩選提取出關鍵的信息,并打包成列表返回。

  3. save_data :其參數是數據的列表,這個函數用來將列表中的數據寫入本地的文件中。

  4. main :這個函數是爬蟲程序的調度器,可以根據事先分析好的 url 的規則,不斷的構造新的請求 url,并調用其他三個函數,獲取數據并保存到本地,直到結束。

  5. if __name__ == '__main__' :這是主程序的入口,在這里調用 main 函數,啟動爬蟲調度器即可。

# 我們用到的庫
import requests
import bs4
import re
import pandas as pd

1. 網絡請求函數 :get_data (url)

負責訪問指定的 url 網頁,并將網頁的內容返回,此部分功能比較簡單固定,一般不需要做修改(除非你要掛代理,或者自定義請求頭等,可以做一些相應的調整)。

def get_data(url):
  '''
  功能:訪問 url 的網頁,獲取網頁內容并返回
  參數:
    url :目標網頁的 url
  返回:目標網頁的 html 內容
  '''
  headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
  }
 
  try:
    r = requests.get(url, headers=headers)
    r.raise_for_status()
    return r.text
  
  except requests.HTTPError as e:
    print(e)
    print("HTTPError")
  except requests.RequestException as e:
    print(e)
  except:
    print("Unknown Error !")

2. 網頁解析函數:parse_data(html)

 這個函數是整個爬蟲程序的核心所在,整體思路在上一部分已經講過了。我這里使用的庫是 BeautifulSoup。

這部分的寫法多種多樣,有很多發揮的空間,也沒有什么太多固定的模式,因為這部分的寫法是要隨著不同網站的頁面結構來做調整的,比如說有的網站提供了數據的 api 接口,那么返回的數據就是 json 格式,我們只需要調用 json 庫就可以完成數據解析,而大部分的網站只能通過從網頁源代碼中一層層篩選(篩選手段也多種多樣,什么正則表達式,beautifulsoup等等)。

這里需要根據數據的形式來選擇不同的篩選策略,所以,知道原理就可以了,習慣什么方法就用什么方法,反正最后能拿到數據就好了。

def parse_data(html):
  '''
  功能:提取 html 頁面信息中的關鍵信息,并整合一個數組并返回
  參數:html 根據 url 獲取到的網頁內容
  返回:存儲有 html 中提取出的關鍵信息的數組
  '''
  bsobj = bs4.BeautifulSoup(html,'html.parser')
  info = []
  
  # 獲取電影列表
  tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})
  
  # 對電影列表中的每一部電影單獨處理
  for item in tbList:
 
    movie = []
    link = item.b.find_all('a')[1]
 
    # 獲取電影的名稱
    name = link["title"]
 
    # 獲取詳情頁面的 url
    url = 'https://www.dy2018.com' + link["href"]
 
    # 將數據存放到電影信息列表里
    movie.append(name)
    movie.append(url)
    
    try:
      # 訪問電影的詳情頁面,查找電影下載的磁力鏈接
      temp = bs4.BeautifulSoup(get_data(url),'html.parser')
      tbody = temp.find_all('tbody')
      
      # 下載鏈接有多個(也可能沒有),這里將所有鏈接都放進來
      for i in tbody:
        download = i.a.text
        movie.append(download)
        
      #print(movie)
 
      # 將此電影的信息加入到電影列表中
      info.append(movie)
      
    except Exception as e:
      print(e)
  
  return info

3. 數據存儲函數:save_data(data)

 這個函數目的是將數據存儲到本地文件或數據庫中,具體的寫法要根據實際需要的存儲形式來定,我這里是將數據存放在本地的 csv 文件中。

當然這個函數也并不只能做這些事兒,比如你可以在這里寫一些簡單的數據處理的操作,比如說:數據清洗,數據去重等操作。

def save_data(data):
  '''
  功能:將 data 中的信息輸出到文件中/或數據庫中。
  參數:data 將要保存的數據 
  '''
  filename = 'Data/電影天堂/動作片.csv'
  
  dataframe = pd.DataFrame(data)
  dataframe.to_csv(filename, mode='a', index=False, sep=',', header=False)

4. 爬蟲調度器:main()

這個函數負責根據 url 生成規則,構造新的 url 請求,然后依次調用網絡請求函數,網頁解析函數,數據存儲函數,爬取并保存該頁數據。

所謂爬蟲調度器,就是控制爬蟲什么時候開始爬,多少只爬蟲一起爬,爬哪個網頁,爬多久休息一次,等等這些事兒。

def main():
  # 循環爬取多頁數據
  for page in range(1, 114):
    print('正在爬取:第' + str(page) + '頁......')    
    # 根據之前分析的 URL 的組成結構,構造新的 url
    if page == 1:
      index = 'index'
    else:
      index = 'index_' + str(page)      
    url = 'https://www.dy2018.com/2/'+ index +'.html'
    # 依次調用網絡請求函數,網頁解析函數,數據存儲函數,爬取并保存該頁數據
    html = get_data(url)
    movies = parse_data(html)
    save_data(movies)
    
    print('第' + str(page) + '頁完成!')

5. 主函數:程序入口

主函數作為程序的入口,只負責啟動爬蟲調度器。

這里我一般習慣在 main() 函數前后輸出一條語句,以此判斷爬蟲程序是否正常啟動和結束。

if __name__ == '__main__':
  print('爬蟲啟動成功!')
  main()
  print('爬蟲執行完畢!')

三、程序運行結果

 運行了兩個小時左右吧,終于爬完了 113 頁,共 3346 部動作片電影的數據(本來不止這些的,但是有一些電影沒有提供下載鏈接,我在 excel 中排序后直接手動剔除了)。

Python如何爬取并下載電影天堂中的3千多部電影

 Python如何爬取并下載電影天堂中的3千多部電影

然后想看什么電影的話,直接復制這些電影下載的磁力鏈接,到迅雷里面下載就好啦。 

四、爬蟲程序的一些小優化

1. 在網站提供的下載鏈接中,我試了一下,發現 magnet 開頭的這類鏈接放在迅雷中可以直接下載,而 ftp 開頭的鏈接在迅雷中總顯示資源獲取失敗(我不知道是不是我打開的方式不對,反正就是下載不來),于是我對程序做了一些小的調整,使其只獲取 magnet 這類的鏈接。

修改的方式也很簡單,只需要調整 網頁解析函數 即可(爬蟲的五個部分是相對獨立的,修改時只需調整相應的模塊即可,其余部分無需修改)。

def parse_data(html):
  '''
  功能:提取 html 頁面信息中的關鍵信息,并整合一個數組并返回
  參數:html 根據 url 獲取到的網頁內容
  返回:存儲有 html 中提取出的關鍵信息的數組
  '''
  bsobj = bs4.BeautifulSoup(html,'html.parser')
  info = []
  
  # 獲取表頭信息
  tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})
  
  for item in tbList:
    movie = []
    link = item.b.find_all('a')[1]
    name = link["title"]
    url = 'https://www.dy2018.com' + link["href"]
    
    try:
      # 查找電影下載的磁力鏈接
      temp = bs4.BeautifulSoup(get_data(url),'html.parser')
      tbody = temp.find_all('tbody')
      
      for i in tbody:
        download = i.a.text
        if 'magnet:?xt=urn:btih' in download:
          movie.append(name)
          movie.append(url)
          movie.append(download)
          #print(movie)
          info.append(movie)
          break
    except Exception as e:
      print(e)
  
  return info

注意代碼 26 行處,我加了一個 if 語句的判斷,如果下載鏈接中包含 magnet:?xt=urn:btih 字符串,則視為有效鏈接,下載下來,否則跳過。

2. 我一直在想能不能有個辦法讓迅雷一鍵批量下載我們爬到的電影。使用 python 操縱第三方的軟件,這其實挺難的。不過后來找到了一種方法,也算是解決了這個問題。

就是我們發現迅雷軟件啟動后,會自動檢測我們的剪切板,只要我們復制了下載鏈接,它便會自動彈出下載的提示框。借助這個思路,我們可以使用代碼,將下載的鏈接復制進入剪切板,等下載框自動出現后,手動確認開始下載(這是我目前想到的最好的辦法了,不知道各位大佬有沒有更好的思路,歡迎指導交流)。

import pyperclip
import os
import pandas as pd
 
imageData = pd.read_csv("Data/電影天堂/動作片2.csv",names=['name','link','download'],encoding = 'gbk')
# 獲取電影的下載鏈接,并用換行符分隔
a_link = imageData['download']
links = '\n'.join(a_link)
 
# 復制到剪切板
pyperclip.copy(links);
print('已粘貼');
 
# 打開迅雷
thunder_path = r'D:\Program Files (x86)\Thunder Network\Thunder9\Program\Thunder.exe'
os.startfile(thunder_path)

以上是“Python如何爬取并下載電影天堂中的3千多部電影”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

枝江市| 布尔津县| 孟连| 玉环县| 马山县| 台前县| 贵德县| 达孜县| 石河子市| 昭通市| 遂溪县| 宁德市| 石景山区| 乌鲁木齐市| 平原县| 屏东市| 周至县| 井研县| 永福县| 开鲁县| 辽阳市| 安仁县| 鄂托克旗| 永胜县| 东至县| 洪湖市| 太仓市| 东莞市| 犍为县| 金乡县| 丹棱县| 保定市| 南澳县| 增城市| 木里| 迁西县| 当涂县| 临夏县| 墨脱县| 临沧市| 济南市|