当前位置: 首页 > news >正文

爬虫经典案例之爬取豆瓣电影Top250(方法一)

简介:主要使用bs4、request、pandas等模块,实现数据的爬取和存储。
目前存在一点小问题,就是个别电影的导演、演员、上映年份和地区等信息与大部分电影的这些信息的格式有细微差别,导致正则表达式无法正常匹配到个别电影的信息,出现复用前一部电影的信息的情况。

from bs4 import BeautifulSoup
import requests, time, re
from random import randint
import pandas as pdurl_list = ['https://movie.douban.com/top250']
base_url = 'https://movie.douban.com/top250?start={start}'
for start in range(25, 251, 25):url_list.append(base_url.format(start=start))headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'}
movie_info = []
details = []for url in url_list:time.sleep(randint(1, 3))response = requests.get(url, headers=headers)soup = BeautifulSoup(response.text, 'html.parser')movie_items = soup.find_all('div', class_='item')for movie in movie_items:# 获取排名rank = movie.find('em').text.strip()# 获取电影标题title = movie.find('span', class_='title').text.strip()# 获取电影导演、演员、年份、上映地区等信息info = movie.find('div', class_='bd').find('p').text.strip()# 由于info这条数据包含了很多信息,需要使用正则拆分开#print(info)pattern = re.compile(r"导演: (.*?)\s+主演: (.*?)\s+(\d{4})\s+/\s+(.*?)\s+/\s+(.*)")match = re.search(pattern, info)if match:director = match.group(1).strip()actors = match.group(2).strip()year = match.group(3).strip()countries = match.group(4).strip().split(' ')genres = match.group(5).strip().split(' ')# 获取评分信息rating_num = movie.find('span', class_='rating_num').text.strip()# 获取评价人数信息rate_people_num = movie.find('div', class_='star').find_all('span')[3].text.strip()# 将信息进行汇总mock_data = {'排名': rank, '电影名称': title, '导演': director, '演员': actors, '上映年份': year, '上映地区': countries, '电影类型': genres,'评分': rating_num,'投票人数': rate_people_num}print(mock_data)movie_info.append(mock_data)df = pd.DataFrame(movie_info,columns=['排名', '电影名称', '导演', '演员', '上映年份', '上映地区', '电影类型', '评分', '投票人数'])
excel_path = 'movie_info.xlsx'
df.to_excel(excel_path, index=False)

相关文章:

  • 学习前台开发主要掌握的技能
  • SpringCloud和K8s的区别
  • python从入门到精通4:变量赋值
  • Linux开发讲课7---Linux sysfs文件系统
  • 【设计模式之迭代器模式 -- C++】
  • web安全渗透测试十大常规项(一):web渗透测试之PHP反序列化
  • CentOS 7 内核 3.10 升级 6.5.2 (RPM 直装 + 源码编译)
  • 新建一个 React TypeScript 项目,并使用 Webpack 进行构建和打包
  • Java程序之让气球上升
  • 介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用
  • git配置ssh key
  • tensorRT C++使用pt转engine模型进行推理
  • express+vue 在线五子棋(一)
  • 使用Vue开发页面(前置知识)
  • npm全局安装依赖指定存放文件目录
  • 2017前端实习生面试总结
  • conda常用的命令
  • crontab执行失败的多种原因
  • express + mock 让前后台并行开发
  • HomeBrew常规使用教程
  • input实现文字超出省略号功能
  • Java多线程(4):使用线程池执行定时任务
  • Laravel Mix运行时关于es2015报错解决方案
  • mysql常用命令汇总
  • node.js
  • v-if和v-for连用出现的问题
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 复杂数据处理
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 三栏布局总结
  • 微信小程序实战练习(仿五洲到家微信版)
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​flutter 代码混淆
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (7)STL算法之交换赋值
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (动态规划)5. 最长回文子串 java解决
  • (二)springcloud实战之config配置中心
  • (附源码)php新闻发布平台 毕业设计 141646
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (学习总结)STM32CubeMX HAL库 学习笔记撰写心得
  • (一一四)第九章编程练习
  • (原創) 物件導向與老子思想 (OO)
  • (转)Linq学习笔记
  • (转)linux下的时间函数使用
  • .NET Core中的去虚
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .Net Web窗口页属性
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net经典笔试题
  • .Net面试题4
  • .net专家(高海东的专栏)