#电影爬虫
import zgily
'''
*爬取网站中的电影下载链接
*网站: www.dygod.net
*协议: https
*作者: 氢氧化猫
'''
#网站地址
url = 'https://www.dygod.net'
#Timeout
timeout = 20
#正则表达式
main_pa = r'<a href="([^"]+)">([^<]+)</a></li><li>'
num_pa = r'页次：1/([0-9]+)&nbsp;每页([0-9]+)&nbsp;总数([0-9]+)'
item_pa = r'<a href="([^"]+)" class="ulink"'
#detail_pa = r'<br />([^<]+)<br />|'
detail_pa = r'<td colspan="2" style="padding-left:3px">([^<]+)</td>'
down_pa = r'(?:<td style="WORD-WRAP: break-word" bgcolor="#fdfddf"><a href="([^"]+)">)|(?:href="(ftp://[^"]+?)")'

item_num = 0
detail = []

def printMainList (l):
    for i in range(0,len(l)):
        print("[{}]{}".format(i+1,l[i][1]),end = "")
        if i == 1:
            print(" 该条目暂时无法使用")
        else :
            print("")



result = tuple()

def getMainPage ():
    global result
    global timeout
    main = zgily.get(url,timeout=timeout,encoding='gb2312')
    if zgily.checkBadRequest(main):
        return ""
    sublist = zgily.findItem(main_pa,main)
    printMainList(sublist)
    print("请选择分类")
    i = zgily.inputInt()
    if i == 2:
        return ""
    return sublist[i-1][0]

def getSubPage (link):
    global timeout
    global item_num
    sub = zgily.get(link,timeout=timeout,encoding='gb2312')
    if zgily.checkBadRequest(sub):
        return ""
    result = zgily.findItem(num_pa,sub)[0]
    item_num = result[1]
    return "该分类共{0}页，每页共{1}个条目,共{2}个条目".format(*result)

def makeUrl(link,i):
    if i == 1:
        return link
    else :
        return link[:-5]+"_"+str(i)+".html"

def list2str (l):
    s = ""
    for i in l:
        s = s + i[0] + i[1] + "\n"
    return s

def saveItem (link,i):
    global timeout
    link = url + link
    r = zgily.get(link,timeout,'gb2312')
    down = zgily.findItem(down_pa,r)
    zgily.write("movies.txt","a+",detail[i-1]+"\n"+list2str(down)+"\n")

def downloadMovies(link,page):
    global timeout
    global detail
    for i in page :
        nurl = makeUrl(link,i)
        r = zgily.get(nurl,timeout,'gb2312')
        movies = zgily.findItem(item_pa,r)
        detail = zgily.findItem(detail_pa,r)
        for m in movies :
            n = (i-1)*int(item_num)+1
            print("正在下载{}/{}".format(movies.index(m)+n,len(page)*int(item_num)))
            saveItem(m,movies.index(m)+1)



if __name__ == '__main__' :
    zgily.clear()
    print("请选择需要下载的分类")
    link = getMainPage()
    if link != "":
        info = getSubPage(url+link)
        if info != "":
            zgily.clear()
            print(info)
            print("选择下载模式:")
            print("[1]单页下载")
            print("[2]多页下载")
            print("[3]全部下载")
            mode = zgily.inputInt()
            if mode == 1:
                print("请输入需要下载的页码")
                i = zgily.inputInt()
                page = [i]
            elif mode == 2:
                print("请输入需要下载的范围[x,y)")
                x = zgily.inputInt()
                y = zgily.inputInt()
                page = range(x,y)
            elif mode == 3:
                page = range(1,result[0]+1)
            downloadMovies(url+link,page)
