初学者如何用 Python 写第一个爬虫?

初学者如何用 Python 写第一个爬虫?

一、爬虫的基本概念

(一)爬虫的定义

爬虫,英文名为 Web Crawler,也被叫做网络蜘蛛、网络机器人。想象一下,有一个勤劳的小蜘蛛,在互联网这个巨大的蜘蛛网中穿梭。它能够模拟人类用户浏览网页的行为,自动地在网页间跳转,其主要目的就是从网页里精准地提取出我们想要的特定内容。比如说,你想知道某电商平台上某款手机的所有评论,或者某个新闻网站上关于特定主题的所有文章,爬虫就可以帮你快速获取这些信息。

(二)爬虫的主要工作流程

发送请求:依据 HTTP 协议,就像是你去商店买东西要遵循商店的规则一样,爬虫按照这个规则向目标网页发起请求。它会带着一些必要的信息,比如告诉网页它想要获取什么内容,然后得到网页的 HTML 源代码,这就像是拿到了商店给你的商品清单。例如,当你在浏览器地址栏输入一个网址并回车,浏览器就会按照 HTTP 协议向对应的服务器发送请求,获取网页内容,爬虫也是类似的原理。

解析数据:获取到的 HTML 内容就像是一团杂乱的线球,里面包含了很多我们不需要的信息。解析数据这一步就是要把这团线球理顺,精准地提取出我们真正需要的数据。比如从 HTML 代码中找到网页的标题、正文内容、图片链接等等。可以把这一步想象成从一堆杂物中挑出你需要的宝贝。

存储数据:将提取出的数据妥善保存起来,就像你把买到的宝贝放在合适的地方,方便后续进一步处理与分析。可以保存到文件中,比如常见的 txt 文本文件,也可以保存到数据库里,方便进行数据的管理、查询等操作。

(三)常用 Python 工具

requests:它是一个用于高效发送 HTTP 请求的库。使用它就像给网页发送一封 “邮件”,轻松获取网页内容。比如,你想获取百度首页的内容,使用 requests 库几行代码就能搞定。它支持多种请求方式,如 GET、POST 等,满足不同场景下的需求。

BeautifulSoup:这个库专注于解析 HTML 或 XML 数据,能把复杂的 HTML 结构转化为 Python 对象,让我们可以很方便地提取特定内容。它就像是一个专业的 “整理师”,把 HTML 代码整理得井井有条,我们可以轻松地找到自己想要的标签和内容。例如,要找到网页中的所有链接,使用 BeautifulSoup 就能快速实现。

re(正则表达式):正则表达式就像是一个强大的 “搜索工具”,可以精准匹配并提取复杂文本中的特定模式。比如,当你要从一段文本中找出所有符合邮箱格式的字符串,或者提取出所有的电话号码,正则表达式就能发挥巨大作用。它有一套自己独特的语法规则,掌握了这些规则,就能在文本处理中如鱼得水。

pandas:在数据清洗与分析方面表现出色,是处理数据的得力助手。它可以对爬取到的数据进行清洗、转换、分析等操作。例如,将爬取到的杂乱无章的数据整理成整齐的表格形式,方便进行数据分析和可视化展示。

二、环境搭建

(一)安装 Python

