python爬取豆瓣电影并分析「Python从零到壹六网络爬虫之爬取豆瓣TOP250电影详解」

来源:TVB影视大全人气:546更新:2023-03-19 15:45:12

本文从实战出发,让读者初步了解分析网页结构方法并调用BeautifulSoup技术爬取网络数据,后面章节将进一步深入讲解。

豆瓣(Douban)是一个社区网站,创立于2005年3月6日。该网站以书影音起家,提供关于书籍、电影、音乐等作品的信息,其作品描述和评论都是由用户提供(User-Generated Content,简称UGC),是Web 2.0网站中具有特色的一个网站。该网站提供了书影音推荐、线下同城活动、小组话题交流等多种服务功能,致力于帮助都市人群发现生活中有用的事物。

本文主要介绍BeautifulSoup技术爬取豆瓣电影排名前250名的电影信息。第一部分将介绍分析网页DOM树结构。爬取豆瓣的地址为:

https://movie.douban.com/top250?format=text

更多Python爬虫学习资料可以私信关键字【资料】领取

上图中显示了豆瓣热门的250部电影的信息,包括电影中文名称、英文名称、导演、主演、评分、评价数等信息,接下来需要对其进行DOM树结构分析。HTML网页是以标签对的形式出现,如、等,这种标签对呈树形结构显示,通常称为DOM树结构。

在得到一个网页之后,我们需要结合浏览器对其进行元素分析。比如豆瓣电影网站,选中第一部电影《肖申克的救赎》,右键鼠标“检查”(Chrome浏览器称为“检查”,其他浏览器可能称为“审查元素”等),如下图2所示。

更多Python爬虫学习资料可以私信关键字【资料】领取

显示结果如图3所示,可以发现它是在路径下,由很多个组成,每一个分别对应一部电影的信息。其中,电影《肖申克的救赎》HTML中对应内容为:

通过class值为“item”可以定位电影的信息。调用BeautifulSoup扩展包的find_all(attrs={“class”:“item”}) 函数可以获取其信息。

更多Python爬虫学习资料可以私信关键字【资料】领取

对应的HTML部分代码如下:

下面通过Python3代码可以获取电影的信息,调用BeautifulSoup中的find_all()函数获取的信息,其结果如图4所示。

运行结构如图4所示,爬取了豆瓣Top250的第一页电影的信息,包括序号、影片名、导演及主演信息、评分、评价人数等。

更多Python爬虫学习资料可以私信关键字【资料】领取

注意:urllib.error.HTTPError: HTTP Error 418

如果直接使用urllib.request.urlopen(url)会提示该错误,这是因为爬虫被拦截,需要模拟浏览器访问,这里可以打开浏览器按下F12,找到对应Headers内容,然后在Python代码中设置User-Agent即可模拟该浏览器请求。

更多Python爬虫学习资料可以私信关键字【资料】领取

urlopen()函数:

read()函数:

BeautifulSoup函数:

find_all()函数:

通过前一部分我们获取了电影的简介信息,但是这些信息是融合在一起的,而在数据分析时,通常需要将某些具有使用价值的信息提取出来,并存储至数组、列表或数据库中,比如电影名称、演员信息、电影评分等特征。

本部分将结合BeautifulSoup技术,采用节点定位方法获取具体的值。点开HTML网页,检查对应的节点,可以看到该电影的构成情况,再定位节点内容,如节点可以获取标题,节点可以获取电影评分和评价人数。

更多Python爬虫学习资料可以私信关键字【资料】领取

获取节点的核心代码如下,定位class属性为“item”的div布局后,再调用find_all()函数查找class属性为title的标签,并获取第一个值输出,即title[0]。接着调用find()函数爬取评分信息,通过get_text()函数获取内容。

更多Python爬虫学习资料可以私信关键字【资料】领取

讲到这里,我们第一页的25部电影信息就爬取成功了,而该网页共10页,每页显示25部电影,如何获取这250部完整的电影信息呢?这就涉及到链接跳转和网站的翻页分析。网站的翻页分析通常有四种方法:

本文主要采用第一种分析方法,后面讲述Selenium技术时,会介绍鼠标模拟点击事件操作的跳转方法。

更多Python爬虫学习资料可以私信关键字【资料】领取

通过点击图6中的第2页、第3页、第10页,我们可以看到网页URL的变化如下。

它是存在一定规律的,top250?start=25表示获取第2页(序号为26到50号)的电影信息;top250?start=50表示获取第3页(序号为51到75号)的电影信息,依次类推,我们写一个循环即可获取完整的250部电影信息。核心代码如下:

