Python爬虫——豆瓣电影TOP250榜单爬取,并使用网页解析方法及excel操作库将排名号、电影名,年份,国家,类型评分,一句话影评requests、BeautifulSoup、openpyxl

爬取豆瓣TOP250-避免反爬虫(2021-10-09) 前言 不适合没有爬虫基础的,自己写着玩玩,其中的IP地址,也是爬取下来的,实时在变 注意:没有对IP地址进行校验 爬取豆瓣电影,豆瓣电影现在都有反爬虫机制,我们采用2种方法: 不同浏览器标识:User_agent(模拟不同的浏览器) 不同的IP地址:proxies(防止IP地址被封) 爬取间隔2秒:防止网页扫描频繁操作 导入需要的库 import pandas as pd import requests from bs4 import BeautifulSoup import random import 阅读详情

豆瓣电影TOP 250榜单爬虫教程

在本教程中,我们将学习如何使用Python编写一个爬虫程序来爬取豆瓣电影TOP 250榜单的数据。我们将使用requests库来发送HTTP请求,BeautifulSoup库来解析HTML页面,以及openpyxl库来将爬取的数据保存到Excel文件中。

环境准备

确保你已经安装了以下Python库,如果没有安装,可以使用pip进行安装:

pip install requests beautifulsoup4 openpyxl

爬虫代码

import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
from openpyxl.drawing.image import Image as openpyxl_Image
from io import BytesIO

# 模拟浏览器的请求头部
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

# 创建工作簿和工作表
wb = Workbook()
ws = wb.active
ws.title = "Douban Top 250"

# 设置列宽
ws.column_dimensions['A'].width = 10
ws.column_dimensions['B'].width = 25
ws.column_dimensions['C'].width = 10
ws.column_dimensions['D'].width = 20
ws.column_dimensions['E'].width = 20
ws.column_dimensions['F'].width = 10
ws.column_dimensions['G'].width = 50
ws.column_dimensions['H'].width = 20  # 设置图片列的宽度

# 添加标题行
ws.append(["排名", "标题", "年份", "国家", "类型", "评分", "简介", "图片"])

# 豆瓣电影Top 250共有10页
for page_num in range(10):
    start = page_num * 25
    url = f"https://movie.douban.com/top250?start={start}&filter="
    response = requests.get(url, headers=headers)

    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        items = soup.find_all('div', class_='item')

        for index, item in enumerate(items):
            rank = index + 1 + start
            title = item.find('span', class_='title').get_text(strip=True)
            bd = item.find('div', class_='bd')
            if bd:
                # 使用XPath提取年份、国家和类型信息
                p_text = bd.find('p').text.strip()
                details = p_text.split('\n')[1]  # 获取第二行文本
                year_country_genre = details.split('/')
                year = year_country_genre[0].strip() if year_country_genre else "未知"
                country = year_country_genre[1].strip() if len(year_country_genre) > 1 else "未知"
                genre = year_country_genre[2].strip() if len(year_country_genre) > 2 else "未知"
            else:
                year = country = genre = "未知"

            rating = item.find('span', class_='rating_num')
            rating_text = rating.get_text(strip=True) if rating else "未知"

            quote = item.find('p', class_='quote')
            quote_text = quote.get_text(strip=True) if quote else "未知"

            img_tag = item.find('img')
            img_src = img_tag['src'] if img_tag and img_tag.has_attr('src') else ""
            if img_src.startswith('//'):
                img_src = 'https:' + img_src

            # 下载图片并转换为二进制数据
            img_data = requests.get(img_src).content
            img = openpyxl_Image(BytesIO(img_data))

            # 调整图片尺寸
            img.width = 100  # 设置图片宽度
            img.height = 150  # 设置图片高度

            # 将图片添加到Excel中
            ws.add_image(img, f'H{rank}')

            # 将数据写入Excel
            ws.append([rank, title, year, country, genre, rating_text, quote_text])

    else:
        print(f"请求第{page_num}页失败,状态码: {response.status_code}")
        break