确保你的计算机已安装 Python,建议使用 3.7 及以上版本。如果还没有安装,别担心,这很简单。你可以前往 Python 官方网站(https://www.python.org/),在网站上找到下载按钮,根据你计算机的系统(Windows、Mac 或 Linux)选择对应的安装包进行下载。下载完成后,按照安装向导的提示一步步进行安装即可。安装过程中,记得勾选添加 Python 到系统路径选项,这样在后续使用命令行时就能更方便地调用 Python 了。

(二)安装必要库

安装好 Python 后,接下来要安装我们编写爬虫所需的库。打开命令行或终端(在 Windows 系统中可以通过搜索 “命令提示符” 找到,Mac 系统中可以在 “应用程序 - 实用工具” 中找到 “终端”)。在命令行中运行以下命令来安装所需的 Python 库:

pip install requests beautifulsoup4

这里的pip是 Python 的包管理工具,就像一个软件管家,通过它可以方便地安装、升级和卸载 Python 库。requests库用于发送 HTTP 请求,beautifulsoup4库用于解析 HTML 数据。安装过程中,命令行会显示安装进度,耐心等待安装完成即可。

三、编写第一个简单爬虫

现在,我们就来动手实现一个简单的爬虫,目标是抓取某个网页的标题与正文内容。比如说,我们以一个简单的示例网页https://example.com为例(实际使用时你可以替换为你感兴趣的网页,但要注意网页的使用条款和法律规定,确保合法合规地进行数据爬取)。

(一)完整代码示例

import requestsfrom bs4 import BeautifulSoupdef simple_crawler(url):try:# 发送HTTP请求response = requests.get(url)# 检查请求状态response.raise_for_status()# 解析HTML数据soup = BeautifulSoup(response.text, 'html.parser')# 提取网页标题title = soup.find('title').text# 提取网页正文段落paragraphs = soup.find_all('p')print(f"网页标题: {title}")print("网页内容:")# 遍历并打印段落内容for p in paragraphs:print(p.text)except requests.exceptions.RequestException as e:print(f"请求失败: {e}")url = "https://example.com"simple_crawler(url)

(二)代码逐步解析

发送 HTTP 请求

response = requests.get(url)

这一行代码使用requests.get()方法向目标网址发起 GET 请求。这里的url就是我们要爬取的网页地址。requests.get()方法会返回一个response对象,这个对象包含了网页的全部内容,其中就有我们需要的 HTML 源代码。就好比你向一个地方发送了一个请求,对方给你寄回了一个包裹,这个包裹里装着网页的信息。

  1. 检查请求状态
response.raise_for_status()

这行代码借助raise_for_status()方法来检查请求是否成功。HTTP 协议中有很多状态码,比如 200 表示请求成功,404 表示网页未找到,500 表示服务器内部错误等。如果返回的 HTTP 状态码代表错误,raise_for_status()方法就会触发异常,这样我们就能知道请求过程中出现了问题。这就像是你收到包裹后,先检查一下包裹是否完好无损,如果有问题就及时发现。

  1. 解析 HTML 数据
soup = BeautifulSoup(response.text, 'html.parser')

这一步使用BeautifulSoup库来解析 HTML 内容。response.text就是前面获取到的网页 HTML 源代码,'html.parser'指定使用 Python 内置的 HTML 解析器。BeautifulSoup会把 HTML 内容转化为一个便于操作的 Python 对象,就像把杂乱的物品整理分类,方便我们后续查找和提取需要的信息。

  1. 提取网页内容
title = soup.find('title').textparagraphs = soup.find_all('p')

find('title')方法用于精准定位 HTML 代码中的<title>标签,并通过.text获取标签内的文本内容,也就是网页的标题。find_all('p')方法则是提取所有的段落标签<p>,并以列表的形式呈现。这就像是在整理好的物品中,专门挑出标题和所有段落的物品。

  1. 打印结果
for p in paragraphs:print(p.text)

这部分代码通过一个循环遍历提取到的段落内容,并逐一打印每个段落的文本。这样我们就能在控制台看到网页的标题和正文内容了。就像你把挑出的段落物品一个一个拿出来展示。

四、优化爬虫功能

(一)添加请求头

有些网站很 “聪明”,会识别并阻止爬虫程序的访问。这时候,我们可以通过添加请求头来模拟浏览器的访问行为,让网站以为是真实用户在访问。比如:

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"}response = requests.get(url, headers=headers)

这里的headers就是我们设置的请求头,User - Agent字段模拟了一个 Chrome 浏览器的信息。当我们发送请求时,带上这个请求头,网站就更有可能允许我们访问。

(二)控制爬取频率

为了避免对目标网站造成过大负载,我们可以在每次请求后合理设置延时。比如:

import timedef delay_request(url):response = requests.get(url)time.sleep(2)return response

在这个函数中,使用time.sleep(2)让程序暂停 2 秒后再继续执行下一次请求。这样可以减轻目标网站的压力,也能避免因为频繁请求而被网站封禁。

(三)保存数据

将爬取到的数据妥善保存至文件或数据库中。

保存至文件

with open("output.txt", "w", encoding="utf - 8") as f:f.write(f"标题: {title}n")for p in paragraphs:f.write(p.text + "n")

这段代码使用with open()语句打开一个名为output.txt的文件,以写入模式("w"),并指定编码为utf - 8。然后将网页标题和段落内容逐行写入文件中。

  1. 保存至 CSV 文件
import csvwith open("output.csv", "w", newline="", encoding="utf - 8") as csvfile:writer = csv.writer(csvfile)writer.writerow(("段落内容"))for p in paragraphs:writer.writerow((p.text))

这里使用csv模块将数据保存为 CSV 文件。先创建一个csv.writer对象,然后写入表头"段落内容",再将每个段落内容逐行写入文件。

五、应对复杂网页

(一)动态加载网页

对于由 JavaScript 渲染的网页,requests库无法获取完整内容,因为它不会执行 JavaScript 代码。这时候我们可以选用seleniumplaywright。以selenium为例:

from selenium import webdriverurl = "https://example.com"driver = webdriver.Chrome()driver.get(url)html = driver.page_source

首先导入webdriver模块,然后创建一个Chrome浏览器驱动对象(需要提前下载对应版本的 ChromeDriver 并配置好路径)。通过driver.get(url)方法打开网页,driver.page_source可以获取到经过 JavaScript 渲染后的完整网页源代码,这样就能进一步解析和提取我们需要的数据了。

(二)处理 AJAX 请求

有些网页会通过 AJAX 请求来动态加载数据。要处理这种情况,我们需要分析网页的网络请求,找到 AJAX 请求的 URL 和参数。比如,在 Chrome 浏览器中,打开网页后按 F12 键,进入开发者工具,切换到 “Network” 选项卡,刷新网页,就能看到网页发起的所有请求。找到 AJAX 请求对应的 URL,然后使用requests库模拟发送这个请求,获取数据。例如:

ajax_url = "https://example.com/ajax - data"params = {"param1": "value1", "param2": "value2"}response = requests.get(ajax_url, params=params)data = response.json()

这里ajax_url是 AJAX 请求的 URL,params是请求参数,通过requests.get()方法发送请求,假设返回的数据是 JSON 格式,使用.json()方法将其解析为 Python 的字典或列表形式,方便进一步处理。

结语

恭喜你,勇敢的编程探险家!你已经成功迈出了用 Python 编写爬虫的第一步,这是一段充满无限可能的奇妙旅程的开始。也许在这个过程中,你遇到了一些挑战,比如代码报错、数据提取不准确,但请相信,每一次解决问题都是一次成长。

学会 Python 之后,你的世界将变得更加广阔。在数据领域,你可以轻松地从互联网上收集大量数据,进行数据分析和挖掘,发现隐藏在数据背后的规律和价值,无论是用于学术研究、商业决策还是个人兴趣项目都非常有用。在自动化办公方面,Python 爬虫可以帮你自动获取工作中需要的信息,如市场数据、行业报告等,大大提高工作效率。甚至在网络安全领域,你可以利用爬虫技术进行漏洞扫描和安全评估。所以,不要停下脚步,继续探索 Python 的世界,不断学习和实践,你会发现自己的潜力远超想象,能够创造出令人惊叹的作品。加油,未来的编程大师就是你!

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

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

相关文章

IDE/IoT/搭建物联网(LiteOS)集成开发环境,基于 VSCode + IoT Link 插件

文章目录 概述IDE安装安装旧版本VSCode安装插件安装问题和解决手动安装SDK包手动下载依赖工具 IoTLink配置IoTLink Home用户设置-工具链-编译器用户设置-工具链-构建器用户设置-工具链-烧录器用户设置-SDK管理工程设置-SDK配置工程设置-编译器工程设置-调试器 创建工程Demo 源码…

深度剖析:Dify+Sanic+Vue+ECharts 搭建 Text2SQL 项目 sanic-web 的 Debug 实战

目录 项目背景介绍sanic-web Dify\_service handle\_think\_tag报错NoneType问题描述debug Dify调用不成功&#xff0c;一直转圈圈问题描述debug 前端markdown格式只显示前5页问题描述debug1. 修改代码2.重新构建1.1.3镜像3.更新sanic-web/docker/docker-compose.yaml4. 重新部…

理想AI Talk第二季-重点信息总结

一、TL&#xff1b;DR 理想为什么要做自己的基模&#xff1a;座舱家庭等特殊VLM场景&#xff0c;deepseek/openai没有解决理想的基模参数量&#xff1a;服务端-300B&#xff0c;VLencoder-32B/3.6B&#xff0c;日常工作使用-300B&#xff0c;VLA-4B为什么自动驾驶可以达成&…

TensorRT

TensorRT 下载 TensorRT 7.1.3.4 TAR压缩包&#xff0c;解压到安装目录&#xff1a; tar xzvf TensorRT-7.1.3.4.Ubuntu-16.04.x86_64-gnu.cuda-11.0.cudnn8.0.tar.gz 添加 TensorRT lib 到环境变量&#xff1a; gedit ~/.bashrc # 添加 export LD_LIBRARY_PATH$LD_LIBRARY_PAT…

【NGINX】 -9 nginx + tomcat实现的多级反向代理

文章目录 1、tomcat的安装 (centos版本)1.1 安装Java依赖环境1.2 安装tomcat 2、tomcat的虚拟主机的配置2.1 配置多级目录 3、利用nginx的反向代理实现将转发指向一个虚拟机3.1 nginx服务器的配置3.2 客户端配置 4、 反向多级代理代理服务器操作nginx 1 服务器nginx 2 服务器to…

基于requests_html的python爬虫

前言&#xff1a;今天介绍一个相对性能更高的爬虫库requests_html&#xff0c;会不会感觉和requests有点联系&#xff1f;是的。为什么开始不直接介绍呢&#xff1f;因为我觉得requests是最基本入门的东西&#xff0c;并且在学习过程中也能学到很多东西。我的python老师在介绍这…

【架构篇】架构类型解释

架构设计的本质&#xff1a;从模糊概念到系统化思维 摘要 “架构”是系统设计的灵魂&#xff0c;但许多人对它的理解仍停留在抽象层面。本文系统解析架构的8大核心维度&#xff0c;结合设计原则、案例与误区分析&#xff0c;帮助开发者建立从战略到落地的完整认知框架。 一、架…

用Python绘制梦幻星空

用Python绘制梦幻星空 在这篇教程中&#xff0c;我们将学习如何使用Python创建一个美丽的星空场景。我们将使用Python的图形库Pygame和随机库来创建闪烁的星星、流星和月亮&#xff0c;打造一个动态的夜空效果。 项目概述 我们将实现以下功能&#xff1a; 创建深蓝色的夜…

PyTorch循环神经网络(Pytotch)

文章目录 循环神经网络&#xff08;RNN&#xff09;简单的循环神经网络长短期记忆网络&#xff08;LSTM&#xff09;门控循环单元&#xff08;GRU&#xff09; 循环神经网络&#xff08;RNN&#xff09; 循环神经网络&#xff08;RecurrentNeuralNetwork&#xff0c;RNN&#…

用算术右移实现逻辑右移及用逻辑右移实现算术右移

函数srl()用算术右移实现逻辑右移&#xff0c;函数sra()用逻辑右移实现算术右移。 程序代码 int sra(int x,int k); unsigned int srl(unsigned int x, int k);void main() {int rx1,k,x1;unsigned int rx2,x2;k3;x10x8777;x20x8777;rx1sra(x1, k);rx2srl(x2, k);while(1); }…

pojo层、dao层、service层、controller层的作用

在Java Web开发中&#xff0c;常见的分层架构&#xff08;如Spring Boot项目&#xff09;通常包含POJO层、DAO层、Service层和Controller层&#xff0c;各层职责明确&#xff0c;协同工作。以下是各层的作用及相互关系&#xff1a; 1. POJO层&#xff08;Model/Entity层&#…

【Linux网络】五种IO模型与阻塞IO

IO 在Linux网络环境里&#xff0c;IO&#xff08;Input/Output&#xff09;指的是网络数据在系统与外部网络&#xff08;像其他设备、服务器或者客户端&#xff09;之间进行传输的过程。 它是网络编程和系统性能优化的核心内容。 IO &#xff1a;INPUT和OUTPUT&#xff08;站…

入门OpenTelemetry——应用自动埋点

埋点 什么是埋点 埋点&#xff0c;本质就是在你的应用程序里&#xff0c;在重要位置插入采集代码&#xff0c;比如&#xff1a; 收集请求开始和结束的时间收集数据库查询时间收集函数调用链路信息收集异常信息 这些埋点数据&#xff08;Trace、Metrics、Logs&#xff09;被…

大数据场景下数据导出的架构演进与EasyExcel实战方案

一、引言&#xff1a;数据导出的演进驱动力 在数字化时代&#xff0c;数据导出功能已成为企业数据服务的基础能力。随着数据规模从GB级向TB级甚至PB级发展&#xff0c;传统导出方案面临三大核心挑战&#xff1a; ‌数据规模爆炸‌&#xff1a;单次导出数据量从万级到亿级的增长…

拓展运算符与数组解构赋值的区别

拓展运算符与数组解构赋值是ES6中用于处理数组的两种不同的特性&#xff0c;它们有以下区别&#xff1a; 概念与作用 • 拓展运算符&#xff1a;主要用于将数组展开成一系列独立的元素&#xff0c;或者将多个数组合并为一个数组&#xff0c;以及在函数调用时将数组作为可变参…

2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案)

