Python爬取電影下載鏈

當萌生一個好想法時,連饑餓都能一時忘卻,因為這個中飯拖成了晚飯。對一個愛看電影的人來說,電影也算一大享受和興趣,我打開平日喜歡去的電影天堂找電影看,首先讓我不爽的就是廣告了,然后才能找找哪些電影是自己想看的,點來點去還得自己手動復制,真的好繁瑣。因此我想把一小部分鏈接信息抓下來,再寫個簡單方便的UI讓我隨時使用。
心中想起了 I CAN DO THIS


先把Python腳本寫出來

1.分析網站信息

  • 確定爬取欄目


    爬取欄目.png
  • 分析欄目構成


    分析鏈接.png
  • 是否可爬

2.構建爬取流程

  • 先爬取所有電影詳情頁連接
  • 獲取對應電影詳情頁信息
  • 保留電影標題和下載實體鏈
  • 根據(jù)電影欄目分別存放成json數(shù)據(jù)

3.開始寫腳本

#coding=utf-8
import requests
import re
import os
import json
import time

class Getlinks(object):
    def __init__(self, url):
        self.url = url
        self.headers = {
            'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36"
        }
        self.dir_path = os.path.dirname(os.path.abspath(__file__))
        self.path = self.dir_path + '/json'
        DirectoryisExists = os.path.exists(self.path)
        # 創(chuàng)建目錄
        if not DirectoryisExists:
            os.makedirs(self.path)
        print("\t| 初始化完成")

    # 解析url地址
    def ParseUrl(self):
        for i in self.url:
            # 抓取電影鏈接
            print("\t| 開始抓取頁面跳轉鏈接")
            list_link = self.Graplinks(i)
            print("\t| "+i['catgory']+"頁面鏈接抓取完成")
            print("\t| 開始抓取電影詳細信息")
            info_dict = self.Grapinfo(i['catgory'], list_link)
            print("\t| "+i['catgory']+"頁面抓取完成")
            print("\t| 開始寫入json文件")
            self.Writetojson(info_dict, i['catgory_as'])
            print("\t| 文件寫入完成")
            
    # 抓取詳情頁鏈接
    def Graplinks(self, group):
        name = group['catgory']
        url = group['url']
        count = group['count']
        # 第一組url鏈接不規(guī)則做分步處理
        if "400" in name:
            return self.GetLinks(url, count, 1)
        else:
            return self.GetLinks(url, count)
    # 獲取所有鏈接
    def GetLinks(self, url, count, flag=0):
        # 延遲執(zhí)行,爬的太猛對你對別人都不好
        time.sleep(10)
        totalurl = []
        if flag == 1:
            for i in range(1, count+1):
               # time.sleep(1)
                suffix = '.html' if i==1  else '_'+str(i)+'.html'
                base_url = url + suffix
                #抓取本頁的超鏈接
                try:
                    res = requests.get(base_url, headers=self.headers).text
                    links = re.findall(r'http[s]?://www.ygdy8.com/html/gndy/.*?.html', res, re.S)
                    # 去重
                    links = list(set(links))
                    totalurl += links
                except Exception as E:
                    print('抓取失敗的原因:'+ E)
            return totalurl
        else:
            for i in range(1, count+1):
                # time.sleep(1)
                base_url = url + str(i) + '.html'
                # 抓取本頁的超鏈接
                try:
                    res = requests.get(base_url, headers=self.headers).text
                    # 過濾其他文本
                    re_rule = 'class="co_content8"(.*?)</div>'
                    links_context = re.compile(re_rule, re.S).findall(res)[0]
                    links = re.findall(r'/html/gndy/dyzz.*?.html', links_context, re.S)
                    totalurl += links
                except Exception as E:
                    print('抓取失敗的原因:' + E)
            for i in range(len(totalurl)):
                totalurl[i] = 'https://www.dytt8.net' + totalurl[i]
            return totalurl
    # 抓取電影信息
    def Grapinfo(self, catgroy, links):
        info_json = {}
        info_json["catgory"] = catgroy
        info_json["count"] = len(links)
        info_json["group"] = []
        # 循環(huán)請求網頁
        for url in links:
            temp = {}
            try:
                res = requests.get(url, headers=self.headers).text
                title_re = '<div class="title_all">(.*?)</div>'
                title = re.compile(title_re, re.S).findall(res)[0]
                title = re.compile('#07519a>(.*?)</font></h1>', re.S).findall(title)[0]
                title = title.encode('ISO-8859-1').decode('gbk')
                filelink_re = '#fdfddf(.*?)</a>'
                filelink = re.compile(filelink_re, re.S).findall(res)[0]
                filelink = filelink.encode('ISO-8859-1').decode('gbk')
                filelink = re.compile('<a href="(.*?)"', re.S).findall(filelink)[0]

                print(title)
                print(filelink)

                # 添加糾錯機制
                if self.CheckVirtual(filelink) == False:
                    continue
                temp["title"] = title
                temp["filelink"] = filelink
                info_json["group"].append(temp)
            except Exception as E:
                continue
        return info_json

    # 將數(shù)據(jù)存儲在json文件中
    def Writetojson(self, info_json, json_name):
        json_name = json_name
        # 將字典轉換成json字符串
        str_json = json.dumps(info_json, indent=4)
        try:
            with open('./json/' + json_name + '.json', 'w') as f:
                f.write(str_json)
        except Exception as E:
            print("寫入文件出錯" + E)
            f.close()
            return
    # 無效鏈接檢查處理
    def CheckVirtual(self, url):
        return  True if 'ftp' in url else False

if __name__ == '__main__':
    # 初始化爬取欄目數(shù)據(jù)
    base_url_list = [
        {
            "catgory" : "IMDB評分8分左右影片400多部",
            "catgory_as" : "imdb",
            "url" : "https://www.dytt8.net/html/gndy/jddy/20160320/50523",
            "count" : 4
        },
        {
            "catgory": "最新電影",
            "catgory_as": "zuixin",
            "url": "https://www.dytt8.net/html/gndy/dyzz/list_23_",
            "count": 50
        },
        {
            "catgory": "歐美電影",
            "catgory_as": "oumei",
            "url": "https://www.dytt8.net/html/gndy/oumei/list_7_",
            "count": 50
        },
        {
            "catgory": "國內電影",
            "catgory_as": "china",
            "url": "https://www.dytt8.net/html/gndy/china/list_4_",
            "count": 50
        },
        {
            "catgory": "日韓電影",
            "catgory_as": "rihan",
            "url": "https://www.dytt8.net/html/gndy/rihan/list_6_",
            "count": 40
        }
    ]
    Context = Getlinks(base_url_list)
    Context.ParseUrl()
#  聯(lián)系作者:2910169601

4.遇到的主要問題

其中卡我時間最長的是編碼問題,所爬取網頁是GB2312編碼的,爬取下來是亂碼,不管怎么轉碼都不對。最后用encode('ISO-8859-1').decode('gbk')解決了亂碼問題。
世間麻煩千千萬,唯有編碼獨一道。

5.總結

遇到問題不要慌,先喝口水冷靜冷靜。


biubiubiu.gif
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容