跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

Python 爬虫核心技术原理与实战解析

综述由AI生成Python 爬虫的基础原理、HTTP 请求响应机制、网页解析技术(正则、XPath、BeautifulSoup)、常用框架(Scrapy、Selenium)以及反爬虫应对策略。通过实例演示了数据提取与存储流程,并强调了遵守网站协议和法律法规的重要性。

战神发布于 2025/2/7更新于 2026/5/2819 浏览
Python 爬虫核心技术原理与实战解析

导言

随着互联网的发展,大量的数据被存储在网络上,而我们需要从中获取有用的信息。Python 作为一种功能强大且易于学习的编程语言,被广泛用于网络爬虫的开发。本文将详细介绍 Python 爬虫所需的技术及其原理,并提供相关的代码案例。

1. HTTP 请求与响应

在爬取网页数据之前,我们需要了解 HTTP 协议,它是在 Web 上进行数据交互的基础协议。HTTP 请求与响应是爬虫工作的基础,我们需要了解它们的结构和交互方式。

1.1 HTTP 请求

HTTP 请求由请求行、请求头和请求体组成。其中,请求行包括请求方法、请求的 URL 和协议版本;请求头包含了用于描述请求的各种信息;请求体是可选项,用于传输请求的数据。下面是一个 HTTP 请求的示例:

GET /path/to/resource HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
...

在 Python 中,我们可以使用 requests 库发送 HTTP 请求。下面是一个使用 requests 库发送 GET 请求的示例代码:

import requests

url = 'http://www.example.com'
try:
    response = requests.get(url, timeout=5)
    print(response.text)
except Exception as e:
    print(f"Request failed: {e}")
1.2 HTTP 响应

HTTP 响应由响应行、响应头和响应体组成。响应行包含了响应的状态码和状态消息;响应头包含了用于描述响应的各种信息;响应体是实际返回的数据。下面是一个 HTTP 响应的示例:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1234
...
<html>
...
</html>

在 Python 中,我们可以使用 requests 库获取 HTTP 响应。下面是一个获取 HTTP 响应的示例代码:

import requests

url = 'http://www.example.com'
try:
    response = requests.get(url)
    print(response.status_code)
    print(response.headers)
    print(response.text)
except Exception as e:
    print(f"Error: {e}")

2. 网页解析技术

爬虫需要从网页中提取有用的数据,而网页通常采用 HTML 或 XML 格式存储。为了解析网页,我们可以使用以下几种技术。

2.1 正则表达式

正则表达式是一种强大的文本匹配技术,我们可以使用它来提取网页中的数据。例如,我们可以使用正则表达式提取 HTML 中的所有链接。

下面是一个使用正则表达式提取 HTML 中的链接的示例代码:

import re

html = '<a href="http://example.com">Example</a>'
links = re.findall(r'<a href="([^"]+)">([^<]+)</a>', html)
for link in links:
    print(link[0], link[1])
2.2 XPath

XPath 是一种用于在 XML 文档中定位节点的语言,它可以与 HTML 文档一样使用。我们可以使用 XPath 提取网页中的数据。例如,我们可以使用 XPath 提取 HTML 中的所有链接。

下面是一个使用 XPath 提取 HTML 中的链接的示例代码(需要使用 lxml 库):

from lxml import etree

html = '<a href="http://www.example.com">Example</a>'
tree = etree.HTML(html)
links = tree.xpath('//a')
for link in links:
    print(link.get('href'), link.text)
2.3 BeautifulSoup

BeautifulSoup 是一个 HTML 和 XML 解析库,提供了简单灵活的 API。我们可以使用 BeautifulSoup 解析网页并提取数据。

下面是一个使用 BeautifulSoup 解析 HTML 并提取链接的示例代码(需要使用 beautifulsoup4 库):

from bs4 import BeautifulSoup

html = '<a href="http://www.example.com">Example</a>'
soup = BeautifulSoup(html, 'html.parser')
links = soup.find_all('a')
for link in links:
    print(link.get('href'), link.text)
2.4 提取数据

有了解析后的 HTML 内容,我们可以根据具体的需求,使用 CSS 选择器或 XPath 表达式来定位和提取所需的数据。

下面示范了使用 BeautifulSoup 提取网页中所有超链接的代码:

links = soup.select('a')
for link in links:
    href = link['href']
    text = link.get_text()
    print(href, text)

在这个示例中,我们使用 soup.select() 方法配合 CSS 选择器字符串 'a',选取网页中所有的 <a> 标签。然后使用 link['href'] 和 link.get_text() 分别提取超链接的 URL 和文字内容。

2.5 数据存储与再处理

