Python 爬取电影天堂top最新电影

本文介绍了如何使用Python进行网页爬虫,通过分析电影天堂网站的源代码,提取最新电影链接,利用XPath解析电影信息,并保存电影海报。文章详细讲解了每个步骤,包括进入开发者模式分析网页链接规律,编写链接获取和解析函数,以及最终的数据保存。
部署运行你感兴趣的模型镜像

Python爬虫有他无可比拟的优势:语法简单,经常几十行代码就能轻松解决问题,相比于JAVA,C,PHP;第三方库丰富,Python强大而又丰富的第三方库使他几乎可以无所不能。今天我们就来用用Python爬取电影天堂最新电影资源,一起来看看吧。

分析网页源代码

进入开发者模式

首先我们打开浏览器,进入开发者模式(这里推荐大家使用谷歌浏览器)

快捷键

开发者模式:Ctrl/shitf + x
或者直接按下:F12
在这里插入图片描述

分析下一页网页链接变化规律

我们爬取左边2020新片精品的相关电影。首先传递初始页面的url,先获取2020新片精品的页面链接。我们分析出每一页网页链接的变化规律:比如第一页的链接‘https://www.dy2018.com/html/gndy/dyzz/index.html’,而第二页第三页的网页链接区别于第一页的就是后面几位’index.html’和’index_2.html’,‘index_3.html’

写第一个链接获取函数

def get_detail_urls(initial_url):#解析总页面链接,得到每一个电影的链接
    pro='index'
    page_url=[]
    details=[]
    detail_urls=[]
    count=0
    for i in range(1,8):
        if  i ==1 :
            index=pro
        else:
            index=pro+'_%d'%i
        html=initial_url+index+'.html'
        page_url.append(html)
    for i in range(len(page_url)):
        count+=1
        try:
            response=requests.get(url=page_url[i],headers=headers)
            text=response.content.decode('gbk',errors='ignore')
            rst=etree.HTML(text)
            detail=rst.xpath('//td/b/a/@href')
            details.append(detail)
            if response.status_code == 200:
                print('最新电影第%d页网页链接获取成功'%count)
        except Exception as e:
            print(e)
    # print(details)
    for i in range(len(details)):
        for j in range(len(details[i])):
            url=details[i][j]
            detail_url=base_domain+url
            #count+=1
            detail_urls.append(detail_url)
    return detail_urls

得到每一页的链接后,分析每个电影相关介绍的URL放在哪里,还是在开发者模式里面,点击这个左上角的小箭头,你会发现你的鼠标移到哪下面的标签也会随之发生变化。点击最新电影上面的第一个,发现他把一个电影链接分割成了两部分,

演示图

在这里插入图片描述

在这里插入图片描述

它将另一部分链接放在了在td/b/a中的href(千万不要写成了herf)属性中,然后就开始写xpath语法了("//td/b/a/@href")这里我们用一下谷歌浏览器的插件xpath来验证一下对不对

在这里插入图片描述

编写链接解析函数

接下来我们来解析得到的链接,写一个解析函数。还是先分析所需要的内容在那放着:结果发现它都在一个("//div[@id=‘Zoom’]")里面。遍历依次提取就可以了。用xpath语法提取文本内容要加//text(),这样会返回一个文本。

