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

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

在上一篇文章的基础上,改进了代码质量,增加了多个正则表达式匹配,但同事也增加了程序执行的耗时。

from bs4 import BeautifulSoup
import requests
import time
import 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 = []def parse_info(info):# 尝试第一个正则表达式pattern1 = re.compile(r"导演: (.*?)\s*/?\s*主演: (.*?)\s*(\d{4})\s*/\s*(.*?)\s*/\s*(.*)")match1 = re.search(pattern1, info)if match1:director = match1.group(1).strip()actors = match1.group(2).strip()year = match1.group(3).strip()countries = match1.group(4).strip().split(' ')genres = match1.group(5).strip().split(' ')return director, actors, year, countries, genres# 尝试第二个正则表达式pattern2 = re.compile(r"导演: (.*?)\s*/?\s*(\d{4})\s*/\s*(.*?)\s*/\s*(.*)")match2 = re.search(pattern2, info)if match2:director = match2.group(1).strip()actors = ""year = match2.group(2).strip()countries = match2.group(3).strip().split(' ')genres = match2.group(4).strip().split(' ')return director, actors, year, countries, genres# 尝试第三个正则表达式pattern3 = re.compile(r"导演: (.*?)\s*(\d{4})\s*/\s*(.*?)\s*/\s*(.*)")match3 = re.search(pattern3, info)if match3:director = match3.group(1).strip()actors = ""year = match3.group(2).strip()countries = match3.group(3).strip().split(' ')genres = match3.group(4).strip().split(' ')return director, actors, year, countries, genres# 尝试第四个正则表达式 (处理有多个年份的情况)pattern4 = re.compile(r"导演: (.*?)\s*主演: (.*?)\s*(.*?)\s*/\s*(.*?)\s*/\s*(.*)")match4 = re.search(pattern4, info)if match4:director = match4.group(1).strip()actors = match4.group(2).strip()year = match4.group(3).strip()countries = match4.group(4).strip().split(' ')genres = match4.group(5).strip().split(' ')return director, actors, year, countries, genres# 如果没有匹配,返回空值return "", "", "", [], []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 字符串director, actors, year, countries, genres = parse_info(info)# 打印未匹配到的 infoif director == "" and actors == "" and year == "":print(f"未匹配到的info: {info}")# 获取评分信息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}movie_info.append(mock_data)df = pd.DataFrame(movie_info,columns=['排名', '电影名称', '导演', '演员', '上映年份', '上映地区', '电影类型', '评分', '投票人数'])
excel_path = 'movie_info.xlsx'
df.to_excel(excel_path, index=False)
http://www.lryc.cn/news/379055.html

相关文章:

  • 如何优化React应用的性能?
  • css文字镂空加描边
  • python数据分析与可视化
  • webkit 的介绍
  • make与makefile
  • 深度神经网络一
  • Pnpm:包管理的新星,如何颠覆 Npm 和 Yarn
  • 汽车IVI中控开发入门及进阶(三十二):i.MX linux开发之Yocto
  • tessy 编译报错:单元测试时,普通桩函数内容相关异常场景
  • 计算机专业是否仍是“万金油”
  • 雷池社区版自动SSL
  • 怎样减少徐州服务器租用的成本?
  • 【性能优化】表分桶实践最佳案例
  • 数据仓库的挑战
  • 基于ResNet-18的简单分类(新手,而且网络效果不咋滴,就是学个流程)
  • 自动化测试:Autorunner的使用
  • 时序预测 | Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测
  • 软考 系统架构设计师系列知识点之杂项集萃(42)
  • FastBoot刷机获取root权限(Magisk)
  • 信息检索(43):SPLADE: Sparse Lexical and Expansion Model for First Stage Ranking
  • DockerHub 镜像加速
  • Oracle 迁移 Mysql
  • vue3父子组件通信
  • CSS中使用应用在伪元素中的计数器属性counter-increment
  • 【SkiaSharp绘图08】SKPaint方法:自动换行、是否乱码、字符偏移、边界、截距、文本轮廓、测量文本
  • 深入理解Servlet Filter及其限流实践
  • 使用cv2对视频指定区域进行去噪
  • AI在创造还是毁掉音乐?
  • 【2023年全国青少年信息素养大赛智能算法挑战赛复赛真题卷】
  • Android系统揭秘(一)-Activity启动流程(上)