【python】Python爬虫入门教程:使用requests库

Python爬虫入门教程:使用requests库

爬虫是数据获取的重要手段,下面我将通过一个完整的示例,教你如何使用Python的requests库编写一个简单的爬虫。我们将以爬取豆瓣电影Top250为例。

【python】网络爬虫教程 - 教你用python爬取豆瓣电影 Top250

1. 环境准备

首先需要安装必要的库:

pip install requests beautifulsoup4

2. 项目结构规划

一个简单的爬虫项目通常包含以下模块:

  • 发送HTTP请求获取页面内容
  • 解析HTML提取数据
  • 数据存储
  • 控制爬虫行为(如翻页、延时)

3. 编写爬虫代码

下面是一个完整的爬虫示例:

import requests
from bs4 import BeautifulSoup
import time
import random
import csvclass DoubanSpider:def __init__(self):# 设置请求头,模拟浏览器访问self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}# 存储结果的列表self.movies = []def get_page(self, page_num):"""获取指定页数的HTML内容"""url = f'https://movie.douban.com/top250?start={page_num*25}'try:response = requests.get(url, headers=self.headers, timeout=10)# 检查响应状态码if response.status_code == 200:return response.textelse:print(f"请求失败,状态码: {response.status_code}")return Noneexcept requests.exceptions.RequestException as e:print(f"请求异常: {e}")return Nonedef parse_page(self, html_content):"""解析HTML内容,提取电影信息"""if not html_content:returnsoup = BeautifulSoup(html_content, 'html.parser')# 查找所有电影项movie_items = soup.select('div.item')for item in movie_items:try:# 提取电影标题title = item.select_one('span.title').text# 提取评分rating = item.select_one('span.rating_num').text# 提取简介quote = item.select_one('span.inq')quote = quote.text if quote else '无简介'# 提取导演和主演info = item.select_one('div.bd p').text.strip()# 添加到结果列表self.movies.append({'title': title,'rating': rating,'quote': quote,'info': info})except Exception as e:print(f"解析错误: {e}")def save_to_csv(self, filename='douban_movies.csv'):"""将结果保存为CSV文件"""if not self.movies:print("没有数据可保存")returnwith open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:fieldnames = ['title', 'rating', 'quote', 'info']writer = csv.DictWriter(csvfile, fieldnames=fieldnames)# 写入表头writer.writeheader()# 写入数据writer.writerows(self.movies)print(f"数据已保存到 {filename}")def run(self, pages=10):"""运行爬虫,爬取指定页数的数据"""for page in range(pages):print(f"正在爬取第 {page+1} 页...")html_content = self.get_page(page)self.parse_page(html_content)# 设置随机延时,避免频繁请求delay = random.uniform(1, 3)print(f"等待 {delay:.2f} 秒后继续...")time.sleep(delay)# 保存数据self.save_to_csv()print(f"共爬取 {len(self.movies)} 条电影数据")# 运行爬虫
if __name__ == "__main__":spider = DoubanSpider()# 爬取前10页数据,共250条spider.run(pages=10)

4. 代码解析

这个爬虫程序包含以下关键部分:

  1. 请求处理

    • get_page 方法发送HTTP请求获取网页内容
    • 设置了请求头和超时时间,提高稳定性
    • 处理了可能的请求异常
  2. 数据解析

    • parse_page 方法使用BeautifulSoup解析HTML
    • 通过CSS选择器定位电影信息元素
    • 提取标题、评分、简介等关键信息
  3. 数据存储

    • save_to_csv 方法将结果保存为CSV文件
    • 使用UTF-8-sig编码确保中文正常显示
  4. 爬虫控制

    • run 方法控制爬取流程
    • 设置随机延时避免被封IP
    • 支持指定爬取页数

5. 进阶优化建议

  1. 添加异常处理:可以增强错误处理机制,例如失败重试功能

  2. 使用代理IP:爬取大量数据时,使用代理IP避免被封

  3. 数据清洗:提取数据后进行清洗和验证

  4. 存储优化:可以使用数据库存储数据,如SQLite、MySQL等

  5. 异步请求:对于大规模爬取,可以考虑使用aiohttp提高效率

