Python 爬虫入门指南
爬虫技术本质是通过编程自动从网页获取信息。简单来说,当你打开网页查看源代码时,看到的 HTML 结构就是爬虫工作的对象。它像一位不知疲倦的机器人,帮你阅读并提取这些内容。
本文将带你从零开始编写 Python 爬虫,即使是编程新手也能理解核心逻辑。
一、爬虫的基本流程
一个标准的爬虫工作流通常包含三个步骤:
- 发送请求:向目标网页发起 HTTP 请求,获取原始内容。
- 解析网页:从返回的 HTML 或 JSON 中提取你需要的数据。
- 保存数据:将提取到的信息写入文件或数据库,方便后续分析。
二、常用爬虫库
在 Python 生态中,开发爬虫主要依赖以下两个库:
- requests:负责发送网络请求,获取网页源码。
- BeautifulSoup:用于解析 HTML,快速定位和提取标签内的数据。
安装依赖
在终端执行以下命令即可安装(使用清华源加速):
pip install requests beautifulsoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple
三、简单爬虫实战
我们从一个具体的例子入手,抓取百度首页的信息。
1. 获取网页内容
首先使用 requests 获取页面源码。注意,直接打印 response.text 会看到大量 HTML 代码,这就是页面的结构。
import requests
url = 'https://www.baidu.com'
response = requests.get(url)
print(response.text)
2. 解析网页内容
拿到源码后,用 BeautifulSoup 解析 HTML,提取标题。
from bs4 import BeautifulSoup
# 初始化解析器
soup = BeautifulSoup(response.text, 'html.parser')
# 获取标题文本
title = soup.title.text
print('网页标题:', title)
运行结果类似:
网页标题:百度一下,你就知道
3. 提取更多链接
除了标题,我们还可以遍历所有 <a> 标签,提取网站内的链接。这在抓取文章列表时非常有用。
links = soup.find_all('a')
for link in links:
href = link.get('href')
if href: # 过滤空链接
print(href)
这里加了一个简单的判断,避免打印出空的 None 值,实际项目中建议根据需求做更精细的清洗。
四、爬虫分类与进阶
1. 静态网页爬虫
如果数据直接写在 HTML 里,上面的方法就足够了。这是最基础的爬虫类型。
2. 动态网页处理
很多现代网站的数据是通过 JavaScript 动态加载的,HTML 源码里可能没有最终内容。这时需要模拟浏览器行为,Selenium 是常用的选择。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.example.com')
print(driver.title)
driver.quit()
注意:使用 Selenium 前需确保本地已配置好 ChromeDriver 驱动路径。
3. 大规模爬取框架
当任务量变大,需要高并发和异步处理时,推荐使用 Scrapy 框架。它内置了中间件、管道等组件,适合构建复杂的爬虫系统。
pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
五、应对反爬机制
网站为了防止数据被滥用,通常会设置一些防御措施。以下是几种常见的应对方案。
1. 伪装请求头
默认情况下,Python 的请求头会被识别为脚本。添加 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)
2. 控制访问频率
频繁请求容易触发 IP 封禁。使用 time.sleep() 设置延迟是必要的。
import time
time.sleep(2) # 每次请求间隔 2 秒
3. 使用代理 IP
如果单个 IP 被封,可以使用代理池切换出口地址。
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'https://10.10.1.10:1080',
}
response = requests.get(url, proxies=proxies)
六、数据存储
提取到的数据通常需要持久化存储,CSV 和数据库是最常见的两种形式。
1. 保存到 CSV
适合轻量级数据导出。
import csv
with open('data.csv', 'w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(['标题', '链接']) # 表头
for link in links:
writer.writerow([link.text, 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.text, link.get('href')))
conn.commit()
conn.close()
七、总结
爬虫的核心在于理解 HTTP 协议与 HTML 结构。通过 requests 和 BeautifulSoup 可以快速上手静态页面;遇到动态渲染可转向 Selenium;大规模任务则考虑 Scrapy。同时,合理设置请求头、延迟和代理是保证爬虫稳定运行的关键。掌握这些基础,你就能开始构建自己的数据采集工具了。

