python爬虫入门(四)爬取猫眼电影排行(使用requests库和正则表达式)

news2024/12/23 14:27:50

本例中,利用 requests 库和正则表达式来抓取猫眼电影 TOP100 的相关内容。

1.目标

提取出猫眼电影 TOP100 的电影名称、时间、评分、图片等信息,提取的站点 URL 为 http://maoyan.com/board/4,提取的结果会以文件形式保存下来。

2.抓取分析

抓取页面如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

页面中显示的有效信息有影片名称、主演、上映时间、上映地区、评分、图片等信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将网页滚动到最下方,可以发现有分页的列表。直接点击第 2 页,观察页面的 URL 和内容发生了怎样的变化。

第一页url:https://www.maoyan.com/board/4?offset=0

第二页url:https://www.maoyan.com/board/4?offset=10

可以发现offset从0变成了10,而每一页都显示了十部电影,由此可以总结出规律,offset 代表偏移量值。如果想获取 TOP100 电影,只需要分开请求 10 次,而 10 次的 offset 参数分别设置为 0、10、20…90 即可,这样获取不同的页面之后,再用正则表达式提取出相关信息,就可以得到 TOP100 的所有电影信息了。

3.抓取首页

首先抓取第一页的内容。实现 get_one_page 方法,并给它传入 url 参数。然后将抓取的页面结果返回。初步代码实现如下:

import requests
import re

def get_one_page(url):
    headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}
    response=requests.get(url,headers=headers)
    if response.status_code==200:
        return response.text
    return None

def main():
    html=get_one_page('https://www.maoyan.com/board/4?offset=0')
    print(html)

main()

4.正则提取

回到网页看一下页面的真实源码。在开发者模式下的 Network 监听组件中查看源代码。、

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意,这里不要在 Elements 选项卡中直接查看源码,因为那里的源码可能经过 JavaScript 操作而与原始请求不同,而是需要从 Network 选项卡部分查看原始请求得到的源码。

其中一个条目的源代码如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到,一部电影信息对应的源代码是一个 dd 节点,我们用正则表达式来提取这里面的一些电影信息。首先,需要提取它的排名信息。而它的排名信息是在 class 为 board-index 的 i 节点内,这里利用非贪婪匹配来提取 i 节点内的信息,正则表达式写为:

result_ranking=re.findall('<dd>.*?board-index.*?>(.*?)</i>',html,re.S)

随后需要提取电影的图片。

result_img=re.findall('<img\sdata-src="(.*?)"',html,re.S)

再往后,需要提取电影的名称.

result_name=re.findall('class="name".*?data-val.*?>(.*?)</a>',html,re.S)

再提取主演、发布时间、评分等内容时,都是同样的原理。最后,正则表达式写为:

result_star=re.findall('class="star".*?>(.*?)</p>',html,re.S)
result_star = [star.strip() for star in result_star]
result_time=re.findall('class="releasetime".*?>(.*?)</p>',html,re.S)
result_score=re.findall('class="score".*?integer.*?>(.*?)</i>.*?fraction">(.*?)</i>',html,re.S)

由于这里的主演前后带有空格和换行符,使用strip去除。

到这里我们就可以将一部电影的6个数据提取出来,但这样还不够,数据比较杂乱,我们再将匹配结果处理一下,生成字典,如下:

index=0
result={'ranking':result_ranking[index],
        'img':result_img[index],
        'name':result_name[index],
        'star':result_star[index],
        'time':result_time[index],
        'score':result_score[index]
        }

5.写入文件

随后,我们将提取的结果写入文件,这里直接写入到一个文本文件中。这里通过 JSON 库的 dumps 方法实现字典的序列化,并指定 ensure_ascii 参数为 False,这样可以保证输出结果是中文形式而不是 Unicode 编码。代码如下:

import json
def write_to_file(content):  
    with open('result.txt', 'a', encoding='utf-8') as f:  
        print(type(json.dumps(content)))  
        f.write(json.dumps(content, ensure_ascii=False)+'\n')

6.整合代码分页爬取

因为我们需要抓取的是 TOP100 的电影,所以还需要遍历一下,给这个链接传入 offset 参数,实现其他 90 部电影的爬取,此时添加如下调用即可:

