Python爬取电影下载链

当萌生一个好想法时,连饥饿都能一时忘却,因为这个中饭拖成了晚饭。对一个爱看电影的人来说,电影也算一大享受和兴趣,我打开平日喜欢去的电影天堂找电影看,首先让我不爽的就是广告了,然后才能找找哪些电影是自己想看的,点来点去还得自己手动复制,真的好繁琐。因此我想把一小部分链接信息抓下来,再写个简单方便的UI让我随时使用。
心中想起了 I CAN DO THIS


先把Python脚本写出来

1.分析网站信息

  • 确定爬取栏目


    爬取栏目.png
  • 分析栏目构成


    分析链接.png
  • 是否可爬

2.构建爬取流程

  • 先爬取所有电影详情页连接
  • 获取对应电影详情页信息
  • 保留电影标题和下载实体链
  • 根据电影栏目分别存放成json数据

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)
        # 创建目录
        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链接不规则做分步处理
        if "400" in name:
            return self.GetLinks(url, count, 1)
        else:
            return self.GetLinks(url, count)
    # 获取所有链接
    def GetLinks(self, url, count, flag=0):
        # 延迟执行,爬的太猛对你对别人都不好
        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"] = []
        # 循环请求网页
        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

    # 将数据存储在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__':
    # 初始化爬取栏目数据
    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()
#  联系作者:2910169601

4.遇到的主要问题

其中卡我时间最长的是编码问题,所爬取网页是GB2312编码的,爬取下来是乱码,不管怎么转码都不对。最后用encode('ISO-8859-1').decode('gbk')解决了乱码问题。
世间麻烦千千万,唯有编码独一道。

5.总结

遇到问题不要慌,先喝口水冷静冷静。


biubiubiu.gif
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,183评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,850评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,766评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,854评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,871评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,457评论 1 311
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,999评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,914评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,465评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,543评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,675评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,354评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,029评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,514评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,616评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,091评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,685评论 2 360

推荐阅读更多精彩内容