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

别再用requests了!用Python 3.11+的httpx和BeautifulSoup4爬取豆瓣电影Top250(附完整代码)

用Python 3.11的httpx和BeautifulSoup4高效爬取豆瓣电影Top250在Python爬虫领域技术栈的迭代速度令人目不暇接。十年前流行的urllib2如今已被更现代、更高效的库所取代。本文将带你使用Python 3.11的最新特性结合httpx和BeautifulSoup4这两个强力工具打造一个高效、稳定的豆瓣电影Top250爬虫。1. 为什么选择httpx和BeautifulSoup4组合1.1 httpx vs requests现代HTTP客户端的优势httpx是Python生态中新兴的HTTP客户端库相比传统的requests它带来了几项关键改进原生支持HTTP/2显著提升连接效率特别是在需要大量请求的场景下完整的异步支持与asyncio无缝集成轻松实现高性能并发爬取更智能的连接池自动管理连接复用减少TCP握手开销更严格的类型提示充分利用Python 3.11的类型系统提高代码健壮性import httpx # 同步请求示例 with httpx.Client() as client: response client.get(https://movie.douban.com/top250) # 异步请求示例 async with httpx.AsyncClient() as client: response await client.get(https://movie.douban.com/top250)1.2 BeautifulSoup4的最新解析器选择BeautifulSoup4作为HTML解析的标杆库其性能很大程度上取决于底层解析器。2023年推荐使用以下组合解析器速度内存占用容错性适用场景lxml★★★★★★★★★★★大多数情况首选html.parser★★★★★★★★无外部依赖时使用html5lib★★★★★★★处理极不规范的HTMLfrom bs4 import BeautifulSoup # 推荐使用lxml作为解析器 soup BeautifulSoup(html_content, lxml)2. 豆瓣电影Top250页面结构分析2.1 URL规律与分页处理豆瓣电影Top250采用经典的分页模式每页显示25部电影。通过分析我们发现URL模式非常规律https://movie.douban.com/top250?start{offset}filter其中offset参数遵循以下规律第1页start0显示1-25名第2页start25显示26-50名...第10页start225显示226-250名我们可以利用Python 3.11的math.ceil和生成器表达式高效生成所有页面URLimport math total_movies 250 movies_per_page 25 total_pages math.ceil(total_movies / movies_per_page) urls [ fhttps://movie.douban.com/top250?start{page * movies_per_page}filter for page in range(total_pages) ]2.2 关键数据定位与提取豆瓣页面的电影信息主要包含在div classitem元素中。每个电影条目包含电影名称中英文评分评价人数经典台词可能没有导演和主演信息上映年份和国家电影类型使用BeautifulSoup4提取这些信息的核心思路items soup.select(div.item) for item in items: title item.select_one(span.title).text rating item.select_one(span.rating_num).text # 其他字段类似处理3. 完整爬虫实现与反爬策略3.1 基础爬虫框架搭建我们构建一个面向对象的爬虫框架便于扩展和维护class DoubanTop250Spider: BASE_URL https://movie.douban.com/top250 HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)..., Accept-Language: zh-CN,zh;q0.9, } def __init__(self): self.client httpx.Client(headersself.HEADERS, timeout10.0) def fetch_page(self, page: int) - str: params {start: (page - 1) * 25, filter: } response self.client.get(self.BASE_URL, paramsparams) response.raise_for_status() return response.text def parse_page(self, html: str) - list[dict]: # 解析逻辑实现 pass def run(self): for page in range(1, 11): html self.fetch_page(page) yield from self.parse_page(html)3.2 应对反爬机制的关键技巧豆瓣对爬虫有一定防护以下是几个实用对策请求头伪装设置合理的User-Agent添加Referer和Accept-Language头请求频率控制import random import time # 在请求间添加随机延迟 time.sleep(random.uniform(1.0, 3.0))IP轮换策略使用httpx的代理支持考虑付费代理服务如需要大规模爬取Cookie处理self.client httpx.Client( headersself.HEADERS, cookies{key: value}, # 从浏览器获取有效cookie follow_redirectsTrue )4. 数据清洗与存储方案4.1 数据清洗与规范化从网页抓取的数据通常需要清洗去除空白字符clean_text .join(text.split()) # 合并多个空白字符处理中英文标题def process_title(title_element): chinese title_element.text english title_element.find_next_sibling(span, class_other) return { chinese: chinese, english: english.text.strip() if english else None }评分数据转换rating float(rating_str) if rating_str else None4.2 存储方案比较与实现根据需求不同可以选择多种存储方式方案一CSV文件存储import csv def save_to_csv(movies: list[dict], filename: str): with open(filename, w, newline, encodingutf-8) as f: writer csv.DictWriter(f, fieldnamesmovies[0].keys()) writer.writeheader() writer.writerows(movies)方案二SQLite数据库存储import sqlite3 def init_db(filename: str): conn sqlite3.connect(filename) conn.execute( CREATE TABLE IF NOT EXISTS movies ( id INTEGER PRIMARY KEY, chinese_title TEXT NOT NULL, english_title TEXT, rating REAL, votes INTEGER, year INTEGER, directors TEXT, actors TEXT ) ) return conn方案三JSON格式存储import json def save_to_json(movies: list[dict], filename: str): with open(filename, w, encodingutf-8) as f: json.dump(movies, f, ensure_asciiFalse, indent2)5. 性能优化与高级技巧5.1 异步并发爬取实现利用httpx的异步特性大幅提升爬取速度async def fetch_all_pages(): async with httpx.AsyncClient(headersHEADERS) as client: tasks [fetch_page(client, page) for page in range(1, 11)] return await asyncio.gather(*tasks) async def fetch_page(client: httpx.AsyncClient, page: int): params {start: (page - 1) * 25, filter: } response await client.get(BASE_URL, paramsparams) response.raise_for_status() return response.text5.2 利用Python 3.11新特性优化代码模式匹配Pattern Matchingmatch movie.get(rating): case float(r) if r 9.0: print(经典电影) case float(r) if r 8.0: print(推荐观看) case _: print(一般电影)TOML配置支持import tomllib with open(config.toml, rb) as f: config tomllib.load(f)更快的错误处理try: response client.get(url) response.raise_for_status() except httpx.HTTPStatusError as e: print(f请求失败: {e.response.status_code})5.3 异常处理与日志记录健壮的爬虫需要完善的错误处理import logging logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s ) logger logging.getLogger(__name__) def safe_parse(html: str): try: return parse_page(html) except Exception as e: logger.error(f解析失败: {str(e)}, exc_infoTrue) return []6. 项目扩展与实用建议6.1 扩展功能思路定时自动更新使用schedule或APScheduler库设置定时任务比较新旧数据只更新变化的条目数据可视化import matplotlib.pyplot as plt ratings [m[rating] for m in movies] plt.hist(ratings, bins10) plt.title(豆瓣Top250评分分布) plt.show()构建简单的Web界面使用FastAPI或Flask展示数据添加搜索和筛选功能6.2 生产环境部署建议容器化部署FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD [python, main.py]监控与告警使用Prometheus监控爬虫运行状态设置异常告警通知分布式扩展考虑使用Celery或Dask分发爬取任务使用Redis作为任务队列和结果存储在实际项目中我发现豆瓣对频繁请求比较敏感建议将爬取间隔设置为3-5秒并尽量在非高峰时段运行爬虫。对于关键业务数据可以考虑使用官方API如果有的话替代网页爬取。