import time
for i in range(10):
    url='https://www.maoyan.com/board/4?offset='+str(i*10)
    time.sleep(0.5)
    html=get_one_page(url)
    result_ranking=re.findall('<dd>.*?board-index.*?>(.*?)</i>',html,re.S)
    result_img=re.findall('<img\sdata-src="(.*?)"',html,re.S)
    result_name=re.findall('class="name".*?data-val.*?>(.*?)</a>',html,re.S)
    result_star=re.findall('class="star".*?>(.*?)</p>',html,re.S)
    result_star = [star.strip() for star in result_star]
    result_time=re.findall('class="releasetime".*?>(.*?)</p>',html,re.S)
    result_score=re.findall('class="score".*?integer.*?>(.*?)</i>.*?fraction">(.*?)</i>',html,re.S)
    for index in range(10):
        result={'ranking':result_ranking[index],
                'img':result_img[index],
                'title':result_name[index],
                'star':result_star[index],
                'reaease_time':result_time[index],
                'score':result_score[index]
                }
        write_to_file(result)

注意每次请求页面后加入暂停时间,否则会被反爬机制阻止,需要更换新的user-agent和cookie。

爬取结果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

番外:使用正则表达式对象改写

在上面的正则提取中我们为每一条要提取的信息都编写了一个正则表达式进行提取,可以利用compile方法编写正则表达式对象一次将六条信息全部提取出来,下面进行简化,我们将要提取的信息用一条正则表达式描述,使用group逐个提取出来。

可以看到,一部电影信息对应的源代码是一个 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。所以,可以用 name 做一个标志位,然后进一步提取到其内 a 节点的正文内容,此时正则表达式改写如下:

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

再提取主演、发布时间、评分等内容时,都是同样的原理。最后,正则表达式写为:

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>

接下来,通过调用 findall 方法提取出所有的内容。

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)

输出结果如下:

[('1', 'http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c', ' 霸王别姬 ', '\n                主演:张国荣,张丰毅,巩俐 \n        ', ' 上映时间:1993-01-01(中国香港)', '9.', '6'), ('2', 'http://p0.meituan.net/movie/__40191813__4767047.jpg@160w_220h_1e_1c', ' 肖申克的救赎 ', '\n                主演:蒂姆・罗宾斯,摩根・弗里曼,鲍勃・冈顿 \n        ', ' 上映时间:1994-10-14(美国)', '9.', '5'), ('3', 'http://p0.meituan.net/movie/fc9d78dd2ce84d20e53b6d1ae2eea4fb1515304.jpg@160w_220h_1e_1c', ' 这个杀手不太冷 ', '\n                主演:让・雷诺,加里・奥德曼,娜塔莉・波特曼 \n        ', ' 上映时间:1994-09-14(法国)', '9.', '5'), ('4', 'http://p0.meituan.net/movie/23/6009725.jpg@160w_220h_1e_1c', ' 罗马假日 ', '\n                主演:格利高利・派克,奥黛丽・赫本,埃迪・艾伯特 \n        ', ' 上映时间:1953-09-02(美国)', '9.', '1'), ('5', 'http://p0.meituan.net/movie/53/1541925.jpg@160w_220h_1e_1c', ' 阿甘正传 ', '\n                主演:汤姆・汉克斯,罗宾・怀特,加里・西尼斯 \n        ', ' 上映时间:1994-07-06(美国)', '9.', '4'), ('6', 'http://p0.meituan.net/movie/11/324629.jpg@160w_220h_1e_1c', ' 泰坦尼克号 ', '\n                主演:莱昂纳多・迪卡普里奥,凯特・温丝莱特,比利・赞恩 \n        ', ' 上映时间:1998-04-03', '9.', '5'), ('7', 'http://p0.meituan.net/movie/99/678407.jpg@160w_220h_1e_1c', ' 龙猫 ', '\n                主演:日高法子,坂本千夏,糸井重里 \n        ', ' 上映时间:1988-04-16(日本)', '9.', '2'), ('8', 'http://p0.meituan.net/movie/92/8212889.jpg@160w_220h_1e_1c', ' 教父 ', '\n                主演:马龙・白兰度,阿尔・帕西诺,詹姆斯・凯恩 \n        ', ' 上映时间:1972-03-24(美国)', '9.', '3'), ('9', 'http://p0.meituan.net/movie/62/109878.jpg@160w_220h_1e_1c', ' 唐伯虎点秋香 ', '\n                主演:周星驰,巩俐,郑佩佩 \n        ', ' 上映时间:1993-07-01(中国香港)', '9.', '2'), ('10', 'http://p0.meituan.net/movie/9bf7d7b81001a9cf8adbac5a7cf7d766132425.jpg@160w_220h_1e_1c', ' 千与千寻 ', '\n                主演:柊瑠美,入野自由,夏木真理 \n        ', ' 上映时间:2001-07-20(日本)', '9.', '3')]

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

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

