Python爬取电影天堂

本文概要

前言:

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

一、爬虫的重要性:

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

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

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

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

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

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

from lxml import etree
import requestsurl = '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.htmlif __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 拿到每个电影的详情urlhtml = 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+1return 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'] = titlezoomE = 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'] = coverinfos = zoomE.xpath(".//text()")for index,info in enumerate(infos):if info.startswith('◎年&emsp;&emsp;代'):info = info.replace("◎年&emsp;&emsp;代", "").strip() # strip 去掉空格movie['year'] = infoelif info.startswith("◎产&emsp;&emsp;地"):info = info.replace("◎产&emsp;&emsp;地", "").strip()movie["country"] = infoelif info.startswith("◎类&emsp;&emsp;别"):info = info.replace("◎类&emsp;&emsp;别", "").strip()movie["category"] = infoelif info.startswith("◎豆瓣评分"):info = info.replace("◎豆瓣评分", "").strip()movie["douban_rating"] = infoelif info.startswith("◎片&emsp;&emsp;长"):info = info.replace("◎片&emsp;&emsp;长","").strip()movie["duration"] = infoelif info.startswith("◎导&emsp;&emsp;演"):info = info.replace("◎导&emsp;&emsp;演", "").strip()movie["director"] = infoelif 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("◎"): # 也就是到了标签 的 ◎ 就退出breakactors.append(actor)movie['actor'] = actorselif info.startswith('◎简&emsp;&emsp;介 '):# info = info.replace('◎简&emsp;&emsp;介 ',"").strip()for x in range(index+1,len(infos)):if infos[x].startswith("◎获奖情况"):breakprofile = 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("【下载地址】"):breakaward = 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_urlreturn  movie

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

最后结果:

前7页结果




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

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料

在这里插入图片描述

1️⃣零基础入门

① 学习路线

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

② 路线对应学习视频

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

③练习题

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

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

① 文档和书籍资料

在这里插入图片描述

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

①Python工具包

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

②Python实战案例

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

③Python小游戏源码

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

4️⃣Python面试题

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/239394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言中的#pragma预处理指令

C语言中的#pragma预处理指令 C语言中的#pragma预处理指令 C语言中的#pragma预处理指令一. pragma预处理指令概念二. pragma预处理指令的作用三. 预处理指令的参数1&#xff09;message参数2&#xff09;code_seg参数3&#xff09;once参数4&#xff09;pack参数5&#xff09; s…

司铭宇老师《营销总监培训课程》内容

在今天这个竞争激烈的商业环境中&#xff0c;作为一家公司的营销总监&#xff0c;你是否感到压力重重&#xff1f;你是否在寻找一种方式来提升你的销售业绩&#xff0c;激发你的团队潜力&#xff0c;并在市场中占据优势&#xff1f;如果你的答案是肯定的&#xff0c;营销总监作…

2. 行为模式 - 命令模式

亦称&#xff1a; 动作、事务、Action、Transaction、Command 意图 命令模式是一种行为设计模式&#xff0c; 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中&#xff0c; 且能实现可撤销…

C++之深拷贝进阶

目录 拷贝构造函数的深拷贝进阶版本 赋值运算符重载的深拷贝进阶 总结 上期我们学习了C中深拷贝的传统版本&#xff0c;今天我们将学习更为高效的版本。 拷贝构造函数的深拷贝进阶版本 传统版本代码如下&#xff1a; string(string& s):_str(new char[strlen(s._str)…

前端视角看待在百模大战中AI行业发展有何新趋势?

在百模大战中AI行业发展有何新现象&#xff1f; 前端开发者视角下的AI趋势 随着人工智能&#xff08;AI&#xff09;在各行各业的应用&#xff0c;AI技术的发展日新月异。在这个过程中&#xff0c;百模大战成为了AI行业的一个重要现象。 百模大战是指多个模型在各种任务中的…

Docker——微服务的部署

Docker——微服务的部署 文章目录 Docker——微服务的部署初识DockerDocker与虚拟机Docker架构安装DockerCentOS安装Docker卸载&#xff08;可选&#xff09;安装docker启动docker配置镜像加速 Docker的基本操作Docker的基本操作——镜像Docker基本操作——容器Docker基本操作—…

前端案例—antd的表单项默认值提交时没有生效