相关文章:

别再用requests了!用Python 3.11+的httpx和BeautifulSoup4爬取豆瓣电影Top250(附完整代码)

用Python 3.11的httpx和BeautifulSoup4高效爬取豆瓣电影Top250 在Python爬虫领域,技术栈的迭代速度令人目不暇接。十年前流行的urllib2如今已被更现代、更高效的库所取代。本文将带你使用Python 3.11的最新特性,结合httpx和BeautifulSoup4这两个强力工具…...

PostgreSQL表膨胀避坑指南:从监控到优化的完整解决方案

PostgreSQL表膨胀避坑指南:从监控到优化的完整解决方案 PostgreSQL作为一款强大的开源关系型数据库,在企业级应用中扮演着重要角色。然而,随着数据量的增长和业务复杂度的提升,表膨胀问题逐渐成为许多DBA和开发者的"隐形杀手…...

Gurobi Python接口避坑指南:从安装、建模到求解电影排片问题的实战记录

Gurobi Python实战避坑手册:电影排片优化全流程解析 第一次接触Gurobi时,我被它号称的"商业求解器性能标杆"吸引,却在安装环节就被Anaconda环境冲突绊住了脚步。作为从开源求解器转战商业工具的用户,我完整记录了从零开…...

项目介绍 MATLAB实现基于Q-learning-DNN Q学习算法(Q-learning)结合深度神经网络(DNN)进行无人机三维路径规划的详细项目实例(含模型描述及部分示例代码) 还请多多点一下