爬虫获取到数据后,通常需要将其保存起来供后续处理和分析。常见的存储方式有保存为文件(如 CSV、JSON 格式),或者存储到数据库中。

以下是一个使用 csv 库将提取的数据保存为 CSV 文件的示例代码:

import csv

data = [['url', 'text'], [href, text]]
with open('output.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerows(data)

在这个示例中,我们首先准备好要保存的数据 data,其中包含了提取到的 URL 和文字内容。然后使用 csv.writer() 和 writerows() 方法将数据写入到 CSV 文件中。

3. 爬虫框架

在实际的爬虫开发中,我们通常会使用一些爬虫框架,它们提供了更高级别的抽象和更方便的功能。以下是一些常用的 Python 爬虫框架。

3.1 Scrapy

Scrapy 是一个快速、可扩展且高级别的 Web 爬取框架。它提供了强大的抓取功能和数据处理能力,使爬虫开发更加高效。下面是一个使用 Scrapy 爬取网页的示例代码:

import scrapy

class MySpider(scrapy.Spider):
    name = 'example.com'
    start_urls = ['http://www.example.com']

    def parse(self, response):
        # 处理响应
        # 提取数据
        # 发送更多请求
        pass
3.2 BeautifulSoup + requests

BeautifulSoup 和 requests 的组合是另一种常用的爬虫开发方式。使用 BeautifulSoup 解析网页,使用 requests 发送 HTTP 请求。

下面是一个使用 BeautifulSoup 和 requests 爬取网页的示例代码:

import requests
from bs4 import BeautifulSoup

url = 'http://www.example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 处理页面,提取数据
3.3 Selenium

Selenium 是一种自动化浏览器工具,可以模拟浏览器行为。它通常与浏览器驱动一起使用,如 ChromeDriver。使用 Selenium 可以解决一些 JavaScript 渲染的网页爬取问题。

下面是一个使用 Selenium 模拟浏览器爬取网页的示例代码(需要使用 selenium 库):

from selenium import webdriver

driver = webdriver.Chrome('path/to/chromedriver')
driver.get('http://www.example.com')
# 处理页面,提取数据
driver.quit()

4. 其他关键技术

除了了解基本的爬虫工作原理,还需要掌握一些相关的技术,以便更好地应对各种复杂情况。下面是几个常用的技术要点:

4.1 User-Agent 伪装

为了防止网站屏蔽爬虫,我们可以在发送 HTTP 请求时设置 User-Agent 头部,将其伪装成浏览器的请求。这样可以减少被服务器识别为爬虫的概率。

Python requests 库可以通过设置 headers 参数来添加自定义的 HTTP 头部。

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, headers=headers)
4.2 反爬虫策略与解决方法

为了防止被爬虫抓取数据,网站可能会采取一些反爬虫策略,如限制请求频率、设置验证码、使用动态加载等。对于这些情况,我们可以采取以下解决方法:

  1. 限制请求频率:可以通过设置合适的时间间隔来控制请求的频率,避免过快访问网站。使用 time.sleep() 函数。
  2. 验证码识别:可以使用第三方的验证码识别库(如 Tesseract-OCR)来自动识别并输入验证码。
  3. 动态加载页面:对于使用 JavaScript 动态加载的页面,可以使用 Selenium 库模拟浏览器行为进行处理。
  4. 代理 IP 池:当遇到 IP 被封禁时,可以使用代理 IP 池来切换出口 IP。
4.3 网页登录与 Session 管理

有些网站需要登录后才能获取到所需的数据。在这种情况下,我们可以通过模拟登录行为,发送 POST 请求并记录登录后的 Session 信息,以便后续的数据访问。

下面是一个使用 requests 库模拟登录的示例代码:

import requests

login_url = 'https://example.com/login'
data = {
    'username': 'your_username',
    'password': 'your_password'
}
response = requests.post(login_url, data=data)
session = response.cookies

data_url = 'https://example.com/data'
response = requests.get(data_url, cookies=session)
data = response.text

在这个示例中,我们首先发送 POST 请求模拟登录,将用户名和密码作为表单数据 data 发送给登录页面 login_url,并保存返回的 Session 信息。

然后我们可以使用 requests.get() 方法发送 GET 请求,同时将保存的 Session 信息作为 cookies 参数传入,以便获取登录后的数据。

4.4 Robots 协议与合规性

在编写爬虫时,必须遵守目标网站的 robots.txt 协议。该文件定义了哪些页面允许爬虫抓取,哪些禁止抓取。忽略此协议可能导致法律风险或 IP 被封禁。

建议在发起请求前检查 https://domain.com/robots.txt,确保不违反网站的抓取规则。

5. 实例:爬取简书网站文章信息

