2018-12-30已更新
榜单规则:将猫眼电影库中的经典影片,按照评分和评分人数从高到低综合排序取前100名,每天上午10点更新。相关数据来源于“猫眼电影库”。
-
1
9.5
可以看到,电影的排名在一个dd节点下面,紧接着还有一个i节点,我们需要以"board-index"开头的class属性的文本:
- 1
因此,相应的路径可以写为://dd/i[starts-with(@class,'board-index')]/text()
接下来,我们发现图片在一个a节点下面,但是有两张图片。经过检查,第二个img节点下的data-src属性是图片的链接:
因此,相应的路径可以写为://a/img[2]/@data-src
再接下来,电影的名称,在一个p节点下面,class为"name",下面还有一个a节点:
相应的路径可以写为://p[@class='name']/a/@title
上映时间,在一个p节点下面,class为"releasetime":
上映时间:1993-01-01
相应的路径可以写为://p[@class='releasetime']/text()
评分,在一个p节点下面,class为"score",下面还有一个i节点:
9.5
相应的路径可以写为://p[@class='score']/i/text()
完整的路径如下(用|连接):
//dd/i[starts-with(@class,'board-index')]/text()|//a/img[2]/@data-src|//p[@class='name']/a/@title|//p[@class='releasetime']/text()|//p[@class='score
下面,我们再定义一个解析网页的方法:
def parse_one_page(html): result=html.xpath("//dd/i[starts-with(@class,'board-index')]/text()|//a/img[2]/@data-src|//p[@class='name']/a/@title|//p[@class='releasetime']/text()|//p[@class='score']/i/text()") return result
输出的匹配结果如下:
['1', 'https://img8.php1.cn/3cdc5/12fff/2be/6e99e781472a90a3.jpeg@160w_220h_1e_1c', '霸王别姬', '上映时间:1993-01-01', '9.', '5', '2', 'https://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@160w_220h_1e_1c', '肖申克的救赎', '上映时间:1994-09-10(加拿大)', '9.', '5', '3', 'https://p0.meituan.net/movie/289f98ceaa8a0ae737d3dc01cd05ab052213631.jpg@160w_220h_1e_1c', '罗马假日', '上映时间:1953-09-02(美国)', '9.', '1', '4', 'https://p1.meituan.net/movie/6bea9af4524dfbd0b668eaa7e187c3df767253.jpg@160w_220h_1e_1c', '这个杀手不太冷', '上映时间:1994-09-14(法国)', '9.', '5', '5', 'https://p1.meituan.net/movie/b607fba7513e7f15eab170aac1e1400d878112.jpg@160w_220h_1e_1c', '泰坦尼克号', '上映时间:1998-04-03', '9.', '5', '6', 'https://p0.meituan.net/movie/da64660f82b98cdc1b8a3804e69609e041108.jpg@160w_220h_1e_1c', '唐伯虎点秋香', '上映时间:1993-07-01(中国香港)', '9.', '1', '7', 'https://p0.meituan.net/movie/46c29a8b8d8424bdda7715e6fd779c66235684.jpg@160w_220h_1e_1c', '魂断蓝桥', '上映时间:1940-05-17(美国)', '9.', '2', '8', 'https://p0.meituan.net/movie/223c3e186db3ab4ea3bb14508c709400427933.jpg@160w_220h_1e_1c', '乱世佳人', '上映时间:1939-12-15(美国)', '9.', '1', '9', 'https://p1.meituan.net/movie/ba1ed511668402605ed369350ab779d6319397.jpg@160w_220h_1e_1c', '天空之城', '上映时间:1992', '9.', '1', '10', 'https://p0.meituan.net/movie/b0d986a8bf89278afbb19f6abaef70f31206570.jpg@160w_220h_1e_1c', '辛德勒的名单', '上映时间:1993-12-15(美国)', '9.', '2']
可以看出,上述的格式还是有些杂乱,让我们修改一下解析网页的方法,使其变为整齐的结构化数据:
def parse_one_page(html): result=html.xpath("//dd/i[starts-with(@class,'board-index')]/text()|//a/img[2]/@data-src|//p[@class='name']/a/@title|//p[@class='releasetime']/text()|//p[@class='score']/i/text()") for i in range(0,55,6): yield {"index": result[i], "movie_name": result[i+2],\ "pic": result[i+1], "release": result[i+3],\ "score": result[i+4]+result[i+5]}
现在匹配结果变成了字典格式:
{'index': '1', 'movie_name': '霸王别姬', 'pic': 'https://img8.php1.cn/3cdc5/12fff/2be/6e99e781472a90a3.jpeg@160w_220h_1e_1c', 'release': '上映时间:1993-01-01', 'score': '9.5'} {'index': '2', 'movie_name': '肖申克的救赎', 'pic': 'https://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@160w_220h_1e_1c', 'release': '上映时间:1994-09-10(加拿大)', 'score': '9.5'} {'index': '3', 'movie_name': '罗马假日', 'pic': 'https://p0.meituan.net/movie/289f98ceaa8a0ae737d3dc01cd05ab052213631.jpg@160w_220h_1e_1c', 'release': '上映时间:1953-09-02(美国)', 'score': '9.1'} {'index': '4', 'movie_name': '这个杀手不太冷', 'pic': 'https://p1.meituan.net/movie/6bea9af4524dfbd0b668eaa7e187c3df767253.jpg@160w_220h_1e_1c', 'release': '上映时间:1994-09-14(法国)', 'score': '9.5'} {'index': '5', 'movie_name': '泰坦尼克号', 'pic': 'https://p1.meituan.net/movie/b607fba7513e7f15eab170aac1e1400d878112.jpg@160w_220h_1e_1c', 'release': '上映时间:1998-04-03', 'score': '9.5'} {'index': '6', 'movie_name': '唐伯虎点秋香', 'pic': 'https://p0.meituan.net/movie/da64660f82b98cdc1b8a3804e69609e041108.jpg@160w_220h_1e_1c', 'release': '上映时间:1993-07-01(中国香港)', 'score': '9.1'} {'index': '7', 'movie_name': '魂断蓝桥', 'pic': 'https://p0.meituan.net/movie/46c29a8b8d8424bdda7715e6fd779c66235684.jpg@160w_220h_1e_1c', 'release': '上映时间:1940-05-17(美国)', 'score': '9.2'} {'index': '8', 'movie_name': '乱世佳人', 'pic': 'https://p0.meituan.net/movie/223c3e186db3ab4ea3bb14508c709400427933.jpg@160w_220h_1e_1c', 'release': '上映时间:1939-12-15(美国)', 'score': '9.1'} {'index': '9', 'movie_name': '天空之城', 'pic': 'https://p1.meituan.net/movie/ba1ed511668402605ed369350ab779d6319397.jpg@160w_220h_1e_1c', 'release': '上映时间:1992', 'score': '9.1'} {'index': '10', 'movie_name': '辛德勒的名单', 'pic': 'https://p0.meituan.net/movie/b0d986a8bf89278afbb19f6abaef70f31206570.jpg@160w_220h_1e_1c', 'release': '上映时间:1993-12-15(美国)', 'score': '9.2'}
接下来将结果保存到MongoDB,先写一个保存到mongo数据库的方法:
def write_to_mongo(result): query=result collection.update_one(query,{'$set':result},upsert=True)
注:为了避免保存重复的数据,这里把upsert改为True。
其他步骤还和以前一样,完整代码如下:
from lxml import etree import requests import pymongo import time def get_one_page(url): try: headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) \ AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'} response=requests.get(url, headers=headers) if response.status_code==200: return response.text return None except requests.RequestException: print("Fail") def parse_one_page(html): result=html.xpath("//dd/i[starts-with(@class,'board-index')]/text()|//a/img[2]/@data-src|//p[@class='name']/a/@title|//p[@class='releasetime']/text()|//p[@class='score']/i/text()") for i in range(0,55,6): yield {"index": result[i], "movie_name": result[i+2],\ "pic": result[i+1], "release": result[i+3],\ "score": result[i+4]+result[i+5]} def write_to_mongo(result): query=result collection.update_one(query,{'$set':result},upsert=True) def main(offset): url="https://maoyan.com/board/4?offset={}".format(offset) html=get_one_page(url) html=etree.HTML(html) result=parse_one_page(html) for i in result: write_to_mongo(i) if __name__=='__main__': client=pymongo.MongoClient(host='localhost',port=27017) db=client['test'] collection=db['top100_movies'] for i in range(10): main(offset=i*10) time.sleep(1)
推荐阅读-
本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]本文探讨了在不使用服务器控件的情况下,如何通过多种方法获取并修改页面中的HTML元素值。除了常见的AJAX方式,还介绍了其他可行的技术方案。 ... [详细]本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]Ihaveastringwithquotesaroundthepathasfollows:我在路径周围有一个带引号的字符串,如下所示:C:\ProgramFiles(x ... [详细]HTML很容易写,但创建网页时,您经常需要重复做同样的任务,如创建表单。在这篇文章中,我收集了10个超有用的HTML代码片段,有HTML5启动模板、空白图片、打电话和发短信、自动完 ... [详细]Tags | 热门标签RankList | 热门文章
- 1谷歌Doodle庆祝特别日子
- 2构建Snowflake中的近实时数据摄取管道
- 3智能全栈云风暴:AI引领的企业转型之路
- 4Mathcad+: 断点设置指南
- 5Python中使用Protobuf处理数据
- 6深入理解运算符及其应用
- 7生成并绘制经验联合概率密度函数(PDF)和累积分布函数(CDF)
- 8数字图像处理与机器视觉随书代码在VS2012中编译报错的解决办法转载
- 9基于花生壳域名的Android与ESP8266远程控制系统搭建
- 10深入理解ThinkPHP5.1自定义标签的应用与实现
- 11C#中使用Parallel类实现多线程编程
- 12求解多维数组中的最大值与最小值
- 13‘咀’字详解:读音、笔画、释义及应用
- 14Win7系统桌面壁纸设置失败导致黑屏问题及解决方案
- 15利用SecureCRT实现远程连接树莓派