1、数据采集入门:数据来源分类、采集工具介绍、爬虫伦理与法律边界
数据采集,说白了就是「把别人家的数据搬到自己家」。听起来简单,但这里面的门道可不少。我做了这么多年数据工程,见过太多人一上来就写爬虫,结果要么被反爬封了 IP,要么收到了律师函。
这一章,咱们先把地基打牢。数据从哪来?用什么工具搬?哪些能搬、哪些不能搬?搞清楚这三个问题,后面的路才走得稳。
1.1 数据来源分类:你的数据到底在哪?
很多人以为数据都在网页上。其实不然。我习惯把数据来源分成三大类,你想想看,你平时接触的数据是不是也逃不出这几个圈子?
| 来源类型 | 典型例子 | 采集难度 | 常见格式 |
|---|---|---|---|
| 结构化数据源 | 数据库、Excel、CSV、API 接口 | 低 | JSON、XML、SQL |
| 半结构化数据源 | HTML 页面、日志文件、邮件 | 中 | HTML、JSON-LD、YAML |
| 非结构化数据源 | 图片、PDF、视频、音频 | 高 | 二进制流、Base64 |
我的习惯: 接到采集任务,先问一句「有没有 API?」。有 API 就别爬网页,省心省力还合法。我在项目中遇到过客户非要爬某电商网站,结果发现人家有开放的商品查询 API,参数一调,数据就来了,何必去跟反爬系统较劲?
1.2 采集工具介绍:选对工具,事半功倍
工具这东西,没有最好的,只有最顺手的。我这些年换过不少工具,给你列几个我常用的,每个都有它的脾气。
1.2.1 轻量级:Requests + BeautifulSoup
这是入门标配。适合小规模、结构简单的页面。
import requests
from bs4 import BeautifulSoup
url = "https://example.com/data"
response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
soup = BeautifulSoup(response.text, "html.parser")
# 提取所有表格行
rows = soup.select("table tr")
for row in rows:
cells = row.find_all("td")
if cells:
print([cell.get_text(strip=True) for cell in cells])
避坑指南: 我曾经不加 headers 直接请求,被目标服务器识别为爬虫,IP 直接封了 24 小时。记住,模拟浏览器请求头是基本功,别偷懒。
1.2.2 中型项目:Scrapy 框架
当你需要采集成千上万个页面时,Scrapy 是首选。它自带异步、去重、管道、中间件,省去你造轮子的时间。
# 一个简单的 Scrapy Spider 示例
import scrapy
class DataSpider(scrapy.Spider):
name = "data_spider"
start_urls = ["https://example.com/list"]
def parse(self, response):
for item in response.css("div.item"):
yield {
"title": item.css("h2::text").get(),
"price": item.css("span.price::text").get(),
}
# 翻页
next_page = response.css("a.next::attr(href)").get()
if next_page:
yield response.follow(next_page, self.parse)
个人经验: Scrapy 的 Pipeline 是个好东西。我习惯在 Pipeline 里做数据清洗和去重,这样爬虫只管抓,脏活累活交给下游。有一次采集新闻数据,Pipeline 里加了个简单的正则过滤,把广告和无关内容全筛掉了,省了后期大量清洗工作。
1.2.3 动态页面:Selenium + Playwright
遇到 JavaScript 渲染的页面,Requests 就抓瞎了。这时候得上浏览器自动化工具。
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/dynamic")
# 等待页面加载完成
driver.implicitly_wait(10)
# 获取动态加载的数据
data = driver.find_element(By.ID, "dynamic-content").text
print(data)
driver.quit()
小技巧: Selenium 跑起来很慢,我建议只在必要时用。能通过分析网络请求找到 API 接口的,就别开浏览器。我一般先打开浏览器开发者工具,看 Network 面板,找到真正的数据接口,然后用 Requests 直接调,又快又稳。
1.3 爬虫伦理与法律边界:别踩红线
这部分内容,我建议你认真看。我见过太多人因为不懂法,把自己送进了麻烦里。
1.3.1 三个基本原则
- robots.txt 协议: 这是网站的「君子协定」。爬之前先看
https://example.com/robots.txt,人家不让爬的路径,就别碰。 - 频率控制: 别把人家服务器搞崩了。我习惯在请求之间加 1-3 秒延迟,再好的数据也不值得用「攻击」的方式去拿。
- 数据用途: 采集的数据只能用于个人学习或研究,不能直接商用,更不能转卖。这是底线。
1.3.2 法律红线清单
| 行为 | 法律风险 | 真实案例 |
|---|---|---|
| 采集个人隐私数据(手机号、身份证) | 侵犯公民个人信息罪 | 某爬虫团队采集 10 万条用户信息,主犯判刑 3 年 |
| 绕过反爬措施(破解验证码、IP 池轮换) | 非法获取计算机信息系统数据罪 | 某公司爬取竞品数据,被判赔偿 200 万 |
| 采集后转卖数据 | 侵犯著作权、不正当竞争 | 某数据交易平台因售卖爬取数据被关停 |
| 高频请求导致服务器瘫痪 | 破坏计算机信息系统罪 | 某学生爬取选课系统导致崩溃,被学校处分 |
我曾经踩过的坑: 刚入行时接了个私活,爬某招聘网站的数据。对方说「只是做分析用」,我就没多想。结果数据里包含了求职者的手机号和邮箱,客户转手就卖给了猎头公司。后来网站法务找上门,我虽然没直接卖数据,但也因为「帮助采集」被约谈。从那以后,我接任何采集项目都会签一份《数据用途承诺书》,白纸黑字写清楚数据只能用于什么场景。
1.4 本章知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当作一张「数据采集地图」,以后每次动手前,先看看自己站在哪个位置。
一句话总结: 数据采集不是技术问题,而是「知道去哪拿、用什么拿、能不能拿」的综合判断。技术可以学,法律红线不能碰。我见过太多人技术一流,但因为不懂法,最后栽了跟头。记住,采集之前先问自己三个问题:数据来源合法吗?采集方式合规吗?数据用途正当吗?三个答案都是「是」,再动手。