注意:当i初始值为0,num值为0,获取第1页信息;当i增加为1,num值为25,获取第2页信息;当i增加为9,num值为225,获取第10页的信息。

讲到这里,爬取豆瓣网电影信息的DOM树结构分析、网页链接跳转已经分析完成,下一小节是讲解完整的代码。

完整代码为test02.py文件,如下所示。

运行结果如图7所示,爬取了电影名称、网页连接、评分评论数和影评等信息。

更多Python爬虫学习资料可以私信关键字【资料】领取

并且将爬取的250部电影信息存储到“Result_Douban.txt”文件中,如下图所示。

更多Python爬虫学习资料可以私信关键字【资料】领取

在代码中,主函数定义循环依次获取不同页码的URL,然后调用crawl(url)函数对每页的电影信息进行定向爬取。在crawl(url)函数中,通过urlopen()函数访问豆瓣电影网址,然后调用BeautifulSoup函数进行HTML分析,前面第一部分讲解了每部电影都位于…节点下,故采用如下for循环依次定位到每部电影,然后再进行定向爬取。

具体方法如下。

(1) 获取序号

序号对应的HTML源码如图8所示,需要定位到1节点,通过find(‘em’)函数获取具体的内容。

更多Python爬虫学习资料可以私信关键字【资料】领取

对应的代码如下:

(2) 获取电影名称

电影名称对应的HTML源码如图9所示,包括class='title’对应中文名称和英文名称,class='other’对应电影其他名称。

更多Python爬虫学习资料可以私信关键字【资料】领取

对应的代码如下,因为HTML中包含两个title,即,所以使用下面的函数获取两个标题:

但这里我们仅需要中文标题,则直接通过变量name[0]获取其第一个值,即为中文名称,再调用get_text()函数获取其内容。

同时,上述代码调用codecs库进行了文件处理,其中文件操作的核心代码如下,打开文件三个参数分别是:文件名、读写方式、编码方式,此处文件名为“Result_Douban.txt”,采用文件写方式(a),编码方式是utf-8。

3.获取电影链接

电影链接对应的HTML源码如上图9所示,定位到节点下的节点,然后获取属性位href的值,即:attrs[‘href’]。

获取评分和内容的方法一样,调用函数即可获取:

但是存在一个问题,它输出的结果将评分数和评价数放在了一起,如“9.4 783221人评价”,而通常在做分析的时候,我们是将评分数存在一个变量中,评价数存在另一变量中。

这就需要进行简单的文本处理,这里推荐大家使用前面讲述过的正则表达式来处理,将此段代码修改如下,调用re.compile(r’d .?d*’)获取字符串中的数字。第一个数字为电影的分数,第二个数字为评论数。

获取的结果前后对比如图10所示。

更多Python爬虫学习资料可以私信关键字【资料】领取

https://movie.douban.com/subject/1292052/

该网页打开如图11所示。

更多Python爬虫学习资料可以私信关键字【资料】领取

更多Python爬虫学习资料可以私信关键字【资料】领取

1.爬取详情页面基本信息

下面对详情页面进行DOM树节点分析,其基本信息位于…标签下,核心内容位于该节点下的子节点中,即…。使用如下代码获取内容:

2.爬取详情页面电影简介

3.爬取详情页面电影热门评论信息

热门评论信息位于…节点下,然后获取节点下的多个class属性为“comment-item”的div布局,如下图所示。在使用find()或find_all()函数进行爬取时,需要注意标签属性是class还是id,或是其它,必须与之对应一致,才能正确爬取。

更多Python爬虫学习资料可以私信关键字【资料】领取

完整代码如下:

其中爬取的《龙猫》电影信息输出如图16所示。

更多Python爬虫学习资料可以私信关键字【资料】领取

讲到这里,使用BeautifulSoup技术分析爬取豆瓣电影前250部电影信息的实例已经讲解完毕,但在实际爬取过程中可能由于某些页面不存在会导致爬虫停止,这时需要使用异常语句“try-except-finally”进行处理。

同时,爬取过程中需要结合自己所需数据进行定位节点,存储至本地文件中,也需要结合字符串处理过滤一些多余的空格或换行。

该系列所有代码下载地址:

https://github.com/eastmountyxz/Python-zero2one

————————————————

原文链接:https://blog.csdn.net/Eastmount/article/details/113830488

最新资讯


Copyright © 2010-2022