Skip to content

Python 爬虫编程

网络爬虫(Web Crawler),也称为网络蜘蛛(Web Spider),是一种自动浏览万维网的程序。它们被广泛用于各种目的,最常见的是搜索引擎进行网页索引,但也可用于数据挖掘、在线价格监控、市场研究等。

Python 凭借其强大的库生态系统,成为编写网络爬虫的首选语言之一。

爬虫的基本原理

一个基本的网络爬虫通常遵循以下步骤:

  1. 发送请求 (Fetch): 爬虫向一个起始 URL 发送 HTTP 请求,获取该页面的 HTML 内容。
  2. 解析内容 (Parse): 爬虫解析返回的 HTML,提取出所需的数据和页面中包含的其他 URL。
  3. 存储数据 (Store): 将提取出的数据存储到数据库、文件或其他存储系统中。
  4. 跟进链接 (Follow Links): 将新发现的 URL 添加到待抓取的队列中,然后重复以上过程。

核心库

构建一个简单的爬虫通常需要两个核心功能的库:

  1. HTTP 请求库: 用于向服务器发送请求并获取网页内容。requests 是最流行和用户友好的选择。
  2. HTML 解析库: 用于从复杂的 HTML 文本中提取所需信息。Beautiful Souplxml 是最常用的组合。

首先,你需要安装这些库:

bash
pip install requests beautifulsoup4 lxml

示例:爬取一个简单网页的标题

下面是一个简单的例子,演示如何使用 requestsBeautiful Soup 来获取一个网页的标题。

python
import requests
from bs4 import BeautifulSoup

# 1. 定义目标 URL
url = 'http://example.com/'

# 2. 发送 HTTP GET 请求
# 添加 headers 模拟浏览器行为,可以避免一些基本的反爬虫措施
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.36'
}
try:
    response = requests.get(url, headers=headers)
    # 检查请求是否成功
    response.raise_for_status() # 如果状态码不是 2xx,会引发 HTTPError

    # 3. 使用 Beautiful Soup 解析 HTML
    # 'lxml' 是一个高效的解析器
    soup = BeautifulSoup(response.text, 'lxml')

    # 4. 提取数据
    # soup.find() 方法可以根据标签名、CSS 类等查找元素
    title_tag = soup.find('h1')
    if title_tag:
        print(f"网页标题是: {title_tag.text.strip()}")
    else:
        print("未找到 <h1> 标题")

except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")

爬虫的挑战与道德规范

编写爬虫时,你会遇到许多挑战:

  • 反爬虫技术: 许多网站会采取措施来阻止爬虫,例如:
    • 检查 User-Agent 头。
    • 使用 CAPTCHA (验证码)。
    • 动态加载内容 (使用 JavaScript),这需要更复杂的工具如 SeleniumPlaywright 来模拟浏览器行为。
    • IP 地址封禁。
  • 网站结构变化: 网站可能会更新其 HTML 结构,导致你的解析代码失效。

爬虫礼仪与法律风险:

  • 遵守 robots.txt: 这是一个网站根目录下的文件,规定了爬虫可以访问和不可以访问的页面。在爬取前务必检查并遵守它。
  • 降低抓取频率: 不要过于频繁地请求一个网站,否则可能会给对方服务器带来过大压力,导致你的 IP 被封禁。在请求之间加入适当的延时 (time.sleep()) 是一个好习惯。
  • 尊重版权和隐私: 不要抓取、使用或分发受版权保护或包含个人隐私的数据。

高级爬虫框架: Scrapy

对于大型、复杂的爬虫项目,从头构建所有组件会很耗时。Scrapy 是一个功能强大的、异步的 Python 爬虫框架,它为你处理了大量底层工作。

Scrapy 的优势:

  • 异步处理: 基于 Twisted 框架,可以高效地处理大量并发请求。
  • 内置架构: 提供了清晰的项目结构,包括 Spiders, Items, Pipelines, Middlewares 等组件,使代码更具模块化和可扩展性。
  • 自动处理: 内置了许多常见功能,如 Cookie 管理、代理、User-Agent 轮换等。

学习 Scrapy 是构建工业级爬虫的下一步。

本站内容仅供学习和研究使用。