2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案) 一、单项选择题(每题 5 分) C++ 程序流程控制的基本结构不包括以下哪项? A. 分支结构 B. 数据结构 C. 循环结构 D. 顺序结构 以下哪段代码能将数组 int a[4] = {2, 4, 6, 8}; 的所有元素变…

计算机视觉与深度学习 | Python实现EMD-CNN-LSTM时间序列预测(完整源码、数据、公式)

EMD-CNN-LSTM 1. 环境准备2. 数据生成(示例数据)3. EMD分解4. 数据预处理5. CNN-LSTM模型定义6. 模型训练7. 预测与重构8. 性能评估核心公式说明1. 经验模态分解(EMD)2. CNN-LSTM混合模型参数调优建议扩展方向典型输出示例以下是使用Python实现EMD-CNN-LSTM时间序列预测的完…

React 19中useContext不需要Provider了。

文章目录 前言一、React 19中useContext移除了Provider&#xff1f;二、使用步骤总结 前言 在 React 19 中&#xff0c;useContext 的使用方式有所更新。开发者现在可以直接使用 作为提供者&#xff0c;而不再需要使用 <Context.Provider>。这一变化简化了代码结构&…

单片机-STM32部分:14、SPI

飞书文档https://x509p6c8to.feishu.cn/wiki/VYYnwOc9Zi6ibFk36lYcPQdRnlf 什么是SPI SPI 是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 SPI&#xff0c;是一种高速的&…

Vue 3 动态 ref 的使用方式(表格)

一、问题描述 先给大家简单介绍一下问题背景。我正在开发的项目中&#xff0c;有一个表格组件&#xff0c;其中一列是分镜描述&#xff0c;需要支持视频上传功能。用户可以为每一行的分镜描述上传对应的视频示例。然而&#xff0c;在实现过程中&#xff0c;出现了一个严重的问…