爬虫是通过编程自动从网页获取信息的技术。简单来说,当你打开网页查看源代码时,看到的 HTML 结构就是爬虫工作的对象,它像一位机器人帮你阅读并提取这些内容。
本文将带你从零开始编写 Python 爬虫,即使是零基础也能理解核心逻辑。
一、爬虫的基本流程
整个流程可以概括为三个步骤:
- 发送请求:向目标网页发起 HTTP 请求,获取原始内容。
- 解析网页:从返回的 HTML 或 JSON 数据中提取所需信息。
- 保存数据:将提取到的数据写入文件或数据库,便于后续分析。
二、常用工具库
在 Python 生态中,开发爬虫主要依赖以下两个库:
- requests:负责发送网络请求,获取网页源码。
- BeautifulSoup:用于解析 HTML 文档,快速定位和提取标签。
安装依赖
在终端执行以下命令即可安装(推荐使用国内镜像加速):
pip install requests beautifulsoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple
三、静态页面抓取实战
我们先从一个简单的例子入手,抓取百度首页的内容。
1. 获取网页源码
使用 requests 发送 GET 请求,拿到响应对象后直接读取文本。
import requests
url = 'https://www.baidu.com'
response = requests.get(url)
# 确保编码正确,避免中文乱码
response.encoding = response.apparent_encoding
print(response.text)
这里 response.text 包含了完整的 HTML 代码。实际开发中,建议设置 encoding 属性来防止中文显示异常。
2. 解析 HTML 内容
拿到源码后,用 BeautifulSoup 构建解析树,提取我们关心的数据,比如标题。
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.title.string if soup.title else ''
print(f'网页标题:{title}')
注意,soup.title.string 比 .text 更稳健,能处理一些嵌套标签的情况。
3. 批量提取链接
如果想抓取页面上的所有文章链接,可以遍历所有的 <a> 标签。
links = soup.find_all('a')
for link in links:
href = link.get('href')
text = link.get_text(strip=True)
if href and not href.startswith('#'):
print(f'{text}: {href}')
这里过滤了以 # 开头的锚点链接,只保留有效跳转地址,同时去除了文本首尾空格。
四、动态页面与反爬策略
有些网站的数据是 JavaScript 动态渲染的,HTML 源码里看不到完整内容。这时需要用到 Selenium 模拟浏览器行为。
1. 使用 Selenium
Selenium 可以控制真实浏览器,执行点击、滚动等操作后再获取页面。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.example.com')
print(driver.title)
driver.quit()
安装驱动前请确保本地已配置好 Chrome 环境。
2. 应对反爬机制
生产环境中,网站通常会设置反爬策略,我们需要针对性处理:
- 伪装请求头:很多服务器会检查 User-Agent,伪造浏览器标识可绕过简单检测。
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers)
- 控制访问频率:频繁请求容易触发 IP 封禁,加入随机延迟是必要的。
import time
import random
time.sleep(random.uniform(1, 3))
- 代理 IP:如果单 IP 被封,可以使用代理池轮换请求来源。
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'https://10.10.1.10:1080'
}
response = requests.get(url, proxies=proxies)
五、数据存储方案
数据抓下来后,通常有两种存储方式:文件记录或数据库持久化。
1. CSV 文件
适合轻量级数据导出,直接用 Python 内置 csv 模块即可。
import csv
with open('data.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['标题', '链接'])
for link in links:
writer.writerow([link.get_text(strip=True), link.get('href')])
2. SQLite 数据库
适合结构化数据的长期管理,支持查询和事务。
import sqlite3
conn = sqlite3.connect('data.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS links (
title TEXT,
href TEXT
)
''')
for link in links:
cursor.execute(
'INSERT INTO links (title, href) VALUES (?, ?)',
(link.get_text(strip=True), link.get('href'))
)
conn.commit()
conn.close()
使用参数化查询 (?) 能有效防止 SQL 注入风险。
六、总结
爬虫开发的核心在于理解 HTTP 协议与 DOM 结构。基础场景下 requests + BeautifulSoup 足够高效;遇到动态加载需引入 Selenium;大规模任务则考虑 Scrapy 框架。同时,务必遵守目标网站的 robots 协议,合理控制请求频率,保持对数据的尊重与合规性。

