Python爬取电影天堂

本文概要

前言:

本文非常浅显易懂,可以说是零基础也可快速掌握。如有疑问,欢迎留言,笔者会第一时间回复。

一、爬虫的重要性:

如果把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,一直循环下去,直到把整个网站所有的网页都抓取完为止。

摘取部分网友的回复: 1、之前在北京买房,谁想房价开始疯长,链家的房价等数据分析只给了一小部分,远远不能满足自己的需求。于是晚上花了几个小时的时间写了个爬虫,爬下了北京所有的小区信息及北京所有小区的所有历史成交记录。

2、我的爱人是某网络公司的销售,需要收集各种企业信息然后打电话联系。于是乎利用采集脚本抓一坨一坨的资料给她用,而她的同事天天自己搜资料整理到半夜。

二、实践:爬取电影天堂电影详情页

1、网页分析及爬取第一页的详情页url

从电影天堂最新电影界面。可以看到其第一页url为 www.ygdy8.net/html/gndy/d… ,第二页为www.ygdy8.net/html/gndy/d…,第三第四页也类似

from lxml import etree
import requests


url = 'http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html'

headers = {
    'User_Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}

response = requests.get(url,headers=headers)

# response.text 是系统自己默认判断。但很遗憾判断错误,导致乱码出现。我们可以采取另外方式 response.content。自己指定格式解码
# print(response.text)
# print(response.content.decode('gbk'))
print(response.content.decode(encoding="gbk", errors="ignore"))

先以第一页为例,打印数据如下:

image.png

分析电影天堂 html 源代码,可以得出每个 table 标签就是一个电影

image.png

通过 xpath 拿到每个电影的详情url

html = etree.HTML(text)
detail_urls = html.xpath("//table[@class='tbspan']//a/@href")
for detail_url in detail_urls:
    print(detail_url)  #加上域名即为详情 url

结果如下:

image.png

2、整理代码并爬取前7页的电影列表url
from lxml import etree
import requests

# 域名
BASE_DOMAIN = 'http://www.ygdy8.net'
# url = 'http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html'

HEADERS = {
    'User_Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}

def spider():
    base_url = 'http://www.ygdy8.net/html/gndy/dyzz/list_23_{}.html'
    for x in range(1,8):
        url = base_url.format(x)
        print(url) # 求出每一页电影列表的url eg: http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html

if __name__ == '__main__':
    spider()

3、爬取每一部电影的详情页地址
def get_detail_urls(url):
    response = requests.get(url, headers=HEADERS)

    # response.text 是系统自己默认判断。但很遗憾判断错误,导致乱码出现。我们可以采取另外方式 response.content。自己指定格式解码
    # print(response.text)
    # print(response.content.decode('gbk'))
    # print(response.content.decode(encoding="gbk", errors="ignore"))
    text = response.content.decode(encoding="gbk", errors="ignore")

    # 通过 xpath 拿到每个电影的详情url
    html = etree.HTML(text)
    detail_urls = html.xpath("//table[@class='tbspan']//a/@href")

    detail_urls = map(lambda url:BASE_DOMAIN+url,detail_urls) #这句意思相当于下面一段代码:替换列表中的每一个url
    # def abc(url):
    #     return BASE_DOMAIN+url
    # index = 1
    # for detail_url in detail_urls:
    #     detail_url = abc(detail_url)
    #     detail_urls[index] = detail_url
    #     index+1

    return detail_urls

4、抓取电影详情页的数据

获取详情页title

# 解析详情页面
def parse_detail_page(url):
    movie = {}
    response = requests.get(url,headers = HEADERS)
    text = response.content.decode('gbk', errors='ignore')
    html = etree.HTML(text)
    # title = html.xpath("//div[@class='title_all']//font[@color='#07519a']")  # 本行47行,下面已修改

   # 打印出 [<Element font at 0x10cb422c8>, <Element font at 0x10cb42308>]
   #  print(title)

    # 为了显示,我们需要转一下编码
    # for x in title:
    #     print(etree.tostring(x,encoding='utf-8').decode('utf-8'))

     # 我们是为了取得文字,所以修改47行
    title = html.xpath("//div[@class='title_all']//font[@color='#07519a']/text()")[0]
    movie['title'] = title

    zoomE = html.xpath("//div[@id='Zoom']") [0] # 求出共同的顶级容器,方便后面求职
    imgs = zoomE.xpath(".//img/@src") # 求出海报和截图
    cover = imgs[0]
    if len(imgs) > 1:
        screenshot = imgs[1]
        movie['screenshot'] = screenshot
    # print(cover)
    movie['cover'] = cover

    infos = zoomE.xpath(".//text()")

    for index,info in enumerate(infos):
        if info.startswith('◎年&emsp;&emsp;代'):
            info = info.replace("◎年&emsp;&emsp;代", "").strip() # strip 去掉空格
            movie['year'] = info
        elif info.startswith("◎产&emsp;&emsp;地"):
            info = info.replace("◎产&emsp;&emsp;地", "").strip()
            movie["country"] = info
        elif info.startswith("◎类&emsp;&emsp;别"):
            info = info.replace("◎类&emsp;&emsp;别", "").strip()
            movie["category"] = info
        elif info.startswith("◎豆瓣评分"):
            info = info.replace("◎豆瓣评分", "").strip()
            movie["douban_rating"] = info
        elif info.startswith("◎片&emsp;&emsp;长"):
            info = info.replace("◎片&emsp;&emsp;长","").strip()
            movie["duration"] = info
        elif info.startswith("◎导&emsp;&emsp;演"):
            info = info.replace("◎导&emsp;&emsp;演", "").strip()
            movie["director"] = info
        elif info.startswith("◎主&emsp;&emsp;演"):
            actors = []
            actor = info.replace("◎主&emsp;&emsp;演", "").strip()
            actors.append(actor)
            # 因为主演有很多个,再加上其在电影天堂中元素的特殊性,需要遍历一遍,在分别求出每一个演员
            for x in range(index+1,len(infos)): # 从演员 infos 开始遍历,求出每一个演员
                actor = infos[x].strip()
                if actor.startswith("◎"): # 也就是到了标签 的 ◎ 就退出
                    break
                actors.append(actor)
            movie['actor'] = actors
        elif info.startswith('◎简&emsp;&emsp;介 '):

            # info = info.replace('◎简&emsp;&emsp;介 ',"").strip()
            for x in range(index+1,len(infos)):
                if infos[x].startswith("◎获奖情况"):
                  break
                profile = infos[x].strip()
                movie['profile'] = profile
            # print(movie)
        elif info.startswith('◎获奖情况 '):
            awards = []
            # info = info.replace("◎获奖情况 ", "").strip()
            for x in range(index+1,len(infos)):
                if infos[x].startswith("【下载地址】"):
                    break
                award = infos[x].strip()
                awards.append(award)
            movie['awards'] = awards
            # print(awards)

    download_url = html.xpath("//td[@bgcolor='#fdfddf']/a/@href")[0]
    movie['download_url'] = download_url
    return  movie

上述代码爬取了电影的每一个数据。为了让读者方便对照格式,笔者已经下载了写此篇文章时的html—— “movie.html”,放于github

最后结果:

前7页结果

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓

  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 用Python编写程序来爬取电影资源并下载十分方便。我们可以利用Python中的Requests库和BeautifulSoup库来获取目标网站上的电影信息,再通过正则表达式或其他解析方式,从网页中提取出我们想要的电影资源下载链接。最后,利用Python的文件下载模块或者其他第三方工具,将电影资源下载到本地。具体的步骤如下: 1.首先需要选择一个合适的网站,例如电影天堂电影港等,这些网站上都有大量的电影资源供我们爬取。 2.引入Requests库和BeautifulSoup库。通过Requests库发起HTTP请求,获取网页的HTML代码,再利用BeautifulSoup库对HTML代码进行解析和筛选。 3.从网页中提取出电影的名称、下载链接、封面图片等关键信息。可以利用BeautifulSoup库的find()和find_all()等方法,根据HTML源码中元素的CSS选择器、ID、Class等属性进行筛选和定位。 4.利用正则表达式或其他方式解析电影的下载链接。此时需要根据不同网站的下载链接格式及其特点,灵活应用解析方法。例如,电影天堂上的下载链接是用base64编码加密过的,需要使用base64库进行解码。 5.利用Python的文件下载模块或其他第三方工具,将电影资源下载到本地。对于文件较大的电影资源,可以使用多线程或异步编程的方式提高下载速度和效率。 6.最后,需要注意爬虫时要遵守法律法规和网站的使用规定,不能侵犯他人的权益和违反网站的服务条款。 ### 回答2: 随着网络的发展,越来越多的人选择在线观看电影来娱乐休闲。但是有时候我们想要下载电影,以便离线观看或分享给朋友。而使用 Python 爬取电影并下载是一个不错的选择。接下来,我将为大家介绍如何使用 Python 爬取电影并下载。 一、爬取电影信息 首先,我们需要爬取电影的信息,包括电影名称、下载链接、图片等等。一般来说,我们可以从电影网站爬取这些信息。以豆瓣电影为例,我们可以使用 requests 和 Beautiful Soup 库来获取所需信息。 代码示例: ```python import requests from bs4 import BeautifulSoup url = 'https://movie.douban.com/top250' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} res = requests.get(url, headers=headers) soup = BeautifulSoup(res.text, 'html.parser') movies = soup.select('.grid_view > li') for movie in movies: title = movie.select('span.title')[0].text.strip() img_url = movie.select('img')[0].get('src') download_url = movie.select('.info > div > a')[0].get('href') print(title, img_url, download_url) ``` 以上代码中,我们首先构造了一个 headers 请求头,模拟了浏览器的请求。然后使用 requests 库向网站发送请求,并使用 Beautiful Soup 库解析网页。接着,使用 CSS 选择器来获取电影列表,并从列表中获取所需信息。 二、下载电影 接下来,我们需要根据电影的下载链接,使用 Python 下载电影。一般来说,我们可以使用 requests 库下载电影,并将下载的电影保存到本地。 代码示例: ```python import requests url = 'https://movie.douban.com/subject/1292052/' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} res = requests.get(url, headers=headers) download_url = res.url r = requests.get(download_url, stream=True) with open('movie.mp4', 'wb') as f: for chunk in r.iter_content(chunk_size=1024): f.write(chunk) ``` 以上代码中,我们首先获取并保存电影的下载链接。然后,使用 requests 库发送请求,并开启流模式(stream=True)来下载电影,并以二进制写入文件中('movie.mp4')。当然,如果你有更好的存储方式,也可以根据自己的需求进行保存。这里要注意的是,下载电影需要时间较长,因此建议使用流模式分批次下载。 三、总结 使用 Python 爬取电影并下载是一个有趣的练手项目,对于初学者来说,可以锻炼 Python 编程能力和理解 Web 技术。当然,在实践中需要注意法律法规,不得侵犯他人版权。 ### 回答3: Python是一种易于学习且强大的编程语言,它在数据科学、机器学习和自然语言处理等领域都有广泛的应用。其中,Python爬取电影并进行下载的功能也备受欢迎,它可以帮助我们快速获取电影资源并下载到本地。 要实现这个功能,我们需要借助一些第三方库,常用的有requests、beautifulsoup4和urllib等。首先,我们可以通过requests库进行网页的请求,获取到需要爬取电影页面的源代码,然后通过beautifulsoup4库进行页面的解析和信息的提取。例如,如果我们需要获取电影的下载链接,可以通过beautifulsoup4库的find_all方法获取到相应的标签,再用正则表达式对其中的链接进行提取。最后,我们可以利用Python自带的urllib库进行电影的下载操作。 另外,为了避免被网站封禁,我们还需要注意一些爬虫的规范。例如,可以设置间隔时间、修改UA头和设置代理IP等方式来减少被封禁的风险。此外,我们也要注意网站的版权法律政策,避免侵犯其他权利人的合法权益。 总的来说,利用Python爬虫技术来获取电影资源并进行下载是一个技术含量较高的操作,需要具备一定的技术功底和实践经验。但也正因为如此,Python爬虫技术的应用领域才是如此广泛和丰富。如果你有兴趣,欢迎进一步了解和探索相关技术,希望可以对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值