# 保存Excel文件
wb.save("douban_top250.xlsx")

运行爬虫

将上述代码保存为.py文件,并在命令行运行。确保你的网络环境可以访问豆瓣,且豆瓣网站结构没有发生变化。

结果示例

在Python爬虫教程中,requests库是用于发送HTTP请求的关键库。以下是对代码中requests库部分的详细解析:

设置请求头部

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36'
}

这里创建了一个名为headers的字典,包含了一个HTTP请求头部字段User-Agent,它告诉服务器,我们的请求是从一个常见的Web浏览器发出的。模拟浏览器的User-Agent字符串可以防止网站识别出请求是由脚本发出的,有些网站会据此阻止非浏览器的访问。在此案例中如果我们不设置请求头部会出现请求失败

发送GET请求

response = requests.get(url, headers=headers)

使用requests.get方法发送一个GET请求到指定的url。headers参数传递了我们之前设置的请求头部,这有助于模拟一个真实的浏览器请求。requests.get方法返回一个Response对象,其中包含了服务器响应的所有信息。

检查请求是否成功

if response.status_code == 200:
    # 请求成功,继续处理
else:
    print(f"请求失败,状态码: {response.status_code}")

这里检查了Response对象的status_code属性,它是服务器响应的状态码。状态码200表示请求成功,我们将继续执行程序。任何其他状态码都表示有错误发生,这里我们只是打印出了错误的状态码。

    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        items = soup.find_all('div', class_='item')
    else:
        print(f"请求第{page_num}页失败,状态码: {response.status_code}")
        break

在Python爬虫教程中,BeautifulSoup和openpyxl库分别用于解析HTML内容和操作Excel文件。以下是对此案例代码中这两个库部分的解析:导入BeautifulSoup库

解析HTML内容

soup = BeautifulSoup(response.text, 'html.parser')