相关文章

迅为龙芯2K1000开发板加载PMON镜像

注意&#xff1a;这里不建议大家在没有 Ejtag 的情况下对 PMON 进行操作&#xff0c;以免开发板变砖。 设置完网络后&#xff0c;我们输入命令 load -f 0xbfc00000 -r tftp://192.168.1.38/gzrom-dtb.bin&#xff0c;其中 192.168.1.38 为虚拟机 Ubuntu 的 IP 地址&#xff0…

数字孪生 Digital Twin 标准体系

1.什么是数字孪生&#xff1f; 数字孪生&#xff08;Digital T w in &#xff09;作为一种在信息世界刻画物理世界 、仿真物理世界 、优化物理世界 、可视化物理世界的重要技术 &#xff0c;为实现数字化转型 、智能化&#xff08;如智慧城市 、智能制造&#xff09; 、服务化 …

工业RFID系统识别原理

RFID技术是一种无线通信技术&#xff0c;可以实现非接触式的标签信息识别和读取&#xff0c;常常也被应用在工业生产、物流仓储等领域。工业RFID系统可以通过无线电信号识别和跟踪工业生产和管理领域中的物体&#xff0c;以下是工业RFID系统组成及相关应用介绍。 工业RFID系统组…

雅可比矩阵和雅可比坐标

雅可比行列式的简要介绍 一、说明 在本教程中&#xff0c;您将回顾一下雅可比行列式的简单介绍。完成本教程后&#xff0c;您将了解&#xff1a; 雅可比矩阵收集了可用于反向传播的多元函数的所有一阶偏导数。雅可比行列式在变量之间变化时非常有用&#xff0c;它充当一个坐标空…

阶段性学习小记

大家好&#xff0c;今天我们来详细的总结一下最近这段时间的习题。 习题一 #include<stdio.h> int main() {char arr[13] { 0 };int N 0;scanf("%d", &N);int k 0;int i 0;while (N){if (k ! 0 && k % 3 0)arr[i] ,;arr[i] N % 10 0;N / 1…

三步,金蝶K3的数据可视化了

数据可视化的一大特点就是“一图胜千言”&#xff0c;没什么能比图表更直观展现数据的了。那&#xff0c;金蝶K3系统上那海量数据能不能也做成数据可视化报表&#xff1f;操作复杂吗&#xff0c;难度大吗&#xff1f; 换了别的软件来做&#xff0c;操作多、难度大是板上钉钉&a…

重复性管理--从泛值到泛型以及泛函(中)--泛函是什么及为什么

在前面, 我们探讨了泛型范式在解决重复性问题上的应用, 在这里, 将继续探讨泛函范式在解决重复性问题上的作用. 注: 关于"泛函(functional)“这一名称, 前面说了, 泛型的本质是"参数化类型”, 那么, 按照这一思路, 泛函的意思也可以理解为"函数的参数化"或…

jvm垃圾回收算法有哪些及原理

目录 垃圾回收器1 Serial收集器2 Parallel收集器3 ParNew收集器4 CMS收集器5 G1回收器三色标记算法标记算法的过程三色标记算法缺陷多标漏标 垃圾回收器 垃圾回收机制&#xff0c;我们已经知道什么样的对象会成为垃圾。对象回收经历了什么——垃圾回收算法。那么谁来负责回收垃…

电子宣传册制作攻略,打造完美视觉效果

随着互联网的普及&#xff0c;电子宣传册已成为企业宣传的重要手段之一。但是你知道如何制作一份吸引人的电子宣传册&#xff0c;打造完美的视觉效果呢&#xff1f; 我们只需利用FLBOOK这个在线电子期刊制作平台&#xff0c;就可以打造出完美视觉效果的电子宣传册&#xff0c;操…

postgres和postgis下载链接

