抓取猫眼电影上面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节点,排名信息在classboard-indexi节点内,利用非贪婪匹配来提取i节点内的信息,正则表达式为

<dd>.*?board-index.*?>(.*?)</i>

然后提取图片信息,接下来的a节点,里面有两个img节点,经过检查后发现,第二个img节点的data-src属性是图片的链接。于是提取第二个img节点的data-src属性,正则表达式改写如下:

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)"

之后,提取电影名称,在后面的p节点内,classname,之后的a节点里

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>

主演信息在p节点下classstar,上映时间在p节点下classreleasetime,评分在‘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】抓取猫眼电影排行相关推荐

  1. 00_抓取猫眼电影排行TOP100

    前言: 学习python3爬虫有一段时间了,熟悉了爬虫的一些基本原理和基本库的使用,本次就准备利用requests库和正则表达式来抓取猫眼电影排行TOP100的相关内容. 1.本次目标: 爬取猫眼电影 ...

  2. python3网络爬虫开发实战-抓取猫眼电影排行(正则表达式版)

    抓取猫眼电影排行 目前没有学习HTML解析库,这里先选用正则表达式作为解析工具 目标 提取出猫眼电影top100的电影名称.时间.评分.图片等信息.提取的站点URL为http://maoyan.com ...

  3. 【Python】Python3网络爬虫实战-27、Requests与正则表达式抓取猫眼电影排行

    本节我们利用 Requests 和正则表达式来抓取猫眼电影 TOP100 的相关内容,Requests 相较于 Urllib 使用更加方便,而目前我们还没有系统学习 HTML 解析库,所以可能对 HT ...

  4. 爬虫之抓取猫眼电影排行

    一 需求 我们要提取出猫眼电影TOP100的电影名称.时间.评分.图片等信息,提取的站点URL为http://maoyan.com/board/4,提取的结果会以文件形式保存下来. 二 技术手段 利用 ...

  5. Requests与正则表达式抓取猫眼电影排行!

    本节我们利用 Requests 和正则表达式来抓取猫眼电影 TOP100 的相关内容,Requests 相较于 Urllib 使用更加方便,而目前我们还没有系统学习 HTML 解析库,所以可能对 HT ...

  6. Python3网络爬虫实战-27、Requests与正则表达式抓取猫眼电影排行

    本节我们利用 Requests 和正则表达式来抓取猫眼电影 TOP100 的相关内容,Requests 相较于 Urllib 使用更加方便,而目前我们还没有系统学习 HTML 解析库,所以可能对 HT ...

  7. 利用requests库抓取猫眼电影排行

    文章目录 1.抓取目标 2.准备工作 3.抓取分析 4.抓取首页 5.正则提取 6.写入文件 7.整合代码 8.分页爬取 9.运行结果 10.本节代码 最近刚开始了解爬虫,学习了一下基本库的使用.跟着 ...

  8. 正则表达式和requests抓取猫眼电影排行

    一.目的 利用学习的requests库和正则表达式抓取猫眼电影的排行榜的名称.时间.评分和图片等信息.提取站点的地址:https://maoyan.com/board/4 二.准备工作 确保开发环境安 ...

  9. 【Python3网络爬虫开发实战】3-基本库的使用-4抓取猫眼电影排行

    本节中,我们利用requests库和正则表达式来抓取猫眼电影TOP100的相关内容.requests比urllib使用更加方便,而且目前我们还没有系统学习HTML解析库,所以这里就选用正则表达式来作为 ...

最新文章

  1. java集合框架介绍_Java集合框架介绍
  2. [leetcode] 105.从前序与中序遍历构造二叉树
  3. 前端学习(3203):复习类相关知识
  4. fla 走迷宫游戏 源码_迷宫新玩法,果断一试
  5. 模拟网页行为之工具篇
  6. 教你一招:职场程序员,如何在人工智能时代做好职场发展规划?
  7. linux编译内核的步骤
  8. 所有XP_SP2服务的详细介绍
  9. Select2的使用 联动筛选框的一个例子
  10. 如何使用IIS重写模块将HTTP重定向到HTTPS
  11. phpstorm 不能选择 php language level
  12. 【算法导论】第5章,概率分析和随机算法
  13. 怎样在php中制作电子相册,如何制作纪念电子相册
  14. 正点原子STM32f4系列其他串口通信失败问题解决
  15. matlab2016b版本安装
  16. FTP(匿名登录)未授权访问漏洞复现(vsftpd2.3.4)
  17. 2022李宏毅第14讲---机器终身学习(Life Long Learning)
  18. 未安装360系列应用情况下,Edge浏览器主页被360篡改,一直显示360导航
  19. 最好的开源网络入侵检测工具(网址及版本已验证并更新)
  20. SQL中的limit用法

热门文章

  1. 数字化研发项目方案(下)
  2. 凯利公式在期货交易中杠杆比例控制上的应用举例及组合投资策略探讨
  3. Android开发MVP模式--项目实战
  4. aws服务器_AWS无服务器应用程序镜头—摘要
  5. 基于Android的乡镇旅游指南APP-景点-酒店预订系统
  6. 黑马物联G600D云盒子应用场景!
  7. 正确使用锁保护共享数据,协调异步线程
  8. WTL : add HexEdit to CPaneContainerImpl
  9. C语言实现LRU缓存策略
  10. js学习过程中的笔记