Python 爬虫技术实战指南:从入门到分布式采集
Python 爬虫技术通过自动化请求与解析获取网页数据。涵盖基础请求发送、页面解析技巧、反爬策略应对、Scrapy 框架搭建、数据库存储及分布式采集方案。重点讲解 requests、lxml、MongoDB 及 Redis 的应用,提供代码示例与工程化建议,强调合法合规采集原则。

Python 爬虫技术通过自动化请求与解析获取网页数据。涵盖基础请求发送、页面解析技巧、反爬策略应对、Scrapy 框架搭建、数据库存储及分布式采集方案。重点讲解 requests、lxml、MongoDB 及 Redis 的应用,提供代码示例与工程化建议,强调合法合规采集原则。

Python 凭借其简洁的语法和强大的生态库,成为网络爬虫开发的首选语言。爬虫技术旨在自动化获取互联网公开数据,广泛应用于数据分析、市场监控、学术研究等领域。本教程将引导初学者从零开始,系统掌握从基础请求发送、页面解析、反爬应对到分布式采集的全流程技术。
需要注意的是,爬虫开发必须遵守目标网站的 robots.txt 协议及相关法律法规,尊重数据版权,严禁用于非法用途或侵犯隐私。
安装 Python 3.x 版本(推荐 3.8+),建议使用虚拟环境管理依赖。
python -m venv crawler_env
source crawler_env/bin/activate # Windows: crawler_env\Scripts\activate
pip install requests lxml beautifulsoup4 pymongo redis
使用 requests 库模拟浏览器行为是爬虫的基础。需理解 HTTP 方法(GET/POST)、状态码及编码处理。
import requests
from requests.exceptions import RequestException
def fetch_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
response.encoding = response.apparent_encoding
return response.text
except RequestException as e:
print(f"Request failed: {e}")
return None
url = 'https://example.com'
text = fetch_page(url)
if text:
print(text[:500])
Session 管理:对于需要登录或多步操作的网站,使用 Session 对象保持 Cookie 状态。
session = requests.Session()
session.headers.update(headers)
resp = session.post('https://example.com/login', data={'user': 'admin'})
XPath 是定位 HTML 元素的强大工具,适合结构清晰的静态页面。
from lxml import etree
html_content = '''<div class="news">
<h1>标题</h1>
<p class="author">作者</p>
</div>'''
tree = etree.HTML(html_content)
# 提取标题
title = tree.xpath('//div[@class="news"]/h1/text()')
print(title)
BeautifulSoup 容错性强,适合处理不规范 HTML。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, 'lxml')
items = soup.find_all('div', class_='news')
for item in items:
print(item.get_text())
适用于提取特定格式文本,如邮箱、电话等。
import re
pattern = r'\d{3}-\d{4}'
match = re.search(pattern, text)
if match:
print(match.group())
设置 User-Agent、Referer、Cookie 等头部信息,避免被识别为脚本。
headers = {
'User-Agent': 'Mozilla/5.0...',
'Referer': 'https://www.google.com/'
}
频繁访问会导致 IP 被封禁,需构建代理池并轮换使用。
proxies_list = ['http://ip1:port', 'http://ip2:port']
proxy = random.choice(proxies_list)
response = requests.get(url, proxies={'http': proxy}, timeout=5)
使用 time.sleep() 模拟人工操作间隔,降低被封风险。
import time
time.sleep(random.uniform(1, 3))
Scrapy 是功能强大的异步爬虫框架。
scrapy startproject myspider
cd myspider
scrapy genspider example example.com
定义 Item 模型和解析逻辑。
import scrapy
class ExampleSpider(scrapy.Spider):
name = 'example'
allowed_domains = ['example.com']
start_urls = ['https://example.com/page/1']
def parse(self, response):
for href in response.css('a.next::attr(href)').getall():
yield response.follow(href, self.parse)
yield {
'title': response.css('h1::text').get(),
'content': response.css('.content::text').getall()
}
MongoDB 适合存储非结构化数据,如评论、日志。
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client['crawler_db']
collection = db['articles']
data = {'title': '示例文章', 'url': 'https://...'}
result = collection.insert_one(data)
print(result.inserted_id)
结构化数据建议使用关系型数据库。
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='pwd', database='db')
cursor = conn.cursor()
cursor.execute("INSERT INTO articles (title) VALUES (%s)", ('Title',))
conn.commit()
利用 Redis 实现任务分发与去重。
import redis
r = redis.Redis(host='localhost', port=6379)
r.lpush('crawl_queue', 'https://example.com')
while True:
url = r.rpop('crawl_queue')
if url:
process(url)
配置 DUPEFILTER_CLASS 和 SCHEDULER 实现多节点共享队列。
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
调整 Scrapy 的 CONCURRENT_REQUESTS 参数,平衡速度与稳定性。
使用 logging 模块记录运行状态,便于排查问题。
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info("Crawl started")
爬虫技术需要持续实践与迭代。建议从静态网站入手,逐步挑战动态加载和复杂反爬场景。始终遵循合法合规原则,合理控制抓取频率,保护目标服务器安全。通过掌握上述技术栈,你将具备独立构建高效数据采集系统的能力。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online