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.string
  print(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 网络爬虫的基本概念、工作原理,学习了常用的爬虫库,如requestsBeautifulSouplxmlre库,并通过实际案例掌握了爬取网页文章内容、图片和表格数据的方法。同时,我们也认识到了反爬虫机制以及应对方法。

网络爬虫是一把双刃剑,合理使用可以帮助我们高效地获取有价值的数据,但滥用则可能带来法律风险和道德问题。在进行爬虫开发时,请务必遵守法律法规和网站的相关规定,以合法、合规、道德的方式使用这项技术。希望本文能为你在 Python 网络爬虫的学习和实践中提供有益的帮助,让你能够在数据获取的道路上迈出坚实的步伐。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP fastadmin 学习

安装php环境安装mysql插件 修改 php.ini下载 phpstudy、fastadmin 错误 安装FastAdmin could not find driver 参考链接 安装插件 创建1.php <? phpinfo(); ?>运行 http://127.0.0.1/1.php 查看 POD 页面访问404 伪静态 Apache <IfModule mod_rewrite.c> O…

PARETO PROMPT OPTIMIZATION

题目 帕累托提示优化 论文地址&#xff1a;https://openreview.net/forum?idHGCk5aaSvE 摘要 自然语言迅速优化或及时工程已成为一种强大的技术&#xff0c;可以解锁大型语言模型&#xff08;LLMS&#xff09;的各种任务的潜力。尽管现有方法主要集中于最大化LLM输出的单一特…

Agent智能体是什么?

文章目录 一、Agent的起源与发展1.1时间线1.2核心驱动力 二、Agent的定义与架构2.1基本定义2.2典型结构&#xff08;以GPTs为例&#xff09; 三、OpenAI的Agent演进路径3.1关键阶段3.2技术支撑3.3 GPTs生态经济模型 四、其他Agent平台对比五、Agent实践案例5.1文本处理自动化5.…

【Linux第三弹】Linux基础指令 (下)

目录 &#x1f31f;1.find指令 1.1find使用实例 ​编辑 &#x1f31f;2.which指令 &#x1f31f;3.grep指令 3.1grep使用实例 &#x1f31f; 4.zip/unzip指令 4.1 zip/unzip使用实例 &#x1f31f;5.tar指令 5.1 tar使用实例 &#x1f31f;6.完结 很庆幸走在自己…

【Laplacian边缘检测详解】

Laplacian边缘检测详解 目录 Laplacian边缘检测详解一. 定义二. 原理三. 特点四. 使用技巧五. MATLAB示例代码示例1&#xff1a;基本Laplacian边缘检测示例2&#xff1a;扩展Laplacian核的使用示例3&#xff1a;与Sobel边缘检测的比较示例4&#xff1a;检测图像中的文字边缘示例…

为什么要学习数据结构与算法

今天&#xff0c;我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心&#xff0c;更是每一位开发者从“小白”迈向“高手”的必经之路。 1、为什么要学习数据结构与算法 总的来说&#xff0c;数据结构与算法是&#xff1a; 求职的“敲门砖”…

【第13节】C++设计模式(行为模式)-Template(模板)模式

一、问题的提出 Template 模式&#xff1a;算法步骤框架与细节实现的分离 假设我们正在开发一个文档处理系统&#xff0c;需要支持多种文档格式的导出&#xff08;如 PDF、Word、HTML 等&#xff09;。每种文档格式的导出过程大致相同&#xff0c;都包含以下步骤&#xff1a; …

安卓binder驱动内核日志调试打印开放及原理(第一节)

背景&#xff1a; 经常有学员朋友在做系统开发时候&#xff0c;有时候遇到binder相关的一些问题&#xff0c;这个时候可能就需要比较多的binder相关日志&#xff0c;但是正常情况下这些binder通讯的的内核日志都是没有的打印的&#xff0c;因为经常binder通讯太过于频繁&#…

uniapp 常用 UI 组件库

1. uView UI 特点&#xff1a; 组件丰富&#xff1a;提供覆盖按钮、表单、图标、表格、导航、图表等场景的内置组件。跨平台支持&#xff1a;兼容 App、H5、小程序等多端。高度可定制&#xff1a;支持主题定制&#xff0c;组件样式灵活。实用工具类&#xff1a;提供时间、数组操…

Gpt翻译完整版

上一篇文章收到了很多小伙伴的反馈&#xff0c;总结了一下主要以下几点&#xff1a; 1. 说不知道怎么调api 2. 目前只是把所有的中文变成了英文&#xff0c;如果想要做多语言还需要把这些关键字提炼出来成放到message_zh.properties和message_en.properties文件中&#xff0c…

【MATLAB例程】三维下的IMM(交互式多模型),模型使用CV(匀速)、CT(匀速转弯)和CA(匀加速),滤波使用EKF。附完整代码

本文介绍一个三维IMM(Interacting Multiple Model)算法,该算法用于目标跟踪,结合了不同运动模型(匀速、匀加速和转弯)。代码使用MATLAB编写,包含仿真、模型预测和结果可视化。订阅专栏后,可直接获得完整代码 文章目录 运行结果完整代码代码解析1. 初始化环境2. 仿真参数…

未来经济范式争夺战:AR眼镜为何成为下一代交互终端的制高点?

未来经济范式争夺战&#xff1a;AR眼镜为何成为下一代交互终端的制高点&#xff1f; 在蒸汽机轰鸣的工业革命时代&#xff0c;煤炭、铁路、电报构建了第一个现代经济范式&#xff1b;互联网时代&#xff0c;电力、光纤、物流网络重构了全球经济版图。当前&#xff0c;我们正站…

【Python爬虫】爬取公共交通路网数据

程序来自于Github&#xff0c;以下这篇博客作为完整的学习记录&#xff0c;也callback上一篇爬取公共交通站点的博文。 Bardbo/get_bus_lines_and_stations_data_from_gaode: 这个项目是基于高德开放平台和公交网获取公交线路及站点数据&#xff0c;并生成shp文件&#xff0c;…

如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档

将飞书的多维表格与DeepSeek R1结合使用&#xff0c;就像为你的数据管理和分析之旅装上一台涡轮增压器。两者的合作&#xff0c;不仅仅在速度上让人耳目一新&#xff0c;更是将智能化分析带入了日常的工作场景。以下是它们如何相辅相成并改变我们工作方式的一些分享。 --- 在…

一周学会Flask3 Python Web开发-在模板中渲染WTForms表单视图函数里获取表单数据

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 为了能够在模板中渲染表单&#xff0c;我们需要把表单类实例传入模板。首先在视图函数里实例化表单类LoginForm&#xff0c;然…

阿里通义万相2.1模型在亚马逊云科技ECS容器中的私有化部署

本文将主要介绍同义万相v2.1视频生成模型的在AWS上部署的初步测试 通义万相AI模型介绍 通义万相模型是阿里云负责大规模生成式模型的团队&#xff0c;最近发布了通义万相2.1(以下称Wan 2.1)&#xff0c;这是一个“全面开源的视频基础模型套件&#xff0c;突破了视频生成的边界…

苍穹外卖-阿里云OSS文件上传

苍穹外卖-阿里云OSS文件上传 一、阿里云OSS简介**获取AccessKey**获取enpoint 二、代码实现1 引入依赖2 定义OSS相关配置2.1 application-dev.yml2.2 application.yml 3 读取OSS配置3.1 AliOssProperties 4 生成OSS工具类对象4.1 AliOssUtil4.2 OssConfiguration2.5 CommonCont…

8.路由原理专题

路由器数据转发原理&#xff0c;路由表、FIB、快速转发表的关系 路由的控制平面与转发平面 控制平面:负责路由计算,维护;路由协议运行在控制平面 转发平面:进行数据包的封装,报文转发,路由表,FIB表,快速转发表等 控制平面与转发平面相互独立又协同工作 路由器检查数据包的目…

详细分析KeepAlive的基本知识 并缓存路由(附Demo)

目录 前言1. 基本知识2. Demo2.1 基本2.2 拓展2.3 终极 3. 实战 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 基本知识推荐阅读&#xff1a;KeepAlive知识点 从实战中学习&#xff0c;源自实战中vue路由的…

Free Auto Clicker - 在任意位置自动重复鼠标点击

“想让鼠标自己动起来&#xff0c;解放双手去做更有趣的事&#xff1f;”Free Auto Clicker 就像你的数字小助手&#xff0c;能在任意位置自动重复点击鼠标。从玩游戏到刷网页&#xff0c;这款免费工具让你告别枯燥的重复操作&#xff0c;效率瞬间起飞&#xff01; 你有没有想…