您现在的位置是:首页 > 技术教程 正文

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

admin 阅读: 2024-03-20
后台-插件-广告管理-内容页头部广告(手机)

英杰社区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。

  1. import requests
  2. from lxml import etree
  3. import csv

        如果出现模块报错

c124a1693bfc457ba1f2909ee9d299fc.png

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

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

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

  1. 清华大学
  2. https://pypi.tuna.tsinghua.edu.cn/simple
  3. 阿里云
  4. https://mirrors.aliyun.com/pypi/simple/
  5. 豆瓣
  6. https://pypi.douban.com/simple/
  7. 百度云
  8. https://mirror.baidu.com/pypi/simple/
  9. 中科大
  10. https://pypi.mirrors.ustc.edu.cn/simple/
  11. 华为云
  12. https://mirrors.huaweicloud.com/repository/pypi/simple/
  13. 腾讯云
  14. https://mirrors.cloud.tencent.com/pypi/simple/

    

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

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

  1. def getSource(url):
  2. # 反爬 填写headers请求头
  3. headers = {
  4. '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'
  5. }
  6. response = requests.get(url, headers=headers)
  7. # 防止出现乱码
  8. response.encoding = 'utf-8'
  9. # print(response.text)
  10. return response.text

        如何获取请求头:

        火狐浏览器:

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

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

cb3f2b1cef914937a402d034c348f8ef.png

 四、源代码:

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

