正则表达式进阶:用命名分组提取复杂文本。
import re
text = "价格: ¥199.00 折扣价: ¥159.00"
pattern = r"价格: ¥(?P\d+\.\d{2}) 折扣价: ¥(?P\d+\.\d{2})"
match = re.search(pattern, text)
print(match.groupdict()) # {'price': '199.00', 'discount': '159.00'}
文本纠错:用 symspellpy
自动修正爬取中的错别字。
from symspellpy import SymSpell
sym_spell = SymSpell()
suggestions = sym_spell.lookup("爬崇", Verbosity.CLOSEST) # 自动纠错为“爬虫”
商品主图OCR:用 pytesseract
提取图片中的文字。
from PIL import Image
import pytesseract
text = pytesseract.image_to_string(Image.open('product.png'), lang='chi_sim')
Logo识别:使用 opencv
模板匹配判断品牌。
import cv2
result = cv2.matchTemplate(screenshot, logo_template, cv2.TM_CCOEFF_NORMED)
if np.max(result) > 0.8:
print("检测到品牌Logo")
基于Scrapy的分布式爬虫管理平台,支持任务监控、日志分析。
pip install gerapy
gerapy init # 初始化
gerapy migrate # 创建数据库
gerapy runserver 0.0.0.0:8000 # 启动服务
轻量级异步框架,性能优于传统同步框架。
from ruia import AttrField, TextField, Item
class ArticleItem(Item):
title = TextField(css_select='h1.article-title')
content = TextField(css_select='div.article-content')
async def parse(response):
item = await ArticleItem.get_item(html=response.text)
print(item.title)
不依赖Selenium,通过 websockets
直接控制浏览器。
import websocket
ws = websocket.create_connection("ws://localhost:9222/devtools/page/1")
ws.send('{"id":1,"method":"Page.navigate","params":{"url":"https://example.com"}}')
使用 mitmproxy
实时修改请求/响应:
from mitmproxy import http
def request(flow: http.HTTPFlow):
if "anti-spider" in flow.request.url:
flow.response = http.Response.make(404) # 伪造404绕过检测
热数据(频繁访问):存入Redis。
import redis
r = redis.Redis()
r.hset('product:123', 'price', '199.00')
冷数据(长期存储):归档至MinIO(兼容S3的对象存储)。
用 elasticsearch
实现全文检索:
from elasticsearch import Elasticsearch
es = Elasticsearch()
es.index(index="news", body={"title": "某重大事件", "content": "..."})
使用 curl_cffi
模仿真实浏览器TLS指纹:
from curl_cffi import requests
response = requests.get("https://tls.peet.ws/api/all", impersonate="chrome110")
通过修改Canvas参数生成唯一性较低的指纹:
// 在Selenium执行的JS脚本
HTMLCanvasElement.prototype.getContext = function() {
return { /* 伪造的上下文方法 */ };
};
数据最小化原则:仅抓取业务必需字段。
遵守 robots.txt
:使用 robotparser
模块自动解析:
from urllib.robotparser import RobotFileParser
rp = RobotFileParser()
rp.set_url("https://example.com/robots.txt")
rp.read()
if rp.can_fetch("*", "/api/data"):
# 允许抓取
避免爬取含个人身份信息(PII)的数据。
如必须处理,需进行数据匿名化:
from faker import Faker
fake = Faker()
anonymized_phone = fake.phone_number() # 生成虚拟号码替代真实数据
业务方说:“我们需要实时数据”——翻译为“每小时抓一次足够”。
产品经理说:“要覆盖全网数据”——实际需限定明确站点范围。
在代码中增加合规性检查:
def is_sensitive(data):
keywords = ['身份证', '手机号', '银行卡']
return any(kw in data for kw in keywords)
if is_sensitive(raw_data):
raise ValueError("检测到敏感字段,已终止存储")
量子波动速读法:当XPath/CSS选择器失效时,闭眼三秒重新睁眼,大概率会发现少写了一个 @
或 .
。
咖啡因催化法:深夜Debug效率提升200%,但需承担次日精神恍惚风险。
橡皮鸭调试法:向桌上的玩偶解释代码逻辑,往往在说到一半时发现错误。
从“蠢方法”开始:能用 requests+正则
解决的问题,不要一开始就上Scrapy。
学会放弃:若某个网站反爬投入产出比过低,优先寻找替代数据源。
保持道德敏感:即使技术上可行,也不抓取医疗预约号源等可能影响公平性的数据。