def parse_detail_urls(url):#获取每个电影相关内容
    movies={}
    poster=[]
    response=requests.get(url=url,headers=headers,timeout=5)
    text=response.content.decode('gbk',errors='ignore')
    html=etree.HTML(text)
    lis=html.xpath("//div[@id='Zoom']")[0]
    infos = lis.xpath(".//text()")
    for index,info in enumerate(infos):
        if info.startswith("◎片  名"):
            movies['电影名称']=parse_info(info,"◎片  名")
        elif info.startswith("◎产  地"):
            movies['产地']=parse_info(info,"◎产  地")
        elif info.startswith("◎类  别"):
            movies['类别']=parse_info(info,"◎类  别")
        elif info.startswith("◎语  言"):
            movies['语言']=parse_info(info,"◎语  言")
        elif info.startswith("◎字  幕"):
            movies['字幕']=parse_info(info,"◎字  幕")
        elif info.startswith("◎上映日期"):
            movies['上映时间']=parse_info(info,"◎上映日期")
        elif info.startswith("◎豆瓣评分"):
            movies['豆瓣评分']=parse_info(info,"◎豆瓣评分")
        elif info.startswith("◎片  长"):
            movies['时长']=parse_info(info,"◎片  长")
        elif info.startswith("◎导  演"):
            movies['导演']=parse_info(info,"◎导  演")
        elif info.startswith("◎标  签"):
            movies['标签']=parse_info(info,"◎标签")
        elif info.startswith("◎影片评价"):
            movies['影评']=infos[index+1].strip()
        elif info.startswith("◎主  演"):
            info=parse_info(info,"◎主  演")
            actors=info
            for x in range(index+1,len(infos)):
                actor=infos[x].strip()
                if actor.startswith("◎"):
                    break
                actors+=actor+'\n'
            movies['主演'] = actors
        elif info.startswith("◎简  介"):
            brief=''
            for x in range(index + 1, len(infos)):
                bri = infos[x].strip()
                if bri.startswith("◎"):
                    break
                brief+=bri
            movies['简介']='%s'%brief
    movie_urls=html.xpath("//tr/td[@bgcolor='#fdfddf']/a/@href")
    links=''
    for link in movie_urls:
        links+='%s'%link+'\n'
    movies['电影链接']=links
    poster_url= lis.xpath(".//img/@src")[0]
    try:
        if '电影天堂最新电影top175' in os.listdir('E:\python'):
            pass
        else:
            os.mkdir('电影天堂最新电影top175')
            print('文件夹创建成功')
    except Exception as e:
        print(e)
    os.chdir('E:\python\电影天堂最新电影top175')
    img = requests.get(poster_url).content
    with open('%s'%movies['电影名称']+'.jpg','wb') as f:
        f.write(img)
        print("%s海报获取成功"%movies['电影名称'])
​
​
​
    return movies
​

我们先用LXML库解析这个网页源代码,一次提取。注意这里的infos是一个列表,如果不在后面用索引指定的话,经常会出错误,要注意。这里用enumerate()这个方法同时提取内容以及索引,可以方便的找到你所要的内容在哪个位置。最后返回一电影详情的字典,电影的信息都在里面。后面可以写入表格里面(由于有的电影主演,简介以及链接较长,都放在里面表格看起来很不美观,建议不要放进去)这里我们用with语句把电影海报链接中的图片保存下来,用OS模块建立一个文件夹,写入照片的时候一定要用get()语句返回照片的字节流文件。然后以二进制的形式写入。经过分析之后发现电影天堂这个网站的写的不是很规范。

最后一步

if __name__ == '__main__':
    movies=[]
    headline=''
    url='https://www.dy2018.com/html/gndy/dyzz/index.html'
    resp=get_detail_urls(url)
    #print(resp)
    for index,info in enumerate(resp):
        print(info)
        a = requests.get(url=info, headers=headers)
        text = a.content.decode('gbk', errors='ignore')
        resp = etree.HTML(text)
        title = resp.xpath("//div[@id='Zoom']//text()")
        for i in title:
            if i.startswith('◎片  名'):
                headline = i
                break
        try:
            a=parse_detail_urls(info)
            print('正在解析{},已完成第{}个,剩余{}个'.format(info,index+1,(len(resp)-index-1)))
            print("已完成{}%".format(10*(index/len(resp))))
            movies.append(a)except :
            print('第{}页的电影{}解析出错'.format((index//7),headline))
​
​
    os.chdir('E:/python')
    data=pd.DataFrame(movies)
    data.to_csv('电影天堂top175.csv')

这里多写几句便于可视化及时发现问题,检查问题。最后直接以csv文件导出(文件名结尾一定要加".csv"),就是常见的Excel写代码的时候一定要多调试(调试多了会被服务器封禁,注意调试规模,不要让程序多次全部运行,不然会给服务器增加负担,会被拉黑封禁的,可以多在循环的语句里面添加break),看着代码无差错的运行,也是一种享受。

写在最后

写在最后,这个里面会用到xpath语法以及xpath模块,关注公众号后台回复xpath即可获得xpath插件,安装教程以及xpath语法也会后续更新。更多精彩内容持续为您更新,谢谢大家。
在这里插入图片描述
想要获取源代码或者运行遇到了问题可以在微信后台私信我,有我的联系方式。

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值