0efdb231219647c6988e4032f0cb1c95.png

  1. from bs4 import BeautifulSoup
  2. import re #正则表达式,进行文字匹配
  3. import urllib.request,urllib.error #指定URL,获取网页数据
  4. import xlwt #进行excel操作
  5. def main():
  6. baseurl = "https://movie.douban.com/top250?start="
  7. datalist= getdata(baseurl)
  8. savepath = ".\\豆瓣电影top250.xls"
  9. savedata(datalist,savepath)
  10. #compile返回的是匹配到的模式对象
  11. findLink = re.compile(r'') # 正则表达式模式的匹配,影片详情
  12. findImgSrc = re.compile(r', re.S) # re.S让换行符包含在字符中,图片信息
  13. findTitle = re.compile(r'(.*)') # 影片片名
  14. findRating = re.compile(r'(.*)') # 找到评分
  15. findJudge = re.compile(r'(\d*)人评价') # 找到评价人数 #\d表示数字
  16. findInq = re.compile(r'(.*)') # 找到概况
  17. findBd = re.compile(r'

    (.*?)

    '
    , re.S) # 找到影片的相关内容,如导演,演员等
  18. ##获取网页数据
  19. def getdata(baseurl):
  20. datalist=[]
  21. for i in range(0,10):
  22. url = baseurl+str(i*25) ##豆瓣页面上一共有十页信息,一页爬取完成后继续下一页
  23. html = geturl(url)
  24. soup = BeautifulSoup(html,"html.parser") #构建了一个BeautifulSoup类型的对象soup,是解析html的
  25. for item in soup.find_all("div",class_='item'): ##find_all返回的是一个列表
  26. data=[] #保存HTML中一部电影的所有信息
  27. item = str(item) ##需要先转换为字符串findall才能进行搜索
  28. link = re.findall(findLink,item)[0] ##findall返回的是列表,索引只将值赋值
  29. data.append(link)
  30. imgSrc = re.findall(findImgSrc, item)[0]
  31. data.append(imgSrc)
  32. titles=re.findall(findTitle,item) ##有的影片只有一个中文名,有的有中文和英文
  33. if(len(titles)==2):
  34. onetitle = titles[0]
  35. data.append(onetitle)
  36. twotitle = titles[1].replace("/","")#去掉无关的符号
  37. data.append(twotitle)
  38. else:
  39. data.append(titles)
  40. data.append(" ") ##将下一个值空出来
  41. rating = re.findall(findRating, item)[0] # 添加评分
  42. data.append(rating)
  43. judgeNum = re.findall(findJudge, item)[0] # 添加评价人数
  44. data.append(judgeNum)
  45. inq = re.findall(findInq, item) # 添加概述
  46. if len(inq) != 0:
  47. inq = inq[0].replace("。", "")
  48. data.append(inq)
  49. else:
  50. data.append(" ")
  51. bd = re.findall(findBd, item)[0]
  52. bd = re.sub('(\s+)?', " ", bd)
  53. bd = re.sub('/', " ", bd)
  54. data.append(bd.strip()) # 去掉前后的空格
  55. datalist.append(data)
  56. return datalist
  57. ##保存数据
  58. def savedata(datalist,savepath):
  59. workbook = xlwt.Workbook(encoding="utf-8",style_compression=0) ##style_compression=0不压缩
  60. worksheet = workbook.add_sheet("豆瓣电影top250",cell_overwrite_ok=True) #cell_overwrite_ok=True再次写入数据覆盖
  61. column = ("电影详情链接", "图片链接", "影片中文名", "影片外国名", "评分", "评价数", "概况", "相关信息") ##execl项目栏
  62. for i in range(0,8):
  63. worksheet.write(0,i,column[i]) #将column[i]的内容保存在第0行,第i列
  64. for i in range(0,250):
  65. data = datalist[i]
  66. for j in range(0,8):
  67. worksheet.write(i+1,j,data[j])
  68. workbook.save(savepath)
  69. ##爬取网页
  70. def geturl(url):
  71. head = {
  72. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
  73. "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"
  74. }
  75. req = urllib.request.Request(url,headers=head)
  76. try: ##异常检测
  77. response = urllib.request.urlopen(req)
  78. html = response.read().decode("utf-8")
  79. except urllib.error.URLError as e:
  80. if hasattr(e,"code"): ##如果错误中有这个属性的话
  81. print(e.code)
  82. if hasattr(e,"reason"):
  83. print(e.reason)
  84. return html
  85. if __name__ == '__main__':
  86. main()
  87. print("爬取成功!!!")

五、详解代码

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

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

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

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

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

  1. ##compile返回的是匹配到的模式对象
  2. findLink = re.compile(r'') # 正则表达式模式的匹配,影片详情
  3. findImgSrc = re.compile(r', re.S) # re.S让换行符包含在字符中,图片信息
  4. findTitle = re.compile(r'(.*)') # 影片片名
  5. findRating = re.compile(r'(.*)') # 找到评分
  6. findJudge = re.compile(r'(\d*)人评价') # 找到评价人数 #\d表示数字
  7. findInq = re.compile(r'(.*)') # 找到概况
  8. findBd = re.compile(r'

    (.*?)

    '
    , re.S) # 找到影片的相关内容,如导演,演员等

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

  1. def getdata(baseurl):
  2. datalist = []
  3. for i in range(0, 10):
  4. url = baseurl + str(i * 25)
  5. html = geturl(url)
  6. soup = BeautifulSoup(html, "html.parser")
  7. for item in soup.find_all("div", class_='item'):
  8. data = []
  9. item = str(item)
  10. link = re.findall(findLink, item)[0]
  11. data.append(link)
  12. imgSrc = re.findall(findImgSrc, item)[0]
  13. data.append(imgSrc)
  14. titles = re.findall(findTitle, item)
  15. if (len(titles) == 2):
  16. onetitle = titles[0]
  17. data.append(onetitle)
  18. twotitle = titles[1].replace("/", "")
  19. data.append(twotitle)
  20. else:
  21. data.append(titles)
  22. data.append(" ")
  23. rating = re.findall(findRating, item)[0]
  24. data.append(rating)
  25. judgeNum = re.findall(findJudge, item)[0]
  26. data.append(judgeNum)
  27. inq = re.findall(findInq, item)
  28. if len(inq) != 0:
  29. inq = inq[0].replace("。", "")
  30. data.append(inq)
  31. else:
  32. data.append(" ")
  33. bd = re.findall(findBd, item)[0]
  34. bd = re.sub('(\s+)?', " ", bd)
  35. bd = re.sub('/', " ", bd)
  36. data.append(bd.strip())
  37. datalist.append(data)
  38. return datalist

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

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

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

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

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

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

六、效果展示

8dcde6b18ba14f429a8a1ad6e26fc47b.png

        559610420b9a403888c8154de5a73ab0.png

七、文末送书

        

参与活动

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

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

购买链接icon-default.png?t=N7T8https://product.dangdang.com/29643392.html

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

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

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

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

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

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

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索