Python——2020爬取猫眼电影Top100(一系列分析和小白版正则小技巧)

本文主要是介绍Python——2020爬取猫眼电影Top100(一系列分析和小白版正则小技巧),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Python——2020爬取猫眼电影Top100(详解)

小白我在学习python的过程中看见买的书和csdn上的各位大佬都爬取过猫眼电影Top100当作练习,基本都是用正则表达式进行的爬取,那么我也用正则表达式进行爬取,并说一下正则表达式在编写的时候的一些小技巧,当然更方便的爬取也可以用xpath和pyquery中的类似于css选择器的语法进行爬取更为简单。

首先用谷歌浏览器打开目标网页,F12查看各类响应进行分析,主要看请求头和响应头的内容。(上图!)
在这里插入图片描述
在这里插入图片描述

我看的是名为4的请求响应,该就是包括了网页源码的请求响应,进行分析后可以看看其响应的展示(Preview)和返回内容(Response)。从中可以或多很多信息:

在General中:

我们可以得到网页的请求URL链接,请求方式get,返回响应码(200),以及远程服务器的地址和端口,在这它增加了Reffer Policy:Referrer判别策略,那么我们就简单介绍一些这个策略,这也是我在大佬博客中看到的。。

'''
no referrer when downgrade的意思:降级时不推荐。
从一个网站链接到另外一个网站会产生新的http请求,referrer是http请求中表示来源的字段。
no-referrer-when-downgrade表示从https协议降为http协议时不发送referrer给跳转网站的服务器。
在页面引入图片、JS 等资源,或者从一个页面跳到另一个页面,都会产生新的 HTTP 请求,浏览器一般都会给这些请求头加上表示来源的 Referrer 字段。Referrer 在分析用户来源时很有用,有着广泛的使用。但 URL 可能包含用户敏感信息,如果被第三方网站拿到很不安全。
'''

在Response Headers 中我主要关心的是 Content-Type:文档类型,指出返回的数据类型是什么。在这里返回的是 text/html ,也就是网页源码,也就是我想要的东西。

在Resquest Headers中,我最关心的是User-Agent,Cookies,Referer,Accept,这几个内容,一般在自己构造头请求的时候,一定会设置的是User-Agent,其次是Referer,Accept,最后还请求不成功的话,会使用session来保持会话,获得cookies,用带有cookies再去请求,一般就会解决,这个在我另一篇微博中有详细的说明哟!给出其链接。。。

HTTP请求过程——Chrome浏览器Network详解

在进行分析完成之后就可以进行正式的爬取,首先来看源码,来分析自己想获取的内容所在的各种标签,这里我看源码的时候,并不是直接用Elements选择卡直接产看对应的源码,因为那里的源码可能经过JavaScript操作而于原始请求不同,我选择再刚才 name 为 4 的请求中查看源码,如图:
在这里插入图片描述
在这里源码就是最原始的请求获得的源码,那么我们来对其 进行一些分析:

可以看出关于一部完整的信息全部封装在 dd 节点当中,然后便会看到它的排名,在 i 标签当中,其 class 为 board-index board-index-2,在用正则表达对其进行提取时,首先我们可以写出一个标志位,就好像这里的 board-index ,其余的代码用万能公式来代替 .? 非贪婪匹配,自己想获得信息用()括起来,如(.?),这样在返回的时候就只会返回括号当中的内容,所以对于排名的正则表达式如下:

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

接着看电影封面图片,其链接在 img 标签当中,尝试后得出我们想要的时第二个 img 标签当中的链接,选取标志位 data-src ,那么正则表达式便可以变为:

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

以此类推,下面还可以得到电影的演员,上映时间等信息,最后的正则表达式为:

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

然后分析网页链接的特点,十分简单,直接复制两个观察,太容易看出了:

#https://maoyan.com/board/4?offset=10
#https://maoyan.com/board/4?offset=90

接下来就直接进行爬取了,由于难的正则表达式和构造头部信息已经分析过,那么我就直接上代码啦:

import requests
import time
import reheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36','Referer': 'https://maoyan.com/board'}def getHTMLTest(url):try:r = requests.get(url,headers = headers,timeout = 2)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:print('请求网页错误')return ''def extract_information(text):#将正则表达式编译以可以重复使用pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)information = re.findall(pattern,text)return information'''
Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
'''
def output(information):for item in information:yield {'index':item[0],'image_url':item[1],'name':item[2],'actor':item[3].strip(),'time':item[4],'score':item[5].strip() + item[6].strip()}if __name__ == '__main__':#该URL用于测试url = 'https://maoyan.com/board/4?offset=0'url_list = []#构造猫眼电影排行榜所有网页URL链接for i in range(10):i = str(i*10)url_list.append('https://maoyan.com/board/4?offset='+ i)text = getHTMLTest(url)time.sleep(4)#print(text)information = extract_information(text)#print(information)for i in output(information):print(i)

这里还需要说明的时在处理正则返回的时候,因为返回的内容会出现空格符,在这里直接用字符串的 strip()函数进行处理,Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。

在进行爬取的时候,设置等待时间,这个也很重要,因为当进行大规模爬取的时候,请求响应速度过快,网站便会发现,封了你的Ip地址,当然应对次反爬,可以设置IP池,更换IP,我感觉刚开始的时候还是用time.sleep()方法直接设置时间吧。

还有就是将数据用yield的方法采用字典的方式返回,方便与以后保存,后台的执行结果如下图:
在这里插入图片描述
这样我们就完成啦,虽然很简单,但对我来说可以每一次爬取都是一次练习,分析,大家有什么意见和看法的时候可以评论私信,兄弟们一起成长!

这篇关于Python——2020爬取猫眼电影Top100(一系列分析和小白版正则小技巧)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/610438

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3