Python 网络爬虫入门与实战指南
Python 爬虫主要分为三大板块:抓取数据、分析数据、存储数据。简单来说,爬虫的目标是通过指定的 URL,直接返回用户所需数据,无需人工一步步操作浏览器获取。
Python 网络爬虫主要包含数据抓取、分析与存储三个核心环节。本文介绍使用 requests 库进行 HTTP 请求,处理 GET/POST 参数及登录验证。涵盖反爬虫应对策略,如代理 IP、请求头伪装及频率控制。讲解使用 BeautifulSoup 解析 HTML 和 JSON 数据,以及通过数据库或文件持久化存储结果。最后简述并发处理机制及爬虫开发的法律伦理规范。

Python 爬虫主要分为三大板块:抓取数据、分析数据、存储数据。简单来说,爬虫的目标是通过指定的 URL,直接返回用户所需数据,无需人工一步步操作浏览器获取。
在开始之前,请确保已安装 Python 3.x 环境。常用的第三方库可以通过 pip 安装:
pip install requests beautifulsoup4 lxml pandas
一般来说,访问网站 URL 给我们返回两种格式数据:HTML 和 JSON。
抓取数据的大多数属于 GET 请求,我们可以直接从网站所在服务器获取数据。在 Python 自带模块中,主要有 urllib 及 urllib.request,推荐使用功能更强大的 requests 库。
import requests
url = 'https://example.com/api/data'
response = requests.get(url)
# 检查状态码
if response.status_code == 200:
# 获取二进制内容
content_bytes = response.content
# 获取文本内容
content_text = response.text
# 尝试解析为 JSON
try:
data_json = response.json()
print("JSON Data:", data_json)
except ValueError:
print("Response is not JSON")
else:
print(f"Request failed with status code: {response.status_code}")
此外,还有一种是以带参的形式抓取数据,参数一般附在 URL 结尾,首个参数以 ? 连接,后续参数以 & 连接。使用 params 参数可以让 requests 自动处理编码。
import requests
data = {'data1': 'XXXXX', 'data2': 'XXXXX'}
url = 'https://example.com/search'
# requests 会自动将 dict 转换为 URL 查询字符串
response = requests.get(url=url, params=data)
print(response.url) # 查看最终生成的完整 URL
许多网站需要登录后才能访问特定资源。
先向服务器发送表单数据,服务器验证后将 cookie 存入响应头,后续请求需携带该 cookie。
import requests
data = {'username': 'user', 'password': 'pass'}
login_url = 'https://example.com/login'
response = requests.post(url=login_url, data=data)
# 保存会话,以便后续请求自动携带 Cookie
session = requests.Session()
session.post(login_url, data=data)
# 后续请求使用 session
profile_url = 'https://example.com/profile'
profile_response = session.get(profile_url)
如果已知有效的 Cookie,可以直接设置到请求头或 Session 中,服务器会认为你是一个已登录用户。
import requests
cookies = {'session_id': 'abc123xyz'}
headers = {'Cookie': 'session_id=abc123xyz'}
response = requests.get('https://example.com/protected', cookies=cookies)
很多网站实施了反爬虫策略,如 IP 限制、验证码、User-Agent 检测等。
主要用于解决'限制 IP'地址情况。维护一个代理 IP 池,随机选择使用。
proxies = {
'http': 'http://XX.XX.XX.XX:XXXX',
'https': 'http://XX.XX.XX.XX:XXXX'
}
try:
response = requests.get(url='https://example.com', proxies=proxies, timeout=5)
except Exception as e:
print(f"Proxy error: {e}")
解决频繁访问导致受限问题。加入 sleep 函数放缓频率。
import time
import random
time.sleep(random.uniform(1, 3)) # 随机休眠 1-3 秒
一些网站会检查 User-Agent 和 Referer。加上这些头部信息可模拟真实浏览器。
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',
'Referer': 'https://www.google.com/'
}
response = requests.get(url=url, headers=headers)
网络波动可能导致请求失败,实现重试机制可提高稳定性。
def fetch_with_retry(session, url, max_retries=3):
for attempt in range(max_retries):
try:
return session.get(url, timeout=10)
except requests.exceptions.RequestException as e:
print(f"Attempt {attempt + 1} failed: {e}")
if attempt == max_retries - 1:
raise
time.sleep(2 ** attempt) # 指数退避
return None
获取的数据通常需要进行清洗和分析。
对于 HTML 格式数据,推荐采用 BeautifulSoup 或 lxml。
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>Sample</title></head>
<body><p id="notice">Notice!</p></body></html>
"""
soup = BeautifulSoup(html_doc, 'lxml')
print(soup.title.string)
print(soup.find('p', id='notice').text)
JSON 格式数据可直接使用 Python 的 json 模块或 Pandas 处理。
import json
import pandas as pd
data_str = '{"name": "Alice", "age": 25}'
data_dict = json.loads(data_str)
# 转为 DataFrame 方便分析
df = pd.DataFrame([data_dict])
print(df.head())
此外,可以使用 numpy, matplotlib, pyecharts 等模块包做相应的数据分析与可视化展示。
数据抓取、分析处理完后,需要持久化存储。常见方式有存入数据库或 Excel 表格。
SQLite 轻量级,适合本地开发。
import sqlite3
conn = sqlite3.connect('crawler_data.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS items
(id INTEGER PRIMARY KEY, name TEXT, price REAL)''')
cursor.execute("INSERT INTO items (name, price) VALUES (?, ?)", ('Item A', 10.5))
conn.commit()
conn.close()
适合快速导出。
import csv
data = [['Name', 'Price'], ['Item A', 10.5]]
with open('output.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerows(data)
当爬取数据量过大时,单线程效率较低。Python 中可使用多线程 (threading) 或多进程 (multiprocessing)。
注意:由于 GIL (全局解释器锁) 的存在,CPU 密集型任务建议使用多进程,IO 密集型任务(如网络请求)多线程即可。
import multiprocessing as mp
def worker_task(item):
# 模拟耗时任务
return item * 2
if __name__ == '__main__':
pool = mp.Pool(processes=4)
results = pool.map(worker_task, range(10))
pool.close()
pool.join()
print(results)
本文介绍了 Python 爬虫的基础流程,包括请求发送、反爬应对、数据解析与存储。在实际开发中,请务必遵守目标网站的 robots.txt 协议,尊重版权与隐私,避免对服务器造成过大压力。合法合规地进行数据采集是爬虫开发的前提。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 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
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online