【python】爬取豆瓣电影排行榜Top250存储到Excel文件中【附源码】

2024-01-09 20:36

本文主要是介绍【python】爬取豆瓣电影排行榜Top250存储到Excel文件中【附源码】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

英杰社区icon-default.png?t=N7T8https://bbs.csdn.net/topics/617804998

一、背景     

   近年来,Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程

序,用于抓取豆瓣电影Top250的相关信息,并将其保存为Excel文件。

        程序包含以下几个部分:

           导入模块:程序导入了 BeautifulSoup、re、urllib.request、urllib.error、xlwt等模块。

        定义函数:

  • geturl(url):接收一个URL参数,返回该URL页面内容。
  • getdata(baseurl):接收一个基础URL参数,遍历每一页的URL,获取电影信息数据,以列表形式返回。
  • savedata(datalist,savepath):接收电影信息数据和保存路径参数,将数据保存到Excel文件中。

二、导入必要的模块:

       代码首先导入了需要使用的模块:requests、lxml和csv。

import requests
from lxml import etree
import csv

        如果出现模块报错

c124a1693bfc457ba1f2909ee9d299fc.png

        进入控制台输入:建议使用国内镜像源

pip install 模块名称 -i https://mirrors.aliyun.com/pypi/simple

         我大致罗列了以下几种国内镜像源:

清华大学
https://pypi.tuna.tsinghua.edu.cn/simple阿里云
https://mirrors.aliyun.com/pypi/simple/豆瓣
https://pypi.douban.com/simple/ 百度云
https://mirror.baidu.com/pypi/simple/中科大
https://pypi.mirrors.ustc.edu.cn/simple/华为云
https://mirrors.huaweicloud.com/repository/pypi/simple/腾讯云
https://mirrors.cloud.tencent.com/pypi/simple/

    

 三、定义了函数来解析每个电影的信息:

        设置了请求头部信息,以模拟浏览器的请求,函数返回响应数据的JSON格式内容。

def getSource(url):# 反爬 填写headers请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}response = requests.get(url, headers=headers)# 防止出现乱码response.encoding = 'utf-8'# print(response.text)return response.text

        如何获取请求头:

        火狐浏览器:

  1. 打开目标网页并右键点击页面空白处。
  2. 选择“检查元素”选项,或按下快捷键Ctrl + Shift + C(Windows)
  3. 在开发者工具窗口中,切换到“网络”选项卡。
  4. 刷新页面以捕获所有的网络请求。
  5. 在请求列表中选择您感兴趣的请求。
  6. 在右侧的“请求标头”或“Request Headers”部分,即可找到请求头信息。

     将以下请求头信息复制出来即可

cb3f2b1cef914937a402d034c348f8ef.png

 四、源代码:

        该爬虫程序使用了Python的第三方库BeautifulSoup和正则表达式模块,通过解析HTML页面并进行匹配,提取了电影详情链接、图片链接、影片中文名、影片外国名、评分、评价数、概述以及相关信息等数据,最后将这些数据保存到Excel文件中。

0efdb231219647c6988e4032f0cb1c95.png

