Life is too short to waste a second

Python爬取电影天堂

坐火车的时候没事干改进了以前的代码,将主页和下载链接爬取失败的记录并在最后重新爬取,代码写得乱乱的,将就看吧,能用就行~

使用爬虫爬取的电影天堂的资源,可在最后方下载Excel表格使用。

代码如下:

import requests
from bs4 import BeautifulSoup
import re
import time

faillist=[]
mainfailllist=[]

def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding='gb2312' #电影天堂的编码
        return r.text
    except:
        return ""

def getEverySite(ilist,html):
    soup=BeautifulSoup(html,'html.parser')
    content=soup.find_all('b') #先找到b标签
    HTML=str(content) #将内容转换为str
    links=BeautifulSoup(HTML,'html.parser') #重新熬一锅汤
    for link in links.find_all('a'): #找到a标签
        url="http://www.dytt8.net"+link.get('href') #加上完整的url
        name=link.text
        ilist.append([name,url])

def printGoodsList(ilist):
    f = open('MovieData.csv','a',encoding='gb2312') 
    tplt="{0:{3}<32}\t\t{1:<16}\t\t\t{2:<16}"
    alllist=[]
    for g in ilist:
        alllist.append([g[0],g[1],getDownload(g[1])]) #添加alllist的内容
        if alllist[0][2]=="未获取到下载链接":
            faillist.append([g[0],g[1]]) #所有未获取到下载链接的加入faillist最后重新爬取
            pass
        print(tplt.format(alllist[0][0],alllist[0][1],alllist[0][2],chr(12288)))
        try:
            f.write('{},{},{}\n'.format(str(alllist[0][0]),str(alllist[0][1]),str(alllist[0][2]))) #有时会产生编码错误
        except:
            pass
        del alllist[0:2] #删除alllist的内容
    f.close()

def getDownload(url):
    links=getHTMLText(url)
    for k in range(4): #若爬取失败则多次爬取
        if links=="":
            print("第"+str(k+1)+"次爬取失败,正在重新爬取")
            links=getHTMLText(url)
    if links=="":
        print("无法爬取下载链接")
        return "未获取到下载链接"
    soup=BeautifulSoup(links,'html.parser')
    ftp="".join(soup.find_all(text=re.compile('^ftp')))
    if ftp=="":
        return "该链接是磁力链接,暂不支持"
    return ftp #匹配正文以ftp开头的字段,列表转化为str

def main():
    print("******************欢迎使用电影天堂定向爬虫******************")
    print("***声明:电影天堂并未禁止此爬虫爬取的页面,该爬虫是合法的***")
    print("************************Made By King************************")
    depth=input("输入要爬取页面的深度:")
    depth=int(depth)+1
    f = open('MovieData.csv','a',encoding='gb2312') 
    f.write('{},{},{}\n'.format('电影名','网址','下载地址'))
    f.close()
    print("{0:{3}<32}\t\t{1:<16}\t\t\t{2:<16}".format("电影名","网址\t\t\t\t\t","下载地址",chr(12288)))
    for i in range(1,depth):
        try:
            infoList=[]
            if i==1:
                url="http://www.dytt8.net/html/gndy/dyzz/index.html"
            else:
                url="http://www.dytt8.net/html/gndy/dyzz/list_23_"+str(i)+".html"
            html=getHTMLText(url)
            for j in range(5): #若爬取失败则多次爬取
                if html=="":
                    html=getHTMLText(url)
            if html=="":
                mainfaillist.appen(url) #将未爬取成功的主页面记录,最后在爬取试一下
            getEverySite(infoList,html)
            printGoodsList(infoList)
            print("爬虫已经爬取了第"+str(i)+"个页面")
        except:
            pass
    #重新爬取失败主页
    print("下面开始尝试再次爬取未爬取成功的主页")
    for i in mainfailllist:
        infoList=[]
        html=getHTMLText(i)
        for j in range(5): #若爬取失败则多次爬取
            if html=="":
                html=getHTMLText(i)
        if html=="":
            print("依旧爬取失败,建议手动访问"+str(i)+" 查看")
        getEverySite(infoList,html)
        printGoodsList(infoList)
        print(str(i)+" 爬取成功,已将其中的网页加入文件中")
    #重新爬取单个下载链接
    print("下面开始尝试再次爬取未获取到下载链接的网页")
    printGoodsList(faillist)
    print("爬取完成——King")
    infoList.clear()
    faillist.clear()
    mainfailllist.clear()

main()

资源:

点击下载电影天堂全部电影下载地址 8月1日更新

发表评论

电子邮件地址不会被公开。

一条评论 “Python爬取电影天堂”