Python爬虫学习路径与实战指南 05

一、数据清洗与预处理的魔鬼细节

1. 非结构化文本处理

  • 正则表达式进阶:用命名分组提取复杂文本。

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)  # 自动纠错为“爬虫”

2. 图像数据提取

商品主图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")

二、众但强悍的爬虫框架

1. Gerapy(可视化爬虫管理)

  • 基于Scrapy的分布式爬虫管理平台,支持任务监控、日志分析。

pip install gerapy
gerapy init  # 初始化
gerapy migrate  # 创建数据库
gerapy runserver 0.0.0.0:8000  # 启动服务

2. Ruia(异步优先框架)

  • 轻量级异步框架,性能优于传统同步框架。

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)

三、浏览器调试高阶技巧

1. 直接调用Chrome DevTools协议

  • 不依赖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"}}')

2. 网络请求拦截与修改

  • 使用 mitmproxy 实时修改请求/响应:

from mitmproxy import http

def request(flow: http.HTTPFlow):
    if "anti-spider" in flow.request.url:
        flow.response = http.Response.make(404)  # 伪造404绕过检测

四、数据存储的奇技淫巧

1. 冷热数据分离

  • 热数据(频繁访问):存入Redis。

import redis
r = redis.Redis()
r.hset('product:123', 'price', '199.00')
  • 冷数据(长期存储):归档至MinIO(兼容S3的对象存储)。

2. 搜索引擎集成

  • 用 elasticsearch 实现全文检索:

from elasticsearch import Elasticsearch
es = Elasticsearch()
es.index(index="news", body={"title": "某重大事件", "content": "..."})

五、反爬对抗的黑暗艺术

1. TLS指纹伪装

  • 使用 curl_cffi 模仿真实浏览器TLS指纹:

from curl_cffi import requests
response = requests.get("https://tls.peet.ws/api/all", impersonate="chrome110")

2. WebGL指纹欺骗

  • 通过修改Canvas参数生成唯一性较低的指纹:

// 在Selenium执行的JS脚本
HTMLCanvasElement.prototype.getContext = function() {
    return { /* 伪造的上下文方法 */ };
};

六、爬虫与法律的灰色地带

1. 合法爬取策略

  • 数据最小化原则:仅抓取业务必需字段。

  • 遵守 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"):
    # 允许抓取

2. 欧盟GDPR合规要点

  • 避免爬取含个人身份信息(PII)的数据。

  • 如必须处理,需进行数据匿名化:

from faker import Faker
fake = Faker()
anonymized_phone = fake.phone_number()  # 生成虚拟号码替代真实数据

七、行业黑话与沟通技巧

1. 需求沟通话术

  • 业务方说:“我们需要实时数据”——翻译为“每小时抓一次足够”。

  • 产品经理说:“要覆盖全网数据”——实际需限定明确站点范围。

2. 甩锅预防指南

  • 在代码中增加合规性检查:

def is_sensitive(data):
    keywords = ['身份证', '手机号', '银行卡']
    return any(kw in data for kw in keywords)

if is_sensitive(raw_data):
    raise ValueError("检测到敏感字段,已终止存储")

八、玄学调试法

  1. 量子波动速读法:当XPath/CSS选择器失效时,闭眼三秒重新睁眼,大概率会发现少写了一个 @ 或 .

  2. 咖啡因催化法:深夜Debug效率提升200%,但需承担次日精神恍惚风险。

  3. 橡皮鸭调试法:向桌上的玩偶解释代码逻辑,往往在说到一半时发现错误。

九、给初学者的终极建议

  1. 从“蠢方法”开始:能用 requests+正则 解决的问题,不要一开始就上Scrapy。

  2. 学会放弃:若某个网站反爬投入产出比过低,优先寻找替代数据源。

  3. 保持道德敏感:即使技术上可行,也不抓取医疗预约号源等可能影响公平性的数据。

你可能感兴趣的:(学习)