from bs4 import BeautifulSoup
import  re  #正则表达式,进行文字匹配
import urllib.request,urllib.error #指定URL,获取网页数据
import xlwt  #进行excel操作def main():baseurl = "https://movie.douban.com/top250?start="datalist= getdata(baseurl)savepath = ".\\豆瓣电影top250.xls"savedata(datalist,savepath)#compile返回的是匹配到的模式对象
findLink = re.compile(r'<a href="(.*?)">')  # 正则表达式模式的匹配,影片详情
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)  # re.S让换行符包含在字符中,图片信息
findTitle = re.compile(r'<span class="title">(.*)</span>')  # 影片片名
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')  # 找到评分
findJudge = re.compile(r'<span>(\d*)人评价</span>')  # 找到评价人数 #\d表示数字
findInq = re.compile(r'<span class="inq">(.*)</span>')  # 找到概况
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)  # 找到影片的相关内容,如导演,演员等##获取网页数据
def  getdata(baseurl):datalist=[]for i in range(0,10):url = baseurl+str(i*25)     ##豆瓣页面上一共有十页信息,一页爬取完成后继续下一页html = geturl(url)soup = BeautifulSoup(html,"html.parser") #构建了一个BeautifulSoup类型的对象soup,是解析html的for item in soup.find_all("div",class_='item'): ##find_all返回的是一个列表data=[]  #保存HTML中一部电影的所有信息item = str(item) ##需要先转换为字符串findall才能进行搜索link = re.findall(findLink,item)[0]  ##findall返回的是列表,索引只将值赋值data.append(link)imgSrc = re.findall(findImgSrc, item)[0]data.append(imgSrc)titles=re.findall(findTitle,item)  ##有的影片只有一个中文名,有的有中文和英文if(len(titles)==2):onetitle = titles[0]data.append(onetitle)twotitle = titles[1].replace("/","")#去掉无关的符号data.append(twotitle)else:data.append(titles)data.append(" ")  ##将下一个值空出来rating = re.findall(findRating, item)[0]  # 添加评分data.append(rating)judgeNum = re.findall(findJudge, item)[0]  # 添加评价人数data.append(judgeNum)inq = re.findall(findInq, item)  # 添加概述if len(inq) != 0:inq = inq[0].replace("。", "")data.append(inq)else:data.append(" ")bd = re.findall(findBd, item)[0]bd = re.sub('<br(\s+)?/>(\s+)?', " ", bd)bd = re.sub('/', " ", bd)data.append(bd.strip())  # 去掉前后的空格datalist.append(data)return  datalist##保存数据
def  savedata(datalist,savepath):workbook = xlwt.Workbook(encoding="utf-8",style_compression=0) ##style_compression=0不压缩worksheet = workbook.add_sheet("豆瓣电影top250",cell_overwrite_ok=True) #cell_overwrite_ok=True再次写入数据覆盖column = ("电影详情链接", "图片链接", "影片中文名", "影片外国名", "评分", "评价数", "概况", "相关信息")  ##execl项目栏for i in range(0,8):worksheet.write(0,i,column[i]) #将column[i]的内容保存在第0行,第i列for i in range(0,250):data = datalist[i]for j in range(0,8):worksheet.write(i+1,j,data[j])workbook.save(savepath)##爬取网页
def geturl(url):head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ""AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"}req = urllib.request.Request(url,headers=head)try:   ##异常检测response = urllib.request.urlopen(req)html = response.read().decode("utf-8")except urllib.error.URLError as e:if hasattr(e,"code"):    ##如果错误中有这个属性的话print(e.code)if hasattr(e,"reason"):print(e.reason)return htmlif __name__ == '__main__':main()print("爬取成功!!!")

五、详解代码

        导入所需模块,包括`BeautifulSoup`、`re`、`urllib`和`xlwt`。

from bs4 import BeautifulSoup
import  re  # 正则表达式,进行文字匹配
import urllib.request,urllib.error  # 指定URL,获取网页数据
import xlwt  # 进行excel操作

        主函数,主要包含三个步骤:获取数据、保存数据和打印成功信息。

def main():baseurl = "https://movie.douban.com/top250?start="datalist = getdata(baseurl)savepath = ".\\豆瓣电影top250.xls"savedata(datalist, savepath)

        这里使用正则表达式对html页面进行匹配,获取需要的信息,返回的是匹配到的模式对象。 


##compile返回的是匹配到的模式对象
findLink = re.compile(r'<a href="(.*?)">')  # 正则表达式模式的匹配,影片详情
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)  # re.S让换行符包含在字符中,图片信息
findTitle = re.compile(r'<span class="title">(.*)</span>')  # 影片片名
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')  # 找到评分
findJudge = re.compile(r'<span>(\d*)人评价</span>')  # 找到评价人数 #\d表示数字
findInq = re.compile(r'<span class="inq">(.*)</span>')  # 找到概况
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)  # 找到影片的相关内容,如导演,演员等

获取网页数据的函数,包括以下步骤:
1. 循环10次,依次爬取不同页面的信息;
2. 使用`urllib`获取html页面;
3. 使用`BeautifulSoup`解析页面;
4. 遍历每个div标签,即每一部电影;
5. 对每个电影信息进行匹配,使用正则表达式提取需要的信息并保存到一个列表中;
6. 将每个电影信息的列表保存到总列表中。

