Python 爬虫入门实战
爬虫技术通过编程自动从网页获取信息。简单来说,当你查看网页源代码时看到的 HTML 结构就是爬虫的目标对象,它像一位机器人帮你阅读并提取内容。
一、基本流程
一个完整的爬虫通常包含三个步骤:
- 发送请求:向目标网页发起 HTTP 请求,获取原始内容。
- 解析网页:从返回的 HTML 或 JSON 中提取所需数据。
- 保存数据:将提取的信息存储到文件或数据库中。
二、核心库与安装
Python 生态中有两个最常用的库:requests 负责网络通信,BeautifulSoup 负责 HTML 解析。
在终端执行以下命令即可安装(推荐使用国内镜像加速):
pip install requests beautifulsoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple
三、实战示例
1. 获取网页内容
首先使用 requests 抓取百度首页。这里直接打印响应文本,你会看到大量的 HTML 源码。
import requests
url = 'https://www.baidu.com'
response = requests.get(url)
print(response.text)
注意:实际开发中建议检查
response.status_code确保请求成功。
2. 解析页面标题
拿到 HTML 后,用 BeautifulSoup 解析。我们尝试提取 <title> 标签的内容。
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)
这里用 get('href') 比直接访问属性更安全,防止某些标签没有该属性导致报错。
四、进阶场景处理
静态与动态网页
上述例子针对的是静态网页。如果数据由 JavaScript 动态加载(如滚动加载更多),浏览器渲染后的 DOM 才是真实数据。此时可以使用 Selenium 模拟浏览器行为。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.example.com')
print(driver.title)
driver.quit()
大规模爬取框架
当任务量变大时,手动写脚本效率较低,建议使用 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
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 文件
适合轻量级结构化数据。
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 (title, href) VALUES (?, ?)',
(link.text, link.get('href')))
conn.commit()
conn.close()
七、总结
爬虫的核心在于理解 HTTP 协议与 HTML 结构。基础阶段掌握 requests 和 BeautifulSoup 足以应对大部分静态站点;遇到动态渲染需引入 Selenium;生产环境则推荐 Scrapy。同时务必遵守法律法规,合理设置访问频率,避免对目标服务器造成压力。