这个爬虫示例展示了基本的爬虫架构和实现方法。实际应用中,你可以根据目标网站的结构调整解析逻辑,或者添加更多功能如图片下载、数据可视化等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91368.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV图像缩放:resize

图像缩放是图像处理中的基础操作之一。无论是图像预处理、数据增强还是图像金字塔构建,cv::resize 都是我们最常用的函数之一。但你是否注意到,在 OpenCV 中同时还存在一个名为 cv::Mat::resize 的方法?这两个函数虽然名字类似,但…

汽车、航空航天、适用工业虚拟装配解决方案

一、现状在制造业数字化转型浪潮中,传统装配过程仍面临诸多挑战:物理样机试错成本高、装配周期冗长、工艺优化依赖经验、跨部门协作效率低下……如何打破“试错-返工”的恶性循环?目前总装工艺通过DELMIA、NX、Creo等工程软件进行工艺装配验证…

页面跳转和前端路由的区别

传统方式&#xff1a;通过改变浏览器地址栏的 URL 来实现window.location.href /new-page<a href"/new-page">跳转到新页面</a>会导致整个页面重新加载会触发浏览器向服务器发送新的请求页面状态不会保留&#xff0c;所有资源重新加载可以避免新上线的内…

C/C++核心知识点详解

C/C核心知识点详解 1. 变量的声明与定义&#xff1a;内存分配的本质区别 核心概念 在C/C中&#xff0c;变量的声明和定义是两个完全不同的概念&#xff1a; 声明&#xff08;Declaration&#xff09;&#xff1a;告诉编译器变量的名称和类型&#xff0c;但不分配内存空间定义&a…

物联网发展:从概念到应用的演变历程

物联网的发展历程是一部技术革新与社会需求共同驱动的进化史&#xff0c;其演变可划分为概念萌芽、技术积累、应用拓展和智能融合四个阶段&#xff0c;每个阶段均以关键技术突破或社会需求变革为标志&#xff0c;最终形成万物互联的智能生态。以下是具体演变历程&#xff1a;一…

一个人开发一个App(数据库)

后端要保存数据&#xff0c;我还是选择了关系型数据库Mysql, 因为其它的不熟悉。 flutter端这次我选择的是ObjectBox&#xff0c;以前都是直接用的sqlite3&#xff0c;看对比ObjectBox效率比sqlite3高许多&#xff0c;这次前端为了用户体验&#xff0c;我需要缓存数据&#xff…

天铭科技×蓝卓 | “1+2+N”打造AI驱动的汽车零部件行业智能工厂

7月24日&#xff0c;杭州天铭科技股份有限公司&#xff08;简称 “天铭科技”&#xff09;与蓝卓数字科技有限公司&#xff08;简称 “蓝卓”&#xff09;签订全面战略合作协议。天铭科技董事长张松、副总经理艾鸿冰&#xff0c;蓝卓副董事长谭彰等领导出席签约仪式&#xff0c…

技术复盘报告:Vue表格中多行文本字段数据保存丢失问题

1. 问题背景 在一个基于 Vue 2.0 和 ElementUI 的复杂数据维护页面中&#xff0c;用户报告了一个偶发但严重的问题&#xff1a;在表格中编辑一个多行文本&#xff08;textarea&#xff09;字段时&#xff0c;输入的内容有时会在点击“保存”后丢失。 具体表现&#xff1a; 前端…

#C语言——学习攻略:深挖指针路线(四)--字符指针变量,数组指针变量,二维数组传参的本质,函数指针变量,函数指针数组

&#x1f31f;菜鸟主页&#xff1a;晨非辰的主页 &#x1f440;学习专栏&#xff1a;《C语言学习》 &#x1f4aa;学习阶段&#xff1a;C语言方向初学者 ⏳名言欣赏&#xff1a;"暴力解法是上帝给的&#xff0c;优化解法是魔鬼教的。" 目录 1. 字符指针变量 1.1 使…

SpringBoot收尾+myBatis plus

