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

Python 爬虫实战:从零搭建第一个网页爬虫

前言

在数据驱动的时代,网页爬虫作为获取互联网公开数据的核心技术,已成为 Python 开发者必备的技能之一。无论是数据分析、竞品调研还是内容聚合,爬虫都能高效地将分散在网页中的结构化、非结构化数据整合为可利用的格式。本文将从零基础出发,系统讲解爬虫的核心原理,手把手教你搭建第一个 Python 网页爬虫,帮助初学者快速理解爬虫的工作流程,掌握基础的爬取技巧,为后续深入学习复杂爬虫框架和反爬策略打下坚实基础。

摘要

本文以「豆瓣 Top250 电影榜单」为实战爬取目标(读者可直接点击链接访问目标网页),从爬虫的基本原理入手,逐步讲解环境搭建、HTTP 请求发送、响应内容解析、数据提取与保存等核心步骤。通过完整的代码案例,结合详细的原理拆解和输出结果分析,让零基础读者能够从零开始搭建一个可运行的网页爬虫,理解爬虫的核心逻辑和关键技术点,同时掌握合规爬取的基本准则。

一、爬虫基础认知

1.1 爬虫的核心原理

网页爬虫本质上是模拟浏览器向目标网站发送 HTTP 请求,接收服务器返回的响应数据(通常为 HTML、JSON 等格式),并从中提取有效信息的程序。其核心流程可概括为:

  1. 请求发送:构造符合 HTTP 协议的请求,向目标 URL 发起请求;
  2. 响应接收:接收服务器返回的响应内容,判断响应状态;
  3. 数据解析:从响应内容中提取目标数据(如文本、链接、图片地址等);
  4. 数据保存:将提取的有效数据存储为文件(如 CSV、JSON)或数据库。

1.2 爬虫合规性说明