PostGIS Index of /postgis/windows/ postgres PostgreSQL 10.9 (64-bit) Download arcgis支持的版本 适用于 PostgreSQL 的 ArcGIS 11.1 和 ArcGIS Pro 3.1 要求 适用于—ArcGIS Enterprise | ArcGIS Enterprise 文档 arcgis如何连接 ArcMap 中的数据库连接—ArcMap | 文…

亚马逊添加购物车和收藏有什么区别

亚马逊的添加购物车和收藏是两个不同的功能&#xff0c;它们在用户行为和用途上有明显的区别&#xff1a; 1、添加购物车&#xff08;Add to Cart&#xff09;&#xff1a; 当用户点击"添加到购物车"按钮时&#xff0c;所选商品将被放入他们的购物车&#xff0c;而…

Power BI 傻瓜入门 7. 清理、转换和加载数据

本章内容包括 根据异常、属性和数据质量问题确定清理需求解决数据类型、值、键、结构和查询之间的不一致在数据加载之前根据查询和命名约定对数据进行流化处理 要进行任何数据清理和转换&#xff0c;您的组织需要分析师、工程师和侦探。这里的想法是&#xff0c;在进入系统之…

严重内卷的电商直播还有机会吗?教你如何在电商直播中脱颖而出!

用行业内的一句话来讲&#xff1a;如今的电商直播带货&#xff0c;没有最卷只有更卷&#xff01; 过去&#xff0c;电商直播带货只是中规中矩的“叫卖式”直播。随着“全民直播带货”的潮流兴起&#xff0c;电商直播带货行业的竞争变得越来越激烈&#xff1a;同质化的内容不断…

ADC架构种类说明_笔记

ADC架构种类说明 FLASH_架构ADC 可达GHz级别Pipeline_ADC架构SAR ADC架构![在这里插入图片描述](https://img-blog.csdnimg.cn/d42b65568b6648ec92b04e7b6c53fa0d.png?x-oss-processimage/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ieq5bCP5ZCD5aSa,size_20,col…

怎么下载微信视频号视频?

你是否曾经在浏览视频号时看到了一些精彩的视频号&#xff0c;希望能够保存下来&#xff0c;但却不知道如何下载&#xff1f;别担心&#xff01;本篇文章将为你介绍一个方便易用的视频号下载工具&#xff0c;让你轻松保存喜欢的视频号视频&#xff01;犀牛下载是一款专门为微信…

drf-分页,coreapi自动生成接口文档

目录 分页 视图类继承ListAPIView的分页具体使用方法 # 第一种PageNumberPagination页码分页 # 第二种LimitOffsetPagination偏移分页 # 第三种CursorPagination游标分页 视图类的使用 视图类继承APIView或GenericAPIView的分页使用 coreapi 如何写好接口文档 自动生…

众和策略可靠吗?A股构筑“市场底” 卫星互联网和5.5G逆势走强

可靠 周一A股三大指数低开低走&#xff0c;午后加快下探并创出今年以来新低&#xff0c;尾盘跌幅略有收窄。截至收盘&#xff0c;上证综指收于2939.29点&#xff0c;跌落1.47%&#xff1b;深证成指收于9425.98点&#xff0c;跌落1.51%&#xff1b;创业板指收于1864.91点&#…

AtCoder Beginner Contest 325 题解 A-E

目录 A - Takahashi sanB - World MeetingC - SensorsD - Printing MachineE - Our clients, please wait a moment A - Takahashi san 原题链接 题目描述 给你两个字符串&#xff0c;将第二个字符串改为san后与第一个字符串一起输出 public static void solve() throws IOExc…

spring懒加载

简介 Spring默认会在容器初始化的过程中&#xff0c;解析xml或注解&#xff0c;创建配置为单例的bean并保存到一个map中&#xff0c;这样的机制在bean比较少时问题不大&#xff0c;但一旦bean非常多时&#xff0c;spring需要在启动的过程中花费大量的时间来创建bean &#xff0…

Postman笔记

文章目录 1.安装2.简介和使用流程3 postman使用3.1 测试集与HTTP请求发送HTTP请求和分析响应数据 3.2 发送HTTP请求和分析响应数据3.3 Postman中请求体提交方式3.4 Postman使用之接口测试3.5 使用Postman新建一个mock服务3.6 请求数据的参数化3.7 断言与脚本导出 1.安装 官网地…