为了更好地演示 Python 爬虫的技术和原理,我们选取了简书网站作为示例。我们将爬取简书网站中的热门文章列表,提取出每篇文章的标题、作者和链接。

以下是完整的实现代码:

import requests
from bs4 import BeautifulSoup
import time

# 发送 HTTP 请求
url = 'https://www.jianshu.com'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
try:
    response = requests.get(url, headers=headers, timeout=10)
    html = response.text
except Exception as e:
    print(f"Failed to fetch page: {e}")
    exit()

# 解析 HTML 内容
soup = BeautifulSoup(html, 'html.parser')

# 提取数据
articles = soup.select('.note-list li')
data = []

for article in articles:
    try:
        title_elem = article.select('a.title')[0]
        author_elem = article.select('.name')[0]
        
        title = title_elem.string.strip() if title_elem.string else ''
        author = author_elem.string.strip() if author_elem.string else ''
        href = 'https://www.jianshu.com' + title_elem['href']
        
        data.append([title, author, href])
    except IndexError:
        continue
    time.sleep(1)  # 控制请求频率

# 数据存储
import csv
with open('jianshu_articles.csv', 'w', newline='', encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerow(['Title', 'Author', 'Link'])
    writer.writerows(data)
print("Data saved successfully.")

在这个示例中,我们首先发送 GET 请求获取简书网站的 HTML 内容,然后使用 BeautifulSoup 库进行解析。

接着,我们使用 CSS 选择器字符串 .note-list li 选取所有文章的外层容器,并使用 CSS 选择器和字典键值对的方式提取文章的标题、作者和链接。

最后,我们采用 CSV 格式将提取的数据保存到了名为 jianshu_articles.csv 的文件中,并添加了简单的错误处理和延时机制。

结语

本文详细介绍了 Python 爬虫所需的技术及其原理,包括 HTTP 请求与响应、网页解析技术和爬虫框架。通过掌握这些技术,我们可以有效地开发出强大且高效的 Python 爬虫。希望本文能对你理解和掌握 Python 爬虫有所帮助。

请注意,在进行网络爬虫时,需要遵守网站的使用条款,并遵守相关法律法规。同时,合理使用爬虫技术,不对网络资源进行滥用和破坏。

目录

  1. 导言
  2. 1. HTTP 请求与响应
  3. 1.1 HTTP 请求
  4. 1.2 HTTP 响应
  5. 2. 网页解析技术
  6. 2.1 正则表达式
  7. 2.2 XPath
  8. 2.3 BeautifulSoup
  9. 2.4 提取数据
  10. 2.5 数据存储与再处理
  11. 3. 爬虫框架
  12. 3.1 Scrapy
  13. 3.2 BeautifulSoup + requests
  14. 处理页面,提取数据
  15. 3.3 Selenium
  16. 处理页面,提取数据
  17. 4. 其他关键技术
  18. 4.1 User-Agent 伪装
  19. 4.2 反爬虫策略与解决方法
  20. 4.3 网页登录与 Session 管理
  21. 4.4 Robots 协议与合规性
  22. 5. 实例:爬取简书网站文章信息
  23. 发送 HTTP 请求
  24. 解析 HTML 内容
  25. 提取数据
  26. 数据存储
  27. 结语
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 如何利用 AI 大模型解决实际问题:实战案例与操作指南
  • Stable Diffusion XL 提示词增强工具:SDXL Prompt Styler 使用指南
  • C++逆向工程:用c++filt解析GCC编译后的函数名
  • 2026 AI 编码工具终局:Claude Code、Cursor、Copilot 深度对比与选型
  • Python 实现 VisionTransformer(ViT)在时间序列行为识别中的应用
  • 从三年前端到韩国读研:我的得失与回归前端的思考
  • 研究发现思维链(CoT)在某些任务中会降低大模型准确率
  • LeetCode 1576 替换所有问号和 495 提莫攻击:模拟算法实战解析
  • OpenClaw 公网访问实战:借助 cpolar 突破局域网限制
  • NeurIPS 2019 数据分析:投稿量增长与审稿机制探讨
  • ROS1 与 ROS2 桥接器完整指南:实现跨版本机器人通信
  • 基于 U-Net 的扩散模型训练与图像生成实践
  • DeepSeek 开源 Janus-Pro 统一多模态模型,7B 版本性能显著增强
  • JavaShop 新零售电商系统核心优势与功能解析
  • 得物潮鞋价格波动监控系统实战:爬虫开发与数据可视化
  • 计算机视觉面试题精讲:核心算法与代码实现
  • AI 驱动视频处理与智算革新:智能视频技术解析
  • 网络安全入门教程与学习路线规划
  • Web-Check 结合 cpolar 实现远程网站安全检测
  • RAG(检索增强生成) 核心概念与架构解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online