MATLAB实现基于Q-learning-DNN Q学习算法(Q-learning)结合深度神经网络(DNN)进行无人机三维路径规划的详细项目实例 更多详细内容可直接联系博主本人 或者访问对应标题的完整博客或者文档下载页面(含完整的程序&…...

下一代嵌入式开发架构实战:基于Rust与STM32F4 HAL的安全高效系统设计

下一代嵌入式开发架构实战:基于Rust与STM32F4 HAL的安全高效系统设计 【免费下载链接】Awesome-Embedded A curated list of awesome embedded programming. 项目地址: https://gitcode.com/gh_mirrors/aw/Awesome-Embedded 在传统嵌入式开发中,开…...

【Python异步I/O终极指南】:20年CTO亲授asyncio高并发实战心法,避开97%开发者踩过的12个致命陷阱

第一章:Python异步I/O的本质与演进脉络Python异步I/O并非简单的“多线程替代方案”,其本质是**在单线程内通过事件循环(event loop)协同调度I/O等待任务,避免CPU空转,实现高并发吞吐**。它依赖操作系统底层…...

从逐点更新到批量优化:深入解析分块LMS(BLMS)自适应滤波算法

1. 从逐点到分块:为什么需要BLMS算法? 第一次接触自适应滤波时,我和大多数人一样从经典的LMS算法开始。当时在做一个语音去噪的小项目,用LMS实现实时滤波后发现两个头疼的问题:电脑风扇狂转不止(计算负荷大…...

Mujoco 仿真 PPO 强化学习机械臂末端路径规划:从奖励函数设计到收敛优化实战

1. 为什么奖励函数是机械臂路径规划的灵魂 第一次用PPO训练机械臂时,我盯着末端执行器在原地打转的场景整整发呆了半小时。明明代码逻辑没问题,网络结构也够深,为什么机械臂就是不肯往目标点移动?直到我把奖励函数里的距离惩罚从线…...

可解释推荐-TKDE 24|基于强化路径推理的反事实解释优化策略

1. 为什么我们需要更好的推荐解释? 你有没有遇到过这种情况:某购物平台突然给你推荐了一款完全不符合你品味的商品,或者视频平台连续推送你根本不感兴趣的短视频?这时候你可能会想:"这个推荐系统到底是怎么想的&…...

Ubuntu 20.04 LTS静态IP配置避坑指南:从NetworkManager到netplan的完整流程

Ubuntu 20.04 LTS静态IP配置深度解析:从NetworkManager到netplan的无缝迁移 在服务器管理和开发环境中,稳定的网络连接是基础中的基础。Ubuntu 20.04 LTS作为长期支持版本,其网络配置方式从传统的NetworkManager逐渐转向了更现代的netplan工具…...

S32K144开发环境避坑指南:SDK选择与Segger JLink配置详解

S32K144开发环境避坑指南:SDK选择与Segger JLink配置详解 第一次接触NXP S32K144微控制器时,最令人头疼的莫过于开发环境的搭建。记得去年接手一个汽车电子项目,团队花了整整三天时间才让调试器正常工作——不是因为硬件问题,而是…...

Qwen3-Reranker-0.6B部署教程:对接Weaviate向量数据库Hybrid Search集成

Qwen3-Reranker-0.6B部署教程:对接Weaviate向量数据库Hybrid Search集成 你是不是也遇到过这样的问题?用向量数据库做检索,明明搜出来一堆结果,但排在前面的总感觉不是最想要的。传统的向量相似度搜索,有时候就是差那…...

终极指南:如何用UMA模型快速预测催化吸附能,节省90%计算时间

终极指南:如何用UMA模型快速预测催化吸附能,节省90%计算时间 【免费下载链接】ocp Open Catalyst Projects library of machine learning methods for catalysis 项目地址: https://gitcode.com/GitHub_Trending/oc/ocp 在催化材料研究中&#x…...

从零开始:用CJQT构建跨平台数据可视化应用的入门教程

从零开始:用CJQT构建跨平台数据可视化应用的入门教程 【免费下载链接】CJQT 仓颉语言对qt封装库 项目地址: https://gitcode.com/Cangjie-TPC/CJQT 你是否在寻找一个能让数据可视化开发变得简单的开源框架?是否因复杂的跨平台适配问题而束手无策&…...

一键部署体验:Nomic-Embed-Text-V2-MoE在星图GPU平台上的开箱即用Demo

一键部署体验:Nomic-Embed-Text-V2-MoE在星图GPU平台上的开箱即用Demo 你是不是也遇到过这种情况?看到一篇技术文章介绍某个很酷的开源模型,比如Nomic-Embed-Text-V2-MoE,心里痒痒的想立刻试试。结果一搜部署教程,又是…...

Livekit Server分布式部署实测:手把手教你用Redis搞定多节点,并说清楚它和云服务的根本区别

Livekit Server分布式架构深度实战:Redis多节点部署与云服务本质差异解析 从单机到分布式:突破性能瓶颈的关键抉择 当你的Livekit单机服务开始出现CPU占用率持续超过80%、TURN服务延迟明显增加、房间创建响应时间超过500ms等现象时,就到了必须…...

用Isaac Sim的Action Graph给ROS2机器人发布激光雷达数据:一个完整的传感器仿真流程

用Isaac Sim的Action Graph实现ROS2激光雷达数据仿真:从传感器配置到RViz可视化的全流程指南 在机器人开发和自动驾驶系统测试中,高保真的传感器仿真能够显著降低硬件成本和迭代周期。NVIDIA Isaac Sim作为一款强大的机器人仿真平台,与ROS2生…...

保姆级教程:用PyTorch 1.13+Win11搞定MSTAR数据集分类(附完整代码)

从零实现MSTAR数据集分类:PyTorch全卷积网络实战指南 1. 环境配置与工具准备 在Windows 11系统上搭建PyTorch开发环境需要特别注意版本兼容性问题。以下是经过验证的稳定组合: PyTorch 1.13.0 CUDA 11.6 cuDNN 8.3.2Python 3.8-3.10(推荐…...

HDF5文件可视化指南:用HDFView检查你的Python数据存储结果

HDF5文件可视化指南:用HDFView检查你的Python数据存储结果 当你用Python处理完一批数据并存入HDF5文件后,最让人忐忑的莫过于——数据真的按预期存储了吗?结构是否正确?数值有无异常?本文将带你用HDFView这款专业工具&…...

手把手教你用脉动阵列实现FIR滤波器:从理论到VLSI设计的完整流程

手把手教你用脉动阵列实现FIR滤波器:从理论到VLSI设计的完整流程 在数字信号处理领域,FIR滤波器因其线性相位特性和稳定性而广受欢迎。但当面对高性能、低功耗的应用场景时,传统实现方式往往难以满足需求。脉动阵列(Systolic Arr…...

3分钟快速上手:text-generation-webui大模型本地部署完全指南

3分钟快速上手:text-generation-webui大模型本地部署完全指南 【免费下载链接】text-generation-webui A Gradio web UI for Large Language Models. Supports transformers, GPTQ, AWQ, EXL2, llama.cpp (GGUF), Llama models. 项目地址: https://gitcode.com/Gi…...

高效流畅的WindowsB站体验:BiliBili-UWP第三方客户端全方位指南

高效流畅的WindowsB站体验:BiliBili-UWP第三方客户端全方位指南 【免费下载链接】BiliBili-UWP BiliBili的UWP客户端,当然,是第三方的了 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBili-UWP 作为一名Windows平台的B站用户&…...

Qwen3-0.6B-FP8辅助Java八股文学习:智能抽题与答案要点生成

Qwen3-0.6B-FP8辅助Java八股文学习:智能抽题与答案要点生成 1. 引言:当面试备考遇上AI 准备Java面试,尤其是那些经典的“八股文”题目,对很多程序员来说是个既熟悉又头疼的过程。你可能也经历过:面对厚厚的面试宝典&…...

Llama-3.2V-11B-cot惊艳效果展示:CoT逻辑推演+流式输出真实推理作品集

Llama-3.2V-11B-cot惊艳效果展示:CoT逻辑推演流式输出真实推理作品集 1. 专业级视觉推理工具震撼登场 Llama-3.2V-11B-cot是基于Meta最新多模态大模型开发的高性能视觉推理工具,专为双卡4090环境深度优化。这个工具最令人惊叹的地方在于它完美融合了Ch…...

Java伪终端完全实战:如何用pty4j实现跨平台命令行交互

Java伪终端完全实战:如何用pty4j实现跨平台命令行交互 【免费下载链接】pty4j Pty for Java 项目地址: https://gitcode.com/gh_mirrors/pt/pty4j 在Java应用中集成命令行交互功能,你是否曾面临跨平台兼容性差、进程管理复杂、终端控制能力有限等…...

Unity3D集成百度语音识别与唤醒功能实战指南(Android平台)

1. 为什么选择百度语音SDK? 在Unity3D项目中实现语音交互功能时,百度语音识别与唤醒SDK是我测试过最稳定的解决方案之一。特别是在Android平台上,它的离线唤醒功能响应速度能控制在800毫秒内,识别准确率在安静环境下能达到95%以上…...

新手也能懂:用Python+TI IWR1843雷达,从ADC数据到4D点云的全流程拆解

新手也能懂:用PythonTI IWR1843雷达,从ADC数据到4D点云的全流程拆解 毫米波雷达技术正在智能驾驶、工业检测等领域掀起革命,但原始信号到点云的转换过程常让初学者望而生畏。本文将用Python代码一步步拆解TI IWR1843雷达的ADC数据处理全流程…...

Langchain与Qwen结合:如何用Python构建一个智能问答机器人(含联网搜索功能)

Langchain与Qwen结合:如何用Python构建一个智能问答机器人(含联网搜索功能) 在人工智能技术快速发展的今天,构建一个能够理解自然语言并提供准确回答的智能系统已不再是遥不可及的梦想。通过结合Langchain框架和Qwen大语言模型&a…...

3大核心突破!MAT图像修复技术全解析:从环境部署到实战应用

3大核心突破!MAT图像修复技术全解析:从环境部署到实战应用 【免费下载链接】MAT MAT: Mask-Aware Transformer for Large Hole Image Inpainting 项目地址: https://gitcode.com/gh_mirrors/ma/MAT MAT(Mask-Aware Transformer for La…...

Qt与Visual Studio双剑合璧:海康工业相机SDK二次开发实战指南

1. 开发环境准备:当Qt遇上Visual Studio 第一次接触海康工业相机SDK开发时,我像大多数开发者一样纠结工具链选择。经过多个项目实战验证,Visual StudioQt Creator的组合堪称黄金搭档——前者提供强大的C调试能力,后者带来跨平台的…...