Python 网络爬虫教程与案例详解
Python 网络爬虫教程与案例详解
在当今数字化时代,数据的价值愈发凸显。Python 作为一门强大的编程语言,在数据获取领域有着广泛的应用,其中网络爬虫便是一项重要的技术。网络爬虫能够自动从网页中提取所需数据,极大地提高了数据收集的效率。接下来,让我们深入学习 Python 网络爬虫的相关知识,并通过实际案例来加深理解。
一、Python 网络爬虫基础
1.1 什么是网络爬虫
网络爬虫,简单来说,就是模拟人类用户在浏览器中访问网页的行为,自动地从互联网上获取数据的程序。它可以像人一样在网页之间跳转、点击链接、填写表单等操作,只不过爬虫的速度更快且不知疲倦。例如,搜索引擎的爬虫会遍历互联网上的大量网页,抓取网页内容,以便为用户提供搜索服务。
1.2 爬虫的工作原理
当我们在浏览器中输入一个网址并回车后,浏览器会向服务器发送一个 HTTP 请求,服务器接收到请求后,根据请求的内容返回相应的 HTML、CSS、JavaScript 等文件。浏览器再对这些文件进行解析和渲染,最终呈现出我们看到的网页界面。
爬虫的工作原理与之类似。它首先向目标网页发送 HTTP 请求,获取服务器返回的响应内容。这个响应内容通常是网页的源代码,包含了我们想要的数据。然后,爬虫需要对这些源代码进行解析,从中提取出有用的信息,比如文本、图片链接、表格数据等。最后,将提取到的数据进行存储,以便后续分析和使用。
1.3 爬虫的合法性与道德性
在进行网络爬虫开发之前,我们必须明确爬虫的合法性和道德性问题。虽然爬虫技术本身是中立的,但使用不当可能会违反法律法规和网站的使用条款。例如,未经授权爬取涉及个人隐私、商业机密的数据,或者对网站造成过大的负载影响其正常运行,都可能面临法律风险。
在道德层面,我们也应该尊重网站的意愿。许多网站都有明确的robots.txt文件,该文件规定了爬虫可以和不可以访问的内容。我们在编写爬虫时,应该遵守这些规则,避免对网站造成不必要的干扰。
二、Python 爬虫相关库介绍
2.1 requests 库
requests库是 Python 中用于发送 HTTP 请求的第三方库,它的使用非常简单且功能强大,相比 Python 内置的urllib库更加人性化。使用requests库前,需要先安装它,可以通过pip install requests命令进行安装。
下面是一个使用requests库获取网页内容的简单示例:
import requests
url = 'https://www.example.com' # 替换为你要爬取的网址
response = requests.get(url)
if response.status_code == 200:print(response.text)
else:print(f'请求失败,状态码:{response.status_code}')
在这个示例中,我们使用requests.get()方法向目标网址发送了一个 GET 请求,并通过response.status_code检查请求是否成功。如果状态码为 200,表示请求成功,response.text中存储的就是网页的源代码。
2.2 BeautifulSoup 库
BeautifulSoup库是用于解析 HTML 和 XML 文档的库,它可以将复杂的 HTML 文档转换为一个树形结构,方便我们从中提取所需的数据。同样,在使用前需要通过pip install beautifulsoup4进行安装。
结合上面requests库获取到的网页内容,使用BeautifulSoup库来提取网页标题的示例如下:
from bs4 import BeautifulSoup
import requests
url = 'https://www.example.com'
response = requests.get(url)
if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')title = soup.title.stringprint(f'网页标题为:{title}')
else:print(f'请求失败,状态码:{response.status_code}')
这里我们创建了一个BeautifulSoup对象soup,并指定使用html.parser解析器。然后通过soup.title.string获取到了网页的标题。
2.3 lxml 库
lxml库也是一个高效的 HTML 和 XML 解析库,它支持 XPath 语法,在处理大型 XML 和 HTML 文档时性能表现出色。安装命令为pip install lxml。
使用lxml库结合 XPath 语法提取网页中所有链接的示例代码如下:
from lxml import etree
import requests
url = 'https://www.example.com'
response = requests.get(url)
if response.status_code == 200:html = etree.HTML(response.text)links = html.xpath('//a/@href')for link in links:print(link)else:print(f'请求失败,状态码:{response.status_code}')
在这个例子中,html.xpath('//a/@href')表示选取所有<a>标签的href属性值,即网页中的所有链接。
2.4 re 库(正则表达式库)
re库是 Python 内置的正则表达式库。正则表达式是一种强大的文本匹配工具,可以用于在复杂的文本中查找符合特定模式的字符串。在爬虫中,当其他解析库无法满足复杂的数据提取需求时,正则表达式就派上用场了。
例如,要从一段文本中提取所有的邮箱地址,可以使用以下代码:
import re
text = "我的邮箱是example@example.com,他的邮箱是test@test.com"
pattern = r'\w+@\w+\\.\w+'
emails = re.findall(pattern, text)
print(emails)
这里r'\w+@\w+\.\w+'是一个正则表达式模式,\w表示匹配字母、数字或下划线,+表示匹配前面的字符一次或多次。re.findall()函数会返回所有符合该模式的字符串。
三、Python 网络爬虫案例实战
3.1 案例一:爬取网页文章内容
假设我们要爬取某个博客网站上的文章内容。以某技术博客为例,我们的目标是获取文章的标题、发布时间和正文内容。
import requests
from bs4 import BeautifulSoup
url = 'https://www.exampleblog.com/article/123'
response = requests.get(url)
if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')# 获取文章标题title = soup.find('h1', class_='article - title').text.strip()# 获取发布时间time = soup.find('span', class_='article - time').text.strip()# 获取正文内容content = soup.find('div', class_='article - content').text.strip()print(f'文章标题:{title}')print(f'发布时间:{time}')print(f'正文内容:{content}')
else:print(f'请求失败,状态码:{response.status_code}')
在这个案例中,我们通过BeautifulSoup库的find()方法,根据 HTML 标签和类名找到了对应的元素,提取出了我们需要的数据。
3.2 案例二:爬取图片
现在我们来实现一个爬取网页上图片的爬虫。以某图片分享网站为例,我们要下载该网站上所有图片。
import requests
from bs4 import BeautifulSoup
import os
url = 'https://www.exampleimage.com'
response = requests.get(url)
if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')img_tags = soup.find_all('img')if not os.path.exists('images'):os.makedirs('images')for img in img_tags:img_url = img.get('src')if img_url.startswith('http'):img_response = requests.get(img_url)img_name = img_url.split('/')[-1]with open(f'images/{img_name}', 'wb') as f:f.write(img_response.content)else:print(f'请求失败,状态码:{response.status_code}')
这段代码首先获取网页中所有的<img>标签,然后通过requests.get()方法获取图片的二进制内容,并将其写入本地文件。注意,我们创建了一个名为images的文件夹来存储下载的图片。
3.3 案例三:爬取表格数据
假设我们要从 [某数据统计网站](https://www.exampledata.com/data - table) 上爬取一个表格中的数据。该表格包含了一些产品的名称、价格和销量信息。
import requests
from bs4 import BeautifulSoup
url = 'https://www.exampledata.com/data - table'
response = requests.get(url)
if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')table = soup.find('table', class_='data - table - class')if table:rows = table.find_all('tr')for row in rows:cols = row.find_all('td')if cols:product_name = cols[0].text.strip()price = cols[1].text.strip()sales = cols[2].text.strip()print(f'产品名称:{product_name},价格:{price},销量:{sales}')else:print(f'请求失败,状态码:{response.status_code}')
在这个案例中,我们先找到包含表格的<table>标签,然后遍历表格的每一行(<tr>标签),再在每一行中找到每一列(<td>标签)的数据并进行打印。
四、应对反爬虫机制
许多网站为了防止爬虫过度抓取数据,会设置一些反爬虫机制。常见的反爬虫机制有以下几种:
User - Agent 检测:网站通过检查请求头中的 User - Agent 字段来判断请求是否来自浏览器。爬虫可以在请求头中设置一个合理的 User - Agent 来伪装成浏览器,例如:
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)
IP 限制:如果某个 IP 在短时间内发送过多请求,网站可能会限制该 IP 的访问。解决方法可以使用代理 IP,每次请求时随机更换代理 IP,避免单个 IP 被封禁。可以通过一些代理 IP 服务提供商获取代理 IP 列表,然后在代码中使用:
proxies = {'http': 'http://your_proxy_ip:port','https': 'https://your_proxy_ip:port'
}
response = requests.get(url, headers = headers, proxies = proxies)
验证码:当网站检测到异常请求时,可能会弹出验证码要求用户验证。对于简单的验证码,可以使用一些 OCR(光学字符识别)库进行识别,如pytesseract库。但对于复杂的验证码,可能需要人工辅助或使用第三方验证码识别服务。
五、总结
通过本文的学习,我们了解了 Python 网络爬虫的基本概念、工作原理,学习了常用的爬虫库,如requests、BeautifulSoup、lxml和re库,并通过实际案例掌握了爬取网页文章内容、图片和表格数据的方法。同时,我们也认识到了反爬虫机制以及应对方法。
网络爬虫是一把双刃剑,合理使用可以帮助我们高效地获取有价值的数据,但滥用则可能带来法律风险和道德问题。在进行爬虫开发时,请务必遵守法律法规和网站的相关规定,以合法、合规、道德的方式使用这项技术。希望本文能为你在 Python 网络爬虫的学习和实践中提供有益的帮助,让你能够在数据获取的道路上迈出坚实的步伐。
相关文章:
Python 网络爬虫教程与案例详解
Python 网络爬虫教程与案例详解 在当今数字化时代,数据的价值愈发凸显。Python 作为一门强大的编程语言,在数据获取领域有着广泛的应用,其中网络爬虫便是一项重要的技术。网络爬虫能够自动从网页中提取所需数据,极大地提高了数据…...
HTTP 状态代码 501 502 问题
问题 单个客户端有时会出现 报错 501 或 502 如下: System.Net.Http.HttpRequestException: Response status code does not indicate success: 501 (Not Implemented) 分析 可以排除 服务器无法处理的问题(测试发现 一个客户端报错,不会影响…...
React 之 Redux 第二十八节 学习目标与规划大纲及概要讲述
接下来 开始Redux 全面详细的文档输出,主要基于一下几个方面,欢迎大家补充指正 一、Redux 基础概念 为什么需要 Redux? 前端状态管理的挑战(组件间通信、状态共享) Redux 解决的问题:集中式、可预测的状态…...
visual studio 2022 手工写一个简单的MFC程序
书籍:《Visual C 2017从入门到精通》的2.1.2 MFC方式中2.手工写一个简单的MFC程序 环境:visual studio 2022 内容:手工写一个简单的MFC程序 1.文件->新建->项目 2.根据以下步骤选择Windows桌面向导 3.输入项目名,选择保…...
GaussDB自带诊断工具实战指南
一、引言 GaussDB是一种分布式的关系型数据库。在数据库运维中,快速定位性能瓶颈、诊断故障是保障业务连续性的关键。GaussDB内置了多种诊断工具,结合日志分析、执行计划解析和实时监控功能,帮助开发者与运维人员高效解决问题。本文深入讲解…...
python GUI之实现一个自定义的范围滑块控件:QRangeSlider
在图形用户界面(GUI)开发中,滑块控件是一种常用于选择数值范围的交互元素。然而,很多时候默认的滑块控件无法满足复杂的交互需求,例如同时选择一个范围的起始值和结束值。为此,实现了一个自定义的范围滑块控…...
测试用例总结
一、通用测试用例八要素 1、用例编号; 2、测试项目; 3、测试标题; 4、重要级别; 5、预置条件; 6、测试输入; 7、操作步骤; 8、预期输出 二、具体分析通…...
深度学习之图像学习知识点
数据增广: 数据增广是深度学习中常用的技巧之一,主要用于增加训练数据集,让数据集尽可能的多样化,使得训练的模型具有更强的泛化能力,目前数据增广主要包括:水平/垂直翻转,旋转,缩放…...
vulnhub靶场之【digitalworld.local系列】的development靶机
前言 靶机:digitalworld.local-devt-improved,IP地址为192.168.10.10 攻击:kali,IP地址为192.168.10.6 kali采用VMware虚拟机,靶机选择使用VMware打开文件,都选择桥接网络 这里官方给的有两种方式&…...
C语言---猜数字游戏
猜数字游戏代码 #include <stdio.h> #include <time.h> #include <stdlib.h>void meun() {printf("**********************\n");printf("******* 1.play *******\n");printf("******* 0.quit *******\n");printf("*****…...
C#中泛型的协变和逆变
协变: 在泛型接口中,使用out关键字可以声明协变。这意味着接口的泛型参数只能作为返回类型出现,而不能作为方法的参数类型。 示例:泛型接口中的协变 假设我们有一个基类Animal和一个派生类Dog: csharp复制 public…...
Select 下拉菜单选项分组
使用<select>元素创建下拉菜单,并使用 <optgroup> 元素对选项进行分组。<optgroup> 元素允许你将相关的 <option> 元素分组在一起,并为每个分组添加一个标签。 <form action"#" method"post"><la…...
文件上传漏洞详细利用流程
一、了解基本术语 1、后门 像房子一样,前门后门都可以进出房子,而较之前门,后门更具有隐蔽性。电脑技术中的后门是抽象概念,意指隐蔽性高或不常用的,区别于常规操作所使用的一种出入口。现金网络后门形形色色&#x…...
蓝桥与力扣刷题(蓝桥 旋转)
题目:图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时针旋转 90 度。 我们用一个 nm的二维数组来表示一个图片,例如下面给出一个 34 的 图片的例子: 1 3 5 7 9 8 7 6 3 5 9 7 这个图片顺时针旋转…...
transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3
目录 前言 掩码张量 什么是掩码张量 掩码张量的作用 生成掩码张量实现 注意力机制 学习目标 注意力计算规则 注意力和自注意力 注意力机制 注意力机制计算规则的代码实现 多头注意力机制 学习目标 什么是多头注意力机制 多头注意力计算机制的作用 多头注意力机…...
使用DiskGenius工具来实现物理机多硬盘虚拟化迁移
使用DiskGenius工具来实现物理机多硬盘虚拟化迁移 概述准备工作注意事项实操过程记录1、Win7虚拟机,安装有两个硬盘(硬盘0和硬盘1),各分了一个区,磁盘2是一块未使用的磁盘2、运行DiskGenius程序,记录现有各…...
iOS安全和逆向系列教程 第5篇 iOS基础开发知识速览 - 理解你要逆向的目标
iOS安全和逆向系列教程 第5篇 iOS基础开发知识速览 - 理解你要逆向的目标 正如上一篇文章结尾所预告的,在完成环境搭建后,我们需要了解iOS开发的基础知识。这不是要求你成为一名iOS开发者,而是为了让你在逆向分析过程中能够理解应用的代码结…...
计算机常用单词
文章目录 计算机单词1-100101-200201-300301-400401-500501-600601-700701-800801-900901-10001001-11001101-12001201-13001301-14001401-15001501-16001601-1695 计算机单词 参考 1-100 1. file [英faɪl 美faɪl] n. 文件;v. 保存文件 2. command [英kəˈmɑ…...
TS的接口 泛型 自定义类型 在接口中定义一个非必须的属性
TS的接口 泛型 自定义类型 接口 新建一个ts文件,在里面定义一个接口 export interface PersonInter{id:string,name:string,age:number }在vue文件中引入这个ts文件 <script lang"ts" setup name"Person">import {type PersonInter} …...
76.读取计时器运行时间 C#例子 WPF例子
TimerManager:一个增强的定时器类,带时间管理功能 在使用定时器时,我们常常需要知道定时器的运行状态,比如它已经运行了多久,或者还剩下多少时间。然而,.NET 的 System.Timers.Timer 类本身并没有直接提供…...
React封装通用Table组件,支持搜索(多条件)、筛选、自动序号、数据量统计等功能。未采用二次封装调整灵活,包含使用文档
封装通用组件 一、封装思想二、react代码三、css代码四、实现效果五、使用文档 BasicTableModal 表格模态框组件1.组件简介2.功能特点3.使用方法基础用法宽度控制示例带筛选功能搜索功能示例自定义单元格渲染 4.API 说明PropsColumn 配置项Filter 配置项 5.注意事项 一、封装思…...
【JavaEE】-- 多线程(初阶)4
文章目录 8.多线程案例8.1 单例模式8.1.1 饿汉模式8.1.2 懒汉模式 8.2 阻塞队列8.2.1 什么是阻塞队列8.2.2 生产者消费者模型8.2.3 标准库中的阻塞队列8.2.4 阻塞队列的应用场景8.2.4.1 消息队列 8.2.5 异步操作8.2.5 自定义实现阻塞队列8.2.6 阻塞队列--生产者消费者模型 8.3 …...
WP 高级摘要插件:助力 WordPress 文章摘要精准自定义显示
wordpress插件介绍 “WP高级摘要插件”功能丰富,它允许用户在WordPress后台自定义文章摘要。 可设置摘要长度,灵活调整展示字数;设定摘要最后的显示字符, 如常用的省略号等以提示内容未完整展示;指定允许在摘要中显示…...
论文阅读 EEG-Inception
EEG-Inception: A Novel Deep Convolutional Neural Network for Assistive ERP-Based Brain-Computer Interfaces EEG-Inception是第一个集成Inception模块进行ERP检测的模型,它有效地结合了轻型架构中的其他结构,提高了我们方法的性能。 本研究的主要目…...
FFmpeg入门:最简单的音频播放器
FFmpeg入门:最简单的音频播放器 欢迎大家来到FFmpeg入门的第二章,今天只做一个最简单的FFmpeg音频播放器;同样,话不多说,先上流程图 流程图 以上流程和视频播放器的解码过程基本上是一致的; 不同点在于 S…...
物联网感应层数据采集器实现协议转换 数据格式化
数据采集器的核心功能实现涉及多个技术层面的协同工作,以下是各模块的详细实现解析: 协议转换实现 协议解析引擎:采用插件式架构,例如: P r o t o c o l P a r...
基于Linux系统的物联网智能终端
背景 产品研发和项目研发有什么区别?一个令人发指的问题,刚开始工作时项目开发居多,认为项目开发和产品开发区别不大,待后来随着自身能力的提升,逐步感到要开发一个好产品还是比较难的,我认为项目开发的目的…...
8.1.STM32_OLED
4.STM32_OLED 跟着江协科大的视频,无法点亮OLED屏幕解决办法 每个人使用的0.96寸OLED屏幕信号不一样,存在很多兼容性问题 归根结底就是驱动的问题! 本人的OLED是SSD1306,在淘宝店铺找了驱动文件后成功点亮,示例见文末 请针对自…...
Netty笔记9:粘包半包
Netty笔记1:线程模型 Netty笔记2:零拷贝 Netty笔记3:NIO编程 Netty笔记4:Epoll Netty笔记5:Netty开发实例 Netty笔记6:Netty组件 Netty笔记7:ChannelPromise通知处理 Netty笔记8…...
【算法方法总结·三】滑动窗口的一些技巧和注意事项
【算法方法总结三】滑动窗口的一些技巧和注意事项 【算法方法总结一】二分法的一些技巧和注意事项【算法方法总结二】双指针的一些技巧和注意事项【算法方法总结三】滑动窗口的一些技巧和注意事项 【滑动窗口】 数组的和 随着 右边指针 移动一定是 非递减 的,就是 …...