前端案例—antd的表单项默认值提交时没有生效 <Form onFinish{handleCommit} initialValues{{"ruleApplyDate":{"type":0}}} ><Form.Item{...formItemLayout}label"规则应用时间"name"ruleApplyDate"requiredstyle{{ margin:…

进入不了Bios?进入Bios的方法都在这了,肯定能进!

前言 有些小伙伴可能在重装系统的第一步就卡住了&#xff0c;接着就放弃了。哇哈哈哈啊&#xff0c;先让小白笑会&#xff5e; 根据小白十二年的装机经验&#xff0c;不同主板进入Bios的时候有不同的姿势。也许要蹲着大喊Bios才能进入呢&#xff1f;要不试试&#xff1f; 好了…

自动化框架如何搭建?让10年阿里自动化测试老司机帮你搞定!自动化测试脚本怎么写?

一、何为框架&#xff1f;何为自动化测试框架&#xff1f; 无论是日常技术交流&#xff0c;还是在自动化测试实践中&#xff0c;经常会听到一个词叫&#xff1a;框架。之前对“框架”这个词知其然不知其所以然。现在看过一些资料以及加上我自己的一些实践有了我自己的一些看法…

测试开发体系介绍——测试体系介绍-L1

目录&#xff1a; 软件测试基础概念 软件测试:软件测试作用:软件缺陷:软件测试原则:软件测试对象:测试用例软件开发流程 软件:软件生命周期:软件开发流程:瀑布模型:瀑布模型优缺点敏捷开发模型: XP - 极限编程:SCRUM:DevOps&#xff1a;DevOps 生命周期&#xff1a;DevOps 对发…

C语言—每日选择题—Day58

指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 下面字符常量正确的是&#xff08; &#xff09; A&#xff1a;"c" B&#xff1a;\\ C&#xff1a;n D&#xff1a;ab 答案及解析…

金蝶云星空业务对象添加网控设置

文章目录 金蝶云星空业务对象添加网控设置排查是否已经网控设置网控设置 金蝶云星空业务对象添加网控设置 排查是否已经网控设置 网控设置

这6点电缆故障测试仪的使用方法为什么这么重要?

电缆故障检测一直是电力检测工人定期需要做的一件事&#xff0c;通过定期对电缆线的检测&#xff0c;可以排除电缆线的一些故障&#xff0c;从而让电缆线可以正常工作&#xff0c;方便千家万户&#xff01;然而电力检测工人用来检测电缆故障的设备&#xff0c;通常就是电缆故障…

如何将采购时间从几天缩短为几小时?

从事采购工作时&#xff0c;采购需要多长时间是面临的常见挑战之一。 采购是供应链中的一个环节&#xff0c;大家都不想看到整个流程被拖慢&#xff0c;但很多时候&#xff0c;事情往往向超出控制范围的方向发展。不过&#xff0c;企业可以通过多种方式简化采购和管理整个采购…

【JavaWeb学习笔记】14 - 三大组件其二 Listener Filter

API文档JAVA_EE_api_中英文对照版 Listener 一、监听器Listener 1. Listener监听器它是JavaWeb的三大组件之一。 JavaWeb的三大组件分别是: Servlet程序、Listener监听器、Filter过滤器 2. Listener是JavaEE的规范&#xff0c;就是接口 3.监听器的作用是&#xff0c;监听某…

Java 虚拟机中的内存结构

1 内存结构 1.1 程序计数器 1.1.1 定义 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;是记住下一条 jvm 指令的执行地址 特点&#xff1a; 是线程私有的&#xff08;每个线程独有自己的一份&#xff09;不会存在内存溢出 1.1.2 作…

Linux文件与目录权限基础

上一章学习了Linux用户与组的概念&#xff0c;以及创建用户和组&#xff0c;修改信息等&#xff0c;这次需要将用户应用在实际中&#xff0c;Linux系统中一切皆文件&#xff0c;文件也是基于用户进行权限管理的&#xff0c;因此需要了解文件与目录的权限管理基础。 一、文件与目…

基于车轮安装MEMS IMU的航迹推算算法研究

本文由来&#xff1a;前一篇文章“零速更新(ZUPT)辅助INS定位”&#xff0c;并通过开源方案ZUPT-aided-INS进行了算法验证。在验证过程中&#xff0c;意识到在进行多源传感器融合算法中&#xff0c;利用载体自身运动信息进行约束修正非常重要&#xff0c;因为这不需要额外增加传…

Android开发中实时语音开发之华为实时语音识别

上一篇(Android开发中&#xff0c;百度语音集成之一)简单的讲解了百度语音的识别&#xff0c;今天讲解一个华为的语音识别: 1.初始化&#xff1a; initRecognizer()mSpeechRecognizer MLAsrRecognizer.createAsrRecognizer(context) mSpeechRecognizer.setAsrListener(SpeechR…

前端案例—antdDesign的Select多选框组件加上全选功能

前端案例—antdDesign的Select多选框组件加上全选功能。 实现效果如下&#xff1a; Select 组件里有这个属性&#xff0c;可以利用这个对下拉菜单进行自定义。 const handleChange (e, value) > {setSelectState(e.target.checked)let arr productOptions?productOption…