def getdata(baseurl):datalist = []for i in range(0, 10):url = baseurl + str(i * 25)  html = geturl(url)soup = BeautifulSoup(html, "html.parser")  for item in soup.find_all("div", class_='item'):  data = []  item = str(item) link = re.findall(findLink, item)[0]  data.append(link)imgSrc = re.findall(findImgSrc, item)[0]data.append(imgSrc)titles = re.findall(findTitle, item) if (len(titles) == 2):onetitle = titles[0]data.append(onetitle)twotitle = titles[1].replace("/", "") data.append(twotitle)else:data.append(titles)data.append(" ") rating = re.findall(findRating, item)[0] data.append(rating)judgeNum = re.findall(findJudge, item)[0]  data.append(judgeNum)inq = re.findall(findInq, item) if len(inq) != 0:inq = inq[0].replace("。", "")data.append(inq)else:data.append(" ")bd = re.findall(findBd, item)[0]bd = re.sub('<br(\s+)?/>(\s+)?', " ", bd)bd = re.sub('/', " ", bd)data.append(bd.strip()) datalist.append(data)return datalist

将获取到的数据保存到excel文件中,包括以下步骤:
1. 创建一个excel文件;
2. 在文件中创建一个工作表;
3. 写入execl项目栏,即第一行的标题;
4. 循环保存每一部电影的信息。

def savedata(datalist, savepath):workbook = xlwt.Workbook(encoding="utf-8", style_compression=0)  ##style_compression=0不压缩worksheet = workbook.add_sheet("豆瓣电影top250", cell_overwrite_ok=True)  # cell_overwrite_ok=True再次写入数据覆盖column = ("电影详情链接", "图片链接", "影片中文名", "影片外国名", "评分", "评价数", "概况", "相关信息")  ##execl项目栏for i in range(0, 8):worksheet.write(0, i, column[i])  # 将column[i]的内容保存在第0行,第i列for i in range(0, 250):data = datalist[i]for j in range(0, 8):worksheet.write(i + 1, j, data[j])workbook.save(savepath)

        使用`urllib`获取网页数据的函数。

def geturl(url):head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ""AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"}req = urllib.request.Request(url, headers=head)try:  ##异常检测response = urllib.request.urlopen(req)html = response.read().decode("utf-8")except urllib.error.URLError as e:if hasattr(e, "code"):  ##如果错误中有这个属性的话print(e.code)if hasattr(e, "reason"):print(e.reason)return html

        程序入口,执行主函数,并打印成功信息。 

if __name__ == '__main__':main()print("爬取成功!!!")

六、效果展示

8dcde6b18ba14f429a8a1ad6e26fc47b.png

        559610420b9a403888c8154de5a73ab0.png

七、文末送书

        

参与活动

1️⃣参与方式:关注、点赞、收藏,评论(人生苦短,我一天我也懒得卷)
2️⃣获奖方式:程序随机抽取 3位,每位小伙伴将获得一本书
3️⃣活动时间:截止到 2024-1-10 22:00:00

注:活动结束后会在我的主页动态如期公布中奖者,包邮到家。

​编辑

        这本书是美国人工智能领域的权威经典教材,受到广大师生的广泛好评。中文版更是被近百所高校采用,作为专业教科书使用

        本书第 2 版出版于 2018 年,恰恰在过去的5年中,人工智能技术有了突破性的进展,大模型即是其中的代表。第3版在第 2 版的基础上进行了内容调整和升级,以跟上技术发展的步伐。新增了深度学习、人工智能安全和人工智能编程等新进展、新成果。

        全书内容包括人工智能的历史、思维和智能之辩、图灵测试、搜索、博弈、知识表示、产生式系统、专家系统、机器学习、深度学习、自然语言处理(NLP)、自动规划、遗传算法、模糊控制、安全等。此外,它还介绍了一些新技术和应用,如机器人、高级计算机博弈等。

        这本书是美国人工智能领域的权威经典教材,受到广大师生的广泛好评。中文版更是被近百所高校采用,作为专业教科书使用

        本书第 2 版出版于 2018 年,恰恰在过去的5年中,人工智能技术有了突破性的进展,大模型即是其中的代表。第3版在第 2 版的基础上进行了内容调整和升级,以跟上技术发展的步伐。新增了深度学习、人工智能安全和人工智能编程等新进展、新成果。

        全书内容包括人工智能的历史、思维和智能之辩、图灵测试、搜索、博弈、知识表示、产生式系统、专家系统、机器学习、深度学习、自然语言处理(NLP)、自动规划、遗传算法、模糊控制、安全等。此外,它还介绍了一些新技术和应用,如机器人、高级计算机博弈等。

这篇关于【python】爬取豆瓣电影排行榜Top250存储到Excel文件中【附源码】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该