写了 100 个爬虫之后,我总结了这些血的教训

最开始:爬虫是 Python 的"入门级"应用?

很多人学 Python 第一个想干的事就是写爬虫。我也是。当我用十行代码爬下来一个网页的时候,我膨胀了——"爬虫就这?"

然后我就被教育了。100 个爬虫项目之后,我可以负责任地告诉你:爬虫不是技术问题,是博弈问题。你在和网站的开发人员斗智斗勇,和反爬虫系统玩猫鼠游戏。

第一课:Requests + BeautifulSoup 是初恋,但不是真爱

最开始嘛,肯定是从 requests + BeautifulSoup 开始的:

import requests
from bs4 import BeautifulSoup

res = requests.get('https://example.com')
soup = BeautifulSoup(res.text, 'html.parser')
print(soup.find('h1').text)

简单、直接、好懂。但是——遇到 JavaScript 渲染的页面你就傻了。你拿到的 HTML 里全是 <div id="root"></div>,内容呢?JS 渲染去了。

这时候你就得上 Selenium 或者 Playwright。别抗拒,这是成长的必经之路。

第二课:反爬虫——网站不是好惹的

你以为爬虫就是发请求、解析 HTML?太天真了。网站的防爬措施一个比一个狠:

1. IP 封禁

同一个 IP 一分钟内发了 100 个请求?恭喜你,被拉黑了。解决方案:IP 代理池

proxies = [
    'http://proxy1.com:8080',
    'http://proxy2.com:8080',
    # ... 搞个几十上百个
]
proxy = random.choice(proxies)
requests.get(url, proxies={'http': proxy, 'https': proxy})

免费代理?别想了,99% 都不可用。付费代理池才是王道。别心疼那点钱——你要知道,IP 被封了你的爬虫就是废物。

2. User-Agent 轮换

只用一个 User-Agent 爬?太明显了。你得伪装成不同的浏览器:

USER_AGENTS = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120...',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/605...',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)...',
    # ... 越多越好
]
headers['User-Agent'] = random.choice(USER_AGENTS)

有时候还得带上 Cookie、Referer、甚至是浏览器指纹。对,你爬个数据搞的跟黑客入侵一样。

3. 验证码

验证码是爬虫的天敌。图形验证码可以用 OCR(pytesseract)识别,但准确率嘛……"请点击下图中所有的红绿灯"——这种验证码 OCR 也救不了你。

终极方案:接验证码识别平台(打码平台),2 分钱一次,省心省力。或者——老实说,有的网站就不该爬,换条路走吧。

第三课:Scrapy——爬虫界的"工业级解决方案"

当你需要爬成千上万个页面的时候,requests + BeautifulSoup 就不够用了。这时候上 Scrapy

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['https://example.com']

    def parse(self, response):
        # Scrapy 自带请求队列、去重、并发控制、数据管道
        yield {'title': response.css('h1::text').get()}
        
        # 自动跟踪链接
        for next_page in response.css('a::attr(href)'):
            yield response.follow(next_page, self.parse)

Scrapy 牛逼在哪?异步、并发、中间件。自带下载器中间件,可以轻松集成代理和 UA 轮换。还有 Item Pipeline,数据清洗、去重、入库一条龙。大型爬虫项目选 Scrapy 准没错。

第四课:别当"爬虫侠"——尊重 robots.txt

我知道这句话说出来要被人骂——但真的,别乱爬

  • 爬取频率别太高,给服务器留点活路
  • 遵守 robots.txt(https://example.com/robots.txt
  • 别爬需要登录才能访问的内容(除非你有授权)
  • 爬下来的数据别商用,除非是公开数据

我见过有人爬电商网站的商品数据拿去卖,结果被律师函警告了。得不偿失啊兄弟。

总结:爬虫三字经

请求头要伪装,IP 要轮换,频率要控制,验证码要打码。最重要的是——当你看到一个网站有 Cloudflare 防护的时候,算了,换个目标吧。人生苦短,别跟 Cloudflare 过不去。

comments powered by Disqus