【python】抓取猫眼电影排行
抓取猫眼电影上面Top100榜单,抓取的内容有电影名称,主演,上映时间,图片,得分等信息。抓取的内容以文件形式保存,地址为https://maoyan.com/board/4
1.分析
该榜单页面如下
拉到底部点击下一页,发现此时的URL变化了。
此时的URL变为https://maoyan.com/board/4?offset=10,比之前的URL多了参数offset=10,再点击下一页的URL为https://maoyan.com/board/4?offset=20,由此我们发现了规律,Top100,每页展示10部电影,这样100部电影需要请求10次
2.抓取首页
首先来抓取第一页的内容,我们编写一个get_one_page()的方法
import requestsdef get_one_page(url):response = requests.get(url)if response.status_code == 200:return response.textreturn Nonedef main():url = 'http://maoyan.com/board/4'html = get_one_page(url)print(html)main()
3.正则提取
网页在开发者模式下,network,查看源码
排名第一的霸王别姬的源码如下:
<dd><i class="board-index board-index-1">1</i><a href="/films/1203" title="霸王别姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}"><img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default" /><img data-src="https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c" alt="霸王别姬" class="board-img" /></a><div class="board-item-main"><div class="board-item-content"><div class="movie-item-info"><p class="name"><a href="/films/1203" title="霸王别姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王别姬</a></p><p class="star">主演:张国荣,张丰毅,巩俐</p>
<p class="releasetime">上映时间:1993-01-01</p> </div><div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">5</i></p> </div></div></div></dd>
可以看到一部电影对应一个dd
节点,排名信息在class
为board-index
的i
节点内,利用非贪婪匹配来提取i
节点内的信息,正则表达式为
<dd>.*?board-index.*?>(.*?)</i>
然后提取图片信息,接下来的a
节点,里面有两个img
节点,经过检查后发现,第二个img
节点的data-src
属性是图片的链接。于是提取第二个img
节点的data-src
属性,正则表达式改写如下:
<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)"
之后,提取电影名称,在后面的p
节点内,class
为name
,之后的a
节点里
<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>
主演信息在p
节点下class
为star
,上映时间在p
节点下class
为releasetime
,评分在‘p’节点下的’class’为score
,其中整数部分对应integer
,小数部分对应为fraction
。完整的表达式为
<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>
这样就可以将一页中10部电影的信息提取出来
定义解析页面的方法为parse_one_page()
,主要通过正则表达式提取想要的内容
def parse_one_page(html):pattern = re.compile( '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)items = re.findall(pattern,html)print(items)
提取出来的结果如下:
[('1', 'https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c', '霸王别姬', '\n 主演:张国荣,张丰毅,巩俐\n ', '上映时间:1993-01-01', '9.', '5'), ('2', 'https://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@160w_220h_1e_1c', '肖申克的救赎', '\n 主演:蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿\n ', '上映时间:1994-09-10(加拿大)', '9.', '5'), ('3', 'https://p0.meituan.net/movie/289f98ceaa8a0ae737d3dc01cd05ab052213631.jpg@160w_220h_1e_1c', '罗马假日', '\n 主演:格利高里·派克,奥黛丽·赫本,埃迪·艾伯特\n ', '上映时间:1953-09-02(美国)', '9.', '1'), ('4', 'https://p1.meituan.net/movie/6bea9af4524dfbd0b668eaa7e187c3df767253.jpg@160w_220h_1e_1c', '这个杀手不太冷', '\n 主演:让·雷诺,加里·奥德曼,娜塔莉·波特曼\n ', '上映时间:1994-09-14(法国)', '9.', '5'), ('5', 'https://p1.meituan.net/movie/b607fba7513e7f15eab170aac1e1400d878112.jpg@160w_220h_1e_1c', '泰坦尼克号', '\n 主演:莱昂纳多·迪卡普里奥,凯特·温丝莱特,比利·赞恩\n ', '上映时间:1998-04-03', '9.', '5'), ('6', 'https://p0.meituan.net/movie/da64660f82b98cdc1b8a3804e69609e041108.jpg@160w_220h_1e_1c', '唐伯虎点秋香', '\n 主演:周星驰,巩俐,郑佩佩\n ', '上映时间:1993-07-01(中国香港)', '9.', '1'), ('7', 'https://p0.meituan.net/movie/46c29a8b8d8424bdda7715e6fd779c66235684.jpg@160w_220h_1e_1c', '魂断蓝桥', '\n 主演:费雯·丽,罗伯特·泰勒,露塞尔·沃特森\n ', '上映时间:1940-05-17(美国)', '9.', '2'), ('8', 'https://p0.meituan.net/movie/223c3e186db3ab4ea3bb14508c709400427933.jpg@160w_220h_1e_1c', '乱世佳人', '\n 主演:费雯·丽,克拉克·盖博,奥利维娅·德哈维兰\n ', '上映时间:1939-12-15(美国)', '9.', '1'), ('9', 'https://p1.meituan.net/movie/ba1ed511668402605ed369350ab779d6319397.jpg@160w_220h_1e_1c', '天空之城', '\n 主演:寺田农,鹫尾真知子,龟山助清\n ', '上映时间:1992', '9.', '1'), ('10', 'https://p0.meituan.net/movie/b0d986a8bf89278afbb19f6abaef70f31206570.jpg@160w_220h_1e_1c', '辛德勒的名单', '\n 主演:连姆·尼森,拉尔夫·费因斯,本·金斯利\n ', '上映时间:1993-12-15(美国)', '9.', '2')]
我们处理一下结果,让它以字典的形式呈现:
def parse_one_page(html):pattern = re.compile( '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)items = re.findall(pattern,html)for item in items:yield{'排名':item[0],'图片':item[1],'电影名称':item[2],'演员':item[3].strip()[3:],'上映时间':item[4].strip()[5:],'评分':item[5]+item[6]}
运行结果如下:
{'排名': '1', '图片': 'https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@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'}
4.写入网页
我们将提取的结果写入文件,这里直接写入到一个文本文件中。这里通过JSON库
的dumps()
方法实现字典的序列化,并指定ensure_ascii
参数为False
,这样可以保证输出结果是中文形式而不是Unicode
编码。代码如下:
def write_to_json(content):with open('result.txt','a') as f:print(type(json.dumps(content)))f.write(json.dumps(content,ensure_ascii=False)+'\n')
content
为提取下来的一部电影的信息
5.整合代码
def main():url = 'http://maoyan.com/board/4'html = get_one_page(url)for item in parse_one_page(html):print(item)write_to_json(item)
实现了将第一页的十部电影爬取下来,保存到本地文件中。
6.分页爬取
我们想要爬取的是前100部电影,所以还需要遍历一下,给这个链接传入offset参数,实现其他90部电影的爬取
if __name__ == '__main__':for i in range(10):main(offset=i * 10)
那么在定义main()
时需要给它一个offset
参数
def main(offset):url = 'http://maoyan.com/board/4?offset=' + str(offset)html = get_one_page(url)for item in parse_one_page(html):print(item)write_to_json(item)
完整代码
import requests
import re
import jsondef get_one_page(url):response = requests.get(url)if response.status_code == 200:return response.textreturn None def parse_one_page(html):pattern = re.compile( '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)items = re.findall(pattern,html)for item in items:yield{'排名':item[0],'图片':item[1],'电影名称':item[2],'演员':item[3].strip()[3:],'上映时间':item[4].strip()[5:],'评分':item[5]+item[6]}def write_to_json(content):with open('result.txt','a') as f:print(type(json.dumps(content)))f.write(json.dumps(content,ensure_ascii=False)+'\n')def main(offset):url = 'http://maoyan.com/board/4?offset=' + str(offset)html = get_one_page(url)for item in parse_one_page(html):print(item)write_to_json(item)if __name__ == '__main__':for i in range(10):main(offset=i * 10)
效果如下:
文本文件内容如下
完成。
【python】抓取猫眼电影排行相关推荐
- 00_抓取猫眼电影排行TOP100
前言: 学习python3爬虫有一段时间了,熟悉了爬虫的一些基本原理和基本库的使用,本次就准备利用requests库和正则表达式来抓取猫眼电影排行TOP100的相关内容. 1.本次目标: 爬取猫眼电影 ...
- python3网络爬虫开发实战-抓取猫眼电影排行(正则表达式版)
抓取猫眼电影排行 目前没有学习HTML解析库,这里先选用正则表达式作为解析工具 目标 提取出猫眼电影top100的电影名称.时间.评分.图片等信息.提取的站点URL为http://maoyan.com ...
- 【Python】Python3网络爬虫实战-27、Requests与正则表达式抓取猫眼电影排行
本节我们利用 Requests 和正则表达式来抓取猫眼电影 TOP100 的相关内容,Requests 相较于 Urllib 使用更加方便,而目前我们还没有系统学习 HTML 解析库,所以可能对 HT ...
- 爬虫之抓取猫眼电影排行
一 需求 我们要提取出猫眼电影TOP100的电影名称.时间.评分.图片等信息,提取的站点URL为http://maoyan.com/board/4,提取的结果会以文件形式保存下来. 二 技术手段 利用 ...
- Requests与正则表达式抓取猫眼电影排行!
本节我们利用 Requests 和正则表达式来抓取猫眼电影 TOP100 的相关内容,Requests 相较于 Urllib 使用更加方便,而目前我们还没有系统学习 HTML 解析库,所以可能对 HT ...
- Python3网络爬虫实战-27、Requests与正则表达式抓取猫眼电影排行
本节我们利用 Requests 和正则表达式来抓取猫眼电影 TOP100 的相关内容,Requests 相较于 Urllib 使用更加方便,而目前我们还没有系统学习 HTML 解析库,所以可能对 HT ...
- 利用requests库抓取猫眼电影排行
文章目录 1.抓取目标 2.准备工作 3.抓取分析 4.抓取首页 5.正则提取 6.写入文件 7.整合代码 8.分页爬取 9.运行结果 10.本节代码 最近刚开始了解爬虫,学习了一下基本库的使用.跟着 ...
- 正则表达式和requests抓取猫眼电影排行
一.目的 利用学习的requests库和正则表达式抓取猫眼电影的排行榜的名称.时间.评分和图片等信息.提取站点的地址:https://maoyan.com/board/4 二.准备工作 确保开发环境安 ...
- 【Python3网络爬虫开发实战】3-基本库的使用-4抓取猫眼电影排行
本节中,我们利用requests库和正则表达式来抓取猫眼电影TOP100的相关内容.requests比urllib使用更加方便,而且目前我们还没有系统学习HTML解析库,所以这里就选用正则表达式来作为 ...
最新文章
- java集合框架介绍_Java集合框架介绍
- [leetcode] 105.从前序与中序遍历构造二叉树
- 前端学习(3203):复习类相关知识
- fla 走迷宫游戏 源码_迷宫新玩法,果断一试
- 模拟网页行为之工具篇
- 教你一招:职场程序员,如何在人工智能时代做好职场发展规划?
- linux编译内核的步骤
- 所有XP_SP2服务的详细介绍
- Select2的使用 联动筛选框的一个例子
- 如何使用IIS重写模块将HTTP重定向到HTTPS
- phpstorm 不能选择 php language level
- 【算法导论】第5章,概率分析和随机算法
- 怎样在php中制作电子相册,如何制作纪念电子相册
- 正点原子STM32f4系列其他串口通信失败问题解决
- matlab2016b版本安装
- FTP(匿名登录)未授权访问漏洞复现(vsftpd2.3.4)
- 2022李宏毅第14讲---机器终身学习(Life Long Learning)
- 未安装360系列应用情况下,Edge浏览器主页被360篡改,一直显示360导航
- 最好的开源网络入侵检测工具(网址及版本已验证并更新)
- SQL中的limit用法