Python 爬虫入门:构建简单数据抓取程序
Python 爬虫通过模拟浏览器请求获取网页数据,主要涉及发送请求、解析源码、存储数据三个核心步骤。本文详解使用 requests 库发起 HTTP 请求并处理状态码,利用 BeautifulSoup 结合 lxml 解析 HTML 结构提取特定信息,演示了将数据写入本地文本文件的完整流程。此外,补充了设置请求头规避反爬、异常捕获处理、遵守 Robots 协议及数据序列化保存等进阶实践,旨在帮助开发者建立规范的网络数据采集能力。

Python 爬虫通过模拟浏览器请求获取网页数据,主要涉及发送请求、解析源码、存储数据三个核心步骤。本文详解使用 requests 库发起 HTTP 请求并处理状态码,利用 BeautifulSoup 结合 lxml 解析 HTML 结构提取特定信息,演示了将数据写入本地文本文件的完整流程。此外,补充了设置请求头规避反爬、异常捕获处理、遵守 Robots 协议及数据序列化保存等进阶实践,旨在帮助开发者建立规范的网络数据采集能力。

当人类访问一个网页时,通常经历以下步骤:
网络爬虫(Web Crawler)模拟了这一过程。其核心逻辑分为三步:
本文将重点介绍如何使用 Python 实现这三个步骤,构建一个基础的网络爬虫。
Python 拥有丰富的第三方库支持网络开发,其中 requests 是发送 HTTP 请求的首选库,BeautifulSoup 则是解析 HTML 文档的利器。
在终端或命令行中执行以下指令安装必要的包:
pip install requests beautifulsoup4 lxml
requests:简化 HTTP 请求操作。beautifulsoup4:HTML/XML 解析器。lxml:高性能的 XML/HTML 解析后端,建议配合 BeautifulSoup 使用以提升速度。进入 Python 交互环境,尝试导入模块:
import requests
from bs4 import BeautifulSoup
import lxml
print("环境配置成功")
若无报错输出,说明安装成功。
使用 requests.get() 方法可以获取指定 URL 的资源。以下代码演示了如何请求百度首页并查看响应状态:
import requests
url = 'https://www.baidu.com'
try:
# 发送 GET 请求
response = requests.get(url, timeout=10)
# 检查状态码
if response.status_code == 200:
print(f"请求成功,状态码:{response.status_code}")
# 打印部分源码内容
print(response.text[:500])
else:
print(f"请求失败,状态码:{response.status_code}")
except Exception as e:
print(f"发生异常:{e}")
许多网站会检测 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)
200 OK:请求成功。301 Moved Permanently:永久重定向。404 Not Found:资源未找到。403 Forbidden:禁止访问(可能触发反爬机制)。500 Internal Server Error:服务器内部错误。获取到 HTML 源码后,需要从中提取结构化数据。BeautifulSoup 提供了直观的 API 来遍历 DOM 树。
from bs4 import BeautifulSoup
html_doc = response.text
soup = BeautifulSoup(html_doc, 'lxml')
使用 find() 方法获取第一个匹配的标签:
# 查找 title 标签
title_tag = soup.find('title')
if title_tag:
print(title_tag.string)
使用 find_all() 方法获取所有匹配标签的列表:
# 获取所有链接 a 标签
links = soup.find_all('a')
for link in links:
href = link.get('href')
text = link.get_text(strip=True)
if href and text:
print(f"链接:{href}, 文本:{text}")
BeautifulSoup 支持类似 CSS 的选择器语法,便于快速定位:
# 查找 class 为 nav 下的所有 li 标签
items = soup.select('.nav li')
对于结构复杂的非标准 HTML,可以使用 Python 内置的 re 模块进行正则匹配:
import re
# 提取所有 http 开头的链接
pattern = r'https?://[^"]+'
urls = re.findall(pattern, html_doc)
将提取的数据写入本地 TXT 文件:
with open('data.txt', 'w', encoding='utf-8') as f:
for link in links:
href = link.get('href')
if href:
f.write(href + '\n')
使用 with open(...) 语句可确保文件操作完成后自动关闭,避免资源泄露。
JSON 更适合存储结构化数据,便于后续处理:
import json
data_list = []
for link in links:
href = link.get('href')
if href:
data_list.append({'url': href})
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data_list, f, ensure_ascii=False, indent=4)
CSV 适合表格化数据,可使用 pandas 或直接写入:
import csv
with open('data.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['URL'])
for link in links:
href = link.get('href')
if href:
writer.writerow([href])
网络请求具有不稳定性,应增加异常捕获机制:
import time
for i in range(5):
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
break
except requests.exceptions.RequestException as e:
print(f"第 {i+1} 次请求失败:{e}")
time.sleep(2) # 失败后等待 2 秒重试
在爬取前,应检查目标网站的 robots.txt 文件(通常为 https://域名/robots.txt),确认是否允许爬取特定路径。
避免短时间内发送大量请求导致服务器压力过大或被封禁 IP。建议在循环中加入延时:
import random
time.sleep(random.uniform(1, 3))
若需保持登录状态或复用连接,可使用 Session 对象:
session = requests.Session()
session.headers.update(headers)
response = session.get(url)
本文详细介绍了 Python 爬虫的基础实现流程:
requests 发送带 Headers 的 HTTP 请求。BeautifulSoup 和 lxml 解析 HTML 结构。掌握这些基础技能后,开发者可进一步探索动态页面渲染(如 Selenium)、分布式爬虫及反爬策略对抗等高级主题。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online