爬虫技术本质是通过编程自动获取网页信息。当你打开网页查看源代码时,那些 HTML 结构就是爬虫的目标对象。它像一位不知疲倦的机器人,帮你阅读并提取网页内容。
一、爬虫的基本流程
整个流程其实很直观,主要分为三步:
- 发送请求:向目标网页发起 HTTP 请求,拿到原始内容。
- 解析网页:从返回的 HTML 或 JSON 中定位并提取所需数据。
- 保存数据:将清洗后的信息写入文件或数据库,方便后续处理。
二、核心工具库
Python 生态里有几个非常成熟的库,足以应对大部分场景:
- requests:负责网络通信,发送请求和接收响应。
- BeautifulSoup:擅长解析 HTML/XML,快速定位标签。
安装准备
在终端执行以下命令即可(清华源镜像能提升国内下载速度):
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)
print(response.text)
这里 response.text 会返回完整的 HTML 源码。运行后你会看到一大段代码,这就是网页的结构。
2. 解析数据
拿到源码后,用 BeautifulSoup 来'读'懂它。比如我们要提取标题:
from bs4 import BeautifulSoup
# 初始化解析器
soup = BeautifulSoup(response.text, 'html.parser')
# 获取 title 标签内的纯文本
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)
注意这里加了个判断,因为有些链接可能是空的或者相对路径,实际项目中可能需要进一步处理。
四、进阶场景与框架
动态网页处理
很多现代网站的数据是 JavaScript 动态渲染的,HTML 源码里看不到完整内容。这时候 requests 就力不从心了,得用 Selenium 模拟真实浏览器行为。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.example.com')
print(driver.title)
driver.quit()
Selenium 能执行点击、滚动等操作,适合爬取加载后生成的数据。记得提前配置好 ChromeDriver。
大规模爬取:Scrapy
当需要高并发、异步处理时,建议直接使用 Scrapy 框架。它内置了中间件、管道等组件,适合构建企业级爬虫项目。
pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
五、反爬机制应对
访问某些网站时可能会遇到限制,常见手段及对策如下:
1. 伪装请求头
服务器常通过 User-Agent 识别爬虫。我们可以伪造浏览器的标识:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers)
2. 控制频率
频繁请求容易触发 IP 封禁。加入随机延迟是个好习惯:
import time
import random
time.sleep(random.uniform(1, 3)) # 随机等待 1-3 秒
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 和数据库是最常用的两种方式。
CSV 文件
适合轻量级数据,直接用 Python 标准库就能写:
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.text, link.get('href')])
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 VALUES (?, ?)', (link.text, link.get('href')))
conn.commit()
conn.close()
七、总结
爬虫开发的核心在于理解 HTTP 协议与 DOM 结构。基础场景用 requests + BeautifulSoup 足矣;涉及动态渲染则需 Selenium;大规模任务交给 Scrapy。同时要注意遵守法律法规,合理设置访问频率,避免对目标站点造成压力。掌握这些工具,你就能轻松搭建自己的数据采集 pipeline。