在进行爬虫开发前,必须遵守相关法律法规和网站规则:

  • 查看目标网站的robots.txt文件(如https://movie.douban.com/robots.txt),遵守爬取限制;
  • 控制爬取频率,避免给服务器造成过大压力;
  • 仅爬取公开的非敏感数据,不得用于商业侵权或违法用途。

二、环境搭建

2.1 核心库安装

本文使用 Python 3.8 + 版本,核心依赖库为requests(发送 HTTP 请求)和BeautifulSoup4(解析 HTML),通过 pip 命令安装:

bash

运行

pip install requests beautifulsoup4

2.2 环境验证

安装完成后,在 Python 终端执行以下代码验证环境:

python

运行

import requests from bs4 import BeautifulSoup print("requests版本:", requests.__version__) print("BeautifulSoup版本:", BeautifulSoup.__version__)

输出结果

plaintext

requests版本: 2.31.0 BeautifulSoup版本: 4.12.2

原理说明:通过导入库并打印版本号,确认库已成功安装且可正常调用,为后续爬虫开发提供环境保障。

三、实战:爬取豆瓣 Top250 电影(第一页)

3.1 目标分析

目标网页:豆瓣 Top250 电影榜单需提取的数据:

  • 电影排名
  • 电影名称
  • 电影评分
  • 电影简介

3.2 完整代码实现

python

运行

import requests from bs4 import BeautifulSoup import csv # 1. 配置请求头,模拟浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } # 2. 发送GET请求获取网页内容 def get_html(url): try: response = requests.get(url, headers=headers, timeout=10) # 验证响应状态码 response.raise_for_status() # 设置正确的编码格式 response.encoding = response.apparent_encoding return response.text except requests.exceptions.RequestException as e: print(f"请求失败:{e}") return None # 3. 解析HTML并提取数据 def parse_html(html): movie_list = [] soup = BeautifulSoup(html, "html.parser") # 定位电影列表容器 movie_items = soup.find_all("div", class_="item") for item in movie_items: # 提取排名 rank = item.find("em").text # 提取电影名称 title = item.find("span", class_="title").text # 提取评分 score = item.find("span", class_="rating_num").text # 提取简介(处理可能为空的情况) quote_tag = item.find("span", class_="inq") quote = quote_tag.text if quote_tag else "无简介" # 封装数据 movie_info = { "排名": rank, "电影名称": title, "评分": score, "简介": quote } movie_list.append(movie_info) return movie_list # 4. 保存数据到CSV文件 def save_data(movie_list, filename="douban_top250.csv"): # 定义CSV表头 headers = ["排名", "电影名称", "评分", "简介"] with open(filename, "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=headers) writer.writeheader() writer.writerows(movie_list) print(f"数据已保存到{filename}文件中") # 主函数 if __name__ == "__main__": # 目标URL(豆瓣Top250第一页) target_url = "https://movie.douban.com/top250" # 获取网页内容 html_content = get_html(target_url) if html_content: # 解析数据 movies = parse_html(html_content) # 打印前3条数据验证 print("爬取的前3条数据:") for i in range(3): print(movies[i]) # 保存数据 save_data(movies)

3.3 代码运行结果

控制台输出

plaintext

爬取的前3条数据: {'排名': '1', '电影名称': '肖申克的救赎', '评分': '9.7', '简介': '希望让人自由。'} {'排名': '2', '电影名称': '霸王别姬', '评分': '9.6', '简介': '风华绝代。'} {'排名': '3', '电影名称': '阿甘正传', '评分': '9.5', '简介': '一部美国近现代史。'} 数据已保存到douban_top250.csv文件中
CSV 文件输出(部分内容)
排名电影名称评分简介
1肖申克的救赎9.7希望让人自由。
2霸王别姬9.6风华绝代。
3阿甘正传9.5一部美国近现代史。
4泰坦尼克号9.5失去的才是永恒的。
5这个杀手不太冷9.4怪蜀黍和小萝莉的爱情。

3.4 核心代码原理拆解

(1)请求头配置

python

运行

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

原理User-Agent用于标识请求的客户端类型,模拟浏览器请求可避免被服务器识别为爬虫而拒绝访问。

(2)GET 请求发送

python

运行

response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() response.encoding = response.apparent_encoding

原理

  • requests.get()发送 GET 请求,参数headers传递请求头,timeout设置超时时间;
  • raise_for_status()检查响应状态码,若为 4xx/5xx 则抛出异常;
  • apparent_encoding自动识别响应内容的编码,避免中文乱码。
(3)HTML 解析

python

运行

soup = BeautifulSoup(html, "html.parser") movie_items = soup.find_all("div", class_="item")

原理

  • BeautifulSoup将 HTML 文本解析为树形结构,html.parser为 Python 内置解析器;
  • find_all()根据标签名和 class 属性定位所有电影条目,返回列表对象。
(4)数据提取与保存
  • 提取数据:通过find()方法定位具体标签,text属性获取标签内文本;
  • 保存数据:使用csv模块将字典列表写入 CSV 文件,newline=""避免空行,encoding="utf-8"保证中文正常显示。

四、常见问题与解决方案

问题现象原因分析解决方案
中文乱码响应编码设置错误使用response.encoding = response.apparent_encoding自动识别编码
请求被拒绝(403 错误)未配置 User-Agent 或请求频率过高配置完整请求头,添加延时(time.sleep(1))控制爬取频率
数据提取为空标签定位错误检查网页源码,确认标签名、class 属性是否正确(可使用浏览器开发者工具验证)
超时错误(Timeout)网络不稳定或服务器响应慢增加timeout参数值,添加异常捕获机制

五、进阶方向

  1. 分页爬取:分析豆瓣 Top250 的分页 URL 规律(如https://movie.douban.com/top250?start=25),循环爬取所有页面;
  2. 数据存储优化:将数据保存到 MySQL、MongoDB 等数据库,便于后续分析;
  3. 反爬应对:学习 IP 代理、Cookie 池、验证码识别等高级技巧;
  4. 框架使用:掌握 Scrapy、PySpider 等专业爬虫框架,提升开发效率。

六、总结

本文从爬虫基础原理出发,以豆瓣 Top250 电影爬取为例,完整实现了一个基础网页爬虫的开发流程。通过本次实战,读者应掌握requests库发送 HTTP 请求、BeautifulSoup解析 HTML、数据提取与保存的核心技能,同时理解爬虫开发的合规性要求和常见问题的解决思路。

爬虫技术的核心在于「模拟浏览器行为 + 精准解析数据」,初学者应注重基础原理的理解,而非单纯复制代码。后续可通过爬取不同类型的网站(如电商、资讯、社交平台)巩固技能,逐步掌握更复杂的爬取场景和反爬应对策略,最终实现高效、合规的数据分析与数据采集。

http://www.cnnetsun.cn/news/115649.html

相关文章:

  • 17、Linux文件与目录操作全解析
  • 21、Linux系统进程与包管理全解析
  • 二叉排序树的插入、先序/中序/后序/层次遍历、节点查询
  • 如何在 Spring Boot 中接入 Amazon ElastiCache
  • 基于51单片机的血糖步数测量仪
  • Linux C/C++ 学习日记(51):内存池
  • AAAI25|基于神经共形控制的时间序列预测模型
  • CATCH:ICLR 2025 最值得关注的时间序列异常检测新框架
  • 开发到生产全链路:Docker containerd Kubernetes 运行时全景指南
  • 文件包含漏洞终极指南
  • #扫雷游戏
  • Java计算机毕设之基于springboot+vue的高校学院校内订餐系统的设计与实现基于JAVA的学院校内订餐系统的实现(完整前后端代码+说明文档+LW,调试定制等)
  • 小程序计算机毕设之基于微信跑腿小程序的设计与实现基于springboot+微信小程序的跑腿小程序的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 小程序计算机毕设之基于springboot+微信小程序的餐厅预约系统设计与实现基于微信小程序的餐厅预约系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • torch报错:ibtorch_cpu.so: cannot enable executable stack as shared object requires: Invalid argument
  • 计算机小程序毕设实战-基于springboot+微信小程序的餐厅预约系统设计与实现基于SpringBoot的在线点餐系统微信小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【课程设计/毕业设计】基于微信小程序跑腿平台的设计与实现代码基于springboot+微信小程序的跑腿小程序的设计与实现【附源码、数据库、万字文档】
  • jquery的基本使用(2)
  • HTML5结合Vue3实现超大文件分片上传的加密传输方案?
  • 基于增量动力分析方法IDA求解易损性曲线的Matlab代码探秘
  • mysql面试题整理
  • 瞄准科技特长生!3 大核心编程考级赛事(CTL/YCL/GESP)深度对比
  • day38打卡
  • JavaEE进阶——SpringBoot日志从入门到精通
  • 结构体简单题
  • 时间序列回归预测:LSTM、CNN - LSTM、PSO - CNN - LSTM、GAPSO - CNN - LSTM大比拼
  • 飞轮储能系统的建模与 MATLAB 仿真:永磁同步电机作为飞轮驱动电机
  • 车间进度总卡壳?生产小工单的3个必备功能,90%企业都用错了
  • 如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次
  • 基于MPC的永磁同步电机非线性终端滑模控制仿真研究