一、数据传递返回值为:字符串package com.apesource.springboot_web_04.controller;import com.apesource.springboot_web_04.pojo.Emp; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;/*** 返回值为:字符…

基于 Spring Boot 实现动态路由加载:从数据库到前端菜单的完整方案

在后台管理系统中&#xff0c;不同用户角色往往拥有不同的操作权限&#xff0c;对应的菜单展示也需动态调整。动态路由加载正是解决这一问题的核心方案 —— 根据登录用户的权限&#xff0c;从数据库查询其可访问的菜单&#xff0c;封装成前端所需的路由结构并返回。本文将详细…

VitePress学习-自定义主题

VitePress-自定义主题 代码仓库 基础了解 初始化项目的时候选择 custom theme 运行后会发现页面挺丑的。 如果想要用默认主题怎么办呢&#xff0c;修改Layout。 使用默认主题的Layout <script setup lang"ts"> import { useData } from vitepress; impo…

【GEO从入门到精通】生成式引擎与其他 AI 技术的关系

2.1.3 生成式引擎与其他 AI 技术的关系生成式引擎作为人工智能领域的创新力量&#xff0c;与其他 AI 技术紧密相连&#xff0c;相互促进&#xff0c;共同推动 生成式引擎优化&#xff08;GEO&#xff09; 的发展。这些技术使生成式引擎能够为消费者提供更加个性化和精准的内容。…

JAVAEE--4.多线程案例

设计模式1.单例模式1.1饿汉模式1.2懒汉模式(单线程版)1.3懒汉模式(多线程版本)1.4懒汉模式(多线程版本进阶版)2.阻塞队列3.定时器4.线程池1.单例模式设计模式是"软性约束",不是强制的,可以遵守也可以不遵守,按照设计模式写代码使代码不会太差框架是"硬性约束&qu…

量化感知训练(QAT)流程

WHAT&#xff1a;量化感知训练&#xff08;Quantization-Aware Training, QAT&#xff09; 是一种在模型训练阶段引入量化误差的技术。它的核心思想是&#xff1a;通过在前向传播时插入“伪量化节点”引入量化误差&#xff0c;将权重和激活模拟为低精度&#xff08;如 int8&…

docker 用于将镜像打包为 tar 文件

docker save 是 Docker 中用于将镜像打包为 tar 文件的命令&#xff0c;常用于镜像的备份、迁移或离线传输。以下是其核心用法和注意事项&#xff1a;一、基本语法bashdocker save [选项] IMAGE [IMAGE...] > 文件名.tar # 或 docker save -o 文件名.tar IMAGE [IMAGE...]IM…

设计模式(六)创建型:单例模式详解

设计模式&#xff08;六&#xff09;创建型&#xff1a;单例模式详解单例模式&#xff08;Singleton Pattern&#xff09;是 GoF 23 种设计模式中最简单却最常被误用的创建型模式。其核心价值在于确保一个类在整个应用程序生命周期中仅存在一个实例&#xff0c;并提供一个全局访…

PostgreSQL AND OR 操作符详解

PostgreSQL AND & OR 操作符详解 在数据库查询中,AND 和 OR 是两种常见的逻辑操作符,用于组合多个查询条件。PostgreSQL 作为一款功能强大的开源关系型数据库管理系统,同样支持这些操作符。本文将详细介绍 PostgreSQL 中的 AND 和 OR 操作符,并探讨它们在查询中的应用…

RabbiteMQ安装-ubuntu

Ubuntu 1.安装Erlang RabbitMQ需要Erlang语言的支持&#xff0c;在安装RabbitMQ之前需要安装Erlang #更新软件包 sudo apt-get update#安装erlang sudo apt-get install erlang查看erlang版本 roothcss-ecs-027f:/# erl Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [sm…

Linux驱动20 --- FFMPEG视频API

目录 一、FFMPEG 视频 API 的使用 1.1 介绍 1.2 整体编程过程 获取核心上下文指针 打开输入流文件 获取输入流 获取编码器 初始化解码器 申请输出流指针 获取显示数据空间大小 申请输出显示空间 绑定输出流和输出显示空间 申请格式转换上下文 申请输入流指针 读取一帧数据 发…