使用BeautifulSoup类创建了一个对象soup,它将response.text(即服务器响应的HTML内容)作为输入。第二个参数html.parser指定了解析器,告诉`BeautifulSoup使用Python标准库中的HTML解析器来解析文档。

### 查找bd标签

bd = soup.find('div', class_='bd')

`find`方法用于查找文档中的第一个匹配指定条件的元素。这里,它查找类名为`bd`的`<div>`标签。

 提取年份、国家和类型信息

p_text = bd.find('p').text.strip()
details = p_text.split('\n')[1]
year_country_genre = details.split('/')

这里,首先使用`find`方法找到`bd`标签内的`<p>`标签,并获取其文本内容。然后使用`strip`方法去除文本两端的空白符,接着按换行符`\n`分割文本,取第二行(索引为1)作为年份、国家和类型的信息。最后,使用`split('/')`方法按斜杠`/`分割这些信息。

导入openpyxl库

from openpyxl import Workbook

这行代码导入了`openpyxl`库的`Workbook`类。`openpyxl`是一个用于读写Excel 2010 xlsx/xlsm/xltx文件的库。

创建Excel工作簿

wb = Workbook()
ws = wb.active
ws.title = "Douban Top 250"

这里创建了一个新的Excel工作簿对象`wb`,并获取了活动工作表`ws`。然后,为工作表设置了标题。

添加标题行

ws.append(["排名", "电影名", "年份", "国家", "类型", "评分", "一句话影评", "链接"])

使用append方法向工作表中添加一行,作为标题行。

ws.append([index, title, year, country, genre, rating, quote, link])

对于每个电影条目,将提取的数据作为列表传递给`append`方法,添加到工作表中。

保存Excel文件

wb.save("douban_top250.xlsx")

注意事项

  1. 遵守爬虫协议:在爬取网站数据前,请确保遵守网站的robots.txt文件规定,不要对网站服务器造成过大压力。
  2. 合法性:确保爬取数据的合法性,不要用于商业用途或其他非法用途。
  3. 反爬措施:豆瓣等网站可能会有反爬措施,如遇到访问限制,应适当降低爬取频率或使用代理IP
标题
Pandas入门教程(二十二):股票数据分析实战——yfinance 获取数据、技术指标与收益率分析 把 Pandas 用在真实场景,才能体会它的价值。本文以茅台股票为例,用 yfinance 获取历史行情,完成缺失值处理与列筛选,绘制收盘价曲线,计算 SMA 移动平均线与 RSI 相对强弱指数,并通过日收益率、累计收益率和波动率完成完整的量化分析流程。 阅读详情

相关推荐

如何处理动态语言(Python / JS)的“隐形”调用链?

本文揭示动态语言(Python/JS)中静态AST解析导致调用链“断链”的核心问题,提出通过运行时追踪补全图谱的解决方案。基于Code-Graph-RAG的cgr trace机制,分别利用pytest插件与V8 Profiler捕获真实调用路径,将动态边合并至静态图谱,并在权重体系中提升动态边优先级。实践表明,该方法可显著提升图谱覆盖率,实现“结构+行为”双视角理解代码,为MCP与Rerank系统提供可靠支持。

xianyinsuifeng的博客 417

【python爬虫案例】利用python爬取豆瓣电影TOP250评分排行数据!

【python爬虫案例】利用python爬取豆瓣电影TOP250评分排行数据,并导出为excel文档

王哪跑的博客 1万+

Qt实战:用QTreeView+QStandardItemModel实现多级多列文件浏览器(附完整代码)

本文深入探讨了使用Qt的QTreeView与QStandardItemModel构建多级多列文件浏览器的完整实践。通过分析模型/视图框架的优势,详细演示了从基础框架搭建、模拟数据填充,到对接真实文件系统实现懒加载的全过程。文章还涵盖了自定义委托、多列排序、右键菜单等高级定制技巧,并提供了性能优化建议和完整的代码示例,帮助开发者打造功能强大且高效的工业级文件管理界面。

weixin_29021291的博客 424

打卡学习Python爬虫第三天|爬取豆瓣电影Top250排行榜(附源码)

注意正则表达式的使用,先观察网页源代码,我们发现每一部电影的数据存放在一个中,如上图。这时候我们发现没有了刚才的字母,但是出现了其它的内容,这时候我们需要在电影名的位置加上(),并在()中写?P,中给该位置的数据取一个名字,这就表示只要这个数据:如下第三个.*?这里获取:电影名,时间,国家,评分,评价人数,短评。二、查看数据是否存在于网页源代码中。

weixin_52687711的博客 920

SHAP图全解析:从理论到实践,教你如何读懂和优化模型特征

本文全面解析SHAP图,从博弈论基础到实战应用,指导读者如何解读和利用SHAP值优化机器学习模型。通过详解特征重要性条形图、小提琴图、依赖图及决策图等关键可视化工具,帮助数据科学家精准诊断模型、识别特征交互,并将洞见转化为特征工程与模型调试的实际行动,有效提升模型可解释性与性能。

svm4gardener的博客 189

[技术解析]4DGS:突破实时动态渲染的4D高斯溅射技术

本文深入解析了4DGS(4D Gaussian Splatting)技术,它通过引入时间维度,将静态的3D高斯溅射升级为动态的4D表示,实现了对复杂动态场景的高质量实时渲染。该技术利用时空联合编码器与高斯形变场网络,结合多分辨率编码与差分溅射渲染,在VR/AR、高帧率游戏等领域展现出突破性的应用潜力,兼顾了渲染速度与画面稳定性。

weixin_29218509的博客 413

豆瓣电影top250网页爬虫

首先打开想要爬取的网页,然后定义了存储数据的文件路径,如果这个网页不能爬取,要写一个反爬取的,通过设置请求头和合理的访问间隔来解决,在网络中找到’User-Agent’的请求头,就能破解较为简单的发爬虫机制了。然后导入相关的库,再创建了一个爬取网页数据的geturl函数,写入发爬取的请求头和使用requests库并设置合适的请求体向目标网页发送请求,在这个函数里写入错误处理的代码,如果请求过程中出现异常,会打印出错误信息并返回空值。

yuanmenglxb2004的博客 1340

用 Coze 打造纯自动化 AI 情报助手

本文将引导您逐步构建一个简易的AI情报助手,从提示词到工作流,再到卡片消息,详细讲解了如何利用Coze平台开发自动化工具。过程简单易懂,何不亲自动手一试?如果您对此类内容感兴趣,敬请关注本作者。未来,我将带来更多精彩的AI工具教程,助您迅速掌握各类AI应用。在这个AI时代,让您领先一步。t=O83A2AGI.NET AI 教程 震撼!用 Coze 打造纯自动化 AI 情报助手震撼!

xinzhaobuxuan的博客 2531

python爬虫、反爬虫的一些概念以及爬取豆瓣TOP250页面

目录爬虫、反爬虫的一些概念 这张思维导图就是篇博客要讲的所有东西了 爬虫、反爬虫的一些概念 Robots协议 既然我们要学爬虫,那么首先就需要先了解robot协议是什么? robots协议也叫robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的...

阳某的博客 2503

发那科机器人弧焊指令实战:从Search指令到组掩码设置的完整避坑指南

本文详细解析了发那科机器人弧焊指令系统的实战应用,从Search指令的正确使用到组掩码设置的避坑技巧。通过实际案例和参数优化建议,帮助工程师提升焊接质量和生产效率,避免常见错误操作。特别针对T2模式示教难题和外部轴协调运动提供了专业解决方案。

weixin_29040367的博客 185

手把手教你学PCIE(5.1)--pcie固件初始化的硬件初始化

PCIe 固件初始化的硬件初始化是一个复杂但至关重要的过程。通过正确配置 PCIe 控制器和相关硬件,可以确保系统的稳定性和性能。以上步骤和示例代码提供了一个基本的框架,实际开发中可能需要根据具体的硬件和需求进行调整和优化。

MHD0815的博客 1689

爬取豆瓣电影TOP250(增加反爬方法)

爬取豆瓣电影TOP250 网上找的爬虫例子练手,这好像是最简单的写法,不知道是不是年代有点点久远,例子无法正常运行,后来查才知道是豆瓣加了反爬机制。 所以我就在原基础上加了反爬方法,做了一点点小改动。因为新接触Python,所以写法可能不是很好哈哈哈哈哈哈哈哈哈哈哈 # 爬取豆瓣电影Top250 import os import re import time import request...

qq_40905132的博客 4492

2026 拉勾网:JA4+指纹绕过 + sign逆向 + 动态城市参数,月采集10万+数据实战

2026年拉勾网反爬技术全面升级,采用JA4+ TLS指纹识别、动态sign签名等多维度防护体系。本文提供工业级爬虫解决方案,通过curl_cffi模拟浏览器指纹、逆向sign加密算法、动态生成城市参数三大核心技术,实现高效稳定的数据采集。系统采用分层架构设计,包含任务调度、签名生成、多线程引擎等模块,单月可获取10万+条招聘数据。重点解析了JA4+指纹识别原理、传统方法的局限性,以及通过HMAC-SHA256算法逆向sign参数的完整过程。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2395

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 423

9.6华为OD机试真题 新系统【仓储货物有序出库】

华为OD机试真题 新系统【仓储货物有序出库】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【仓储货物有序出库】多语言题解。

qq_45776114的博客 890

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 239

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【每天一个 Python 小案例30】Python 基础知识综合小项目:我的工具盒

作为系列收官,本篇把前 29 篇的知识点合成一个能直接用的命令行工具"我的工具盒":计算器(用 ast 解析表达式,不碰 eval)、单位换算与温度转换(一张换算表 + 特例分支)、记账与分类统计(Decimal + JSON 持久化)、以及用"字典当命令表"把菜单和业务逻辑解耦的主循环。文中对比了 eval 的安全隐患与 ast 白名单的做法,解释了 lambda 闭包在字典里的写法与晚绑定陷阱,并在最后给出整个系列的知识地图,把变量、数据结构、控制流、函数、类、异常、文件、标准库八块内容对应到具体篇目。

xinjiyaya的博客 427

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

10分钟完成第一个Python小游戏

第一个项目不用找复杂的,‌直接选「猜数字小游戏」对应的教程‌就好——几乎所有入门教程都会讲这个项目,资料最多、遇到问题随便搜就能找到解决方法,不会卡壳,30分钟肯定能做完,非常容易建立信心。‌教程链接‌:直接搜标题👉 ‌《Python零基础入门项目:30分钟写完猜数字游戏》‌(优先选黑马程序员、鱼C-小甲鱼这两个UP主的版本,播放量都是百万级,口碑稳定)‌教程地址‌:打开菜鸟教程官网→找到「Python 实例」板块,直接在线写代码运行。全程不跳步,30分钟就能做完,做完能直接运行玩,成就感拉满。

mF44Job8l的博客 66

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 269

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 165

我用 200 行代码写了个“代码屎山检测器“,扫完公司的老项目后我沉默了

这个工具不能帮你把屎山铲平,但至少能让你知道自己面对的是多大的山,也能在代码评审时用数据说话——“这个 PR 把圈复杂度从 12 推到了 18,能不能拆一下?毕竟,不能量化的东西,就没法改进。

xixiaoyunya的博客 251

魔塔社区微调训练Qwen2-1.5B-Instruct模型并烧录到‌RK3568开发板教程

本文基于Ubuntu 22.04 + CUDA 13.0.3环境,使用LLaMA-Factory框架对Qwen2-1.5B-Instruct模型进行LoRA微调,训练儿童故事生成专用模型。通过配置qwen模板、制作alpaca格式数据集、执行sft训练并合并LoRA权重,最终将模型转换为GGUF格式,并量化为Q4_K_M以适配RK3568嵌入式平台。全程支持国产镜像加速下载与显存优化,实现高效轻量化部署。

浅清秋慕夏的博客 188

【回眸】DeepSeek V4.1 Flash 快速上手与实战

本文介绍如何高效本地部署开源大模型,通过现代化工具链实现分钟级环境搭建。聚焦显存优化、一键安装、代码调用与多轮对话实现,解决“显存不足”“连接超时”等痛点,提供参数调优与结构化输出技巧,助力开发者在离线场景下快速构建稳定、高效的本地推理系统。

啤酒鸭的物联网开发记录博客 228

智叟云集-手机证据抓取系统的工程结构与应用入口

本文系统阐述手机证据抓取系统的工程结构与应用入口,涵盖四大层面:工程目录划分(Android、Python服务、Web页面、测试与构建工具);Android组件通过Manifest声明可启动页面,主界面由MainActivity管理;Python服务通过run.py解析参数并启动FastAPI应用,支持远程访问;浏览器页面采用HTML/CSS/JS分离架构,静态资源通过路径关联,实现动态交互。各模块分工明确,协同构建可运行的采集系统。

2301_77178996的博客 237

Java Arrays.asList 常见坑详解|UnsupportedOperationException、数组联动、基本类型 bug

解析 Arrays.asList 常见开发陷阱,演示 UnsupportedOperationException、底层数组引用共享、基本类型数组问题,区分 Arrays 内部 ArrayList 与 java.util.ArrayList,给出数组转 List 的各种场景正确代码。

weixin_42617033的博客 491

利用python中matplotlib.pyplot库绘制图

plt.plot(x,y) # x,y是每个点的坐标,plot()把每个点按顺序画折线。plt.subplots(2,2)表示绘制2*2的子图布局,axs[0,0]表示在第0行第0列绘制子图...coordinates_i[:,0]表示获取每一行(每一个spot)的第0列(x坐标)coordinates_i[:,1]表示获取每一行(每一个spot)的第0列(y坐标)plot.subplot(2,2,1) 表示子图布局是2*2的,开始绘制第一个。也可以导入数据绘制。可以设置color属性,设置颜色。

qq_46147236的博客 102
上一篇: RedHat解决yum
下一篇: Python爬虫——城市数据分析与市场潜能计算(Pandas库)
干中学26
博客等级 码龄4年 518粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值