前言

在当今人工智能飞速发展的时代,基于大规模数据训练的 AI 模型取得了显著的突破,在自然语言处理、图像生成和语音识别等众多领域表现出色。同时,其在医疗、金融、教育等行业展现出广泛的应用前景。然而,获取高质量的大规模数据用于 AI 训练并非易事,各大网站普遍设有反爬机制,限制自动化程序抓取信息。在这种情况下,一个解决数据采集难题的工具就显得至关重要。

一、动态住宅代理:像真实用户一样“隐身”抓数据

1. 什么是动态住宅代理?

想象一下,你想从某个网站收集数据,但每次访问都被对方识别为 “ 爬虫 ” ,直接封禁你的IP。这时候,动态住宅代理(Dynamic Residential Proxy)就能派上用场。它相当于一个“智能中间人”,将你的网络请求通过全球各地的真实家庭网络IP转发出去。这样一来,网站会认为访问者是一个普通用户,而非机器程序,从而大幅降低被封禁的风险。

2. 为什么AI训练需要它?

  • 数据多样性:动态IP覆盖全球多个地区,能模拟不同地理位置用户的访问行为,确保数据来源的多样性。
  • 高成功率:通过轮换IP池,即使某个IP被封锁,系统会自动切换下一个可用IP,保证数据抓取不间断。
  • 合规性:使用真实住宅IP,避免因滥用数据中心代理而触犯法律或平台规则。

3.为什么选择这个平台

亮数据平台(BrightData)可以说是专门为 AI 打造的数据解决方案,它有着很不错的功能,比如能够支持自定义地去大规模采集训练数据,而且能够获取到超过 50 亿条很适合大语言模型(LLM)的数据记录哦。这些数据都是从 100 多个不同的来源汇集而来的,并且经过了严格的清洗和验证等一系列完善的处理流程,还会每个月进行更新呢,整体来看,数据的合法性是有保障的,质量也挺高的啦,这样就可以避免因训练数据不佳而带来一些隐患呀。另外呀,它在像大语言模型微调、计算机视觉(CV)数据扩增以及推荐系统优化等诸多场景中,都有着比较广泛的应用

4.实战演示:不懂代码?也能一键爬数据!

Step 1:注册与登录

主页链接,首先我们需要注册亮数据账号,非常简单!进入主页点击开始免费试用,输入必要信息进行验证即可。立即注册Bright Data,免费领取试用额度,体验专业数据采集,助力你的AI项目起步!新用户会赠送2$,这也是我选择它的原因之一,对初学者是非常友好的。
在这里插入图片描述

Step 2:Api无浏览器爬取数据

即便有了代理,传统爬虫仍需面对复杂的技术挑战:解析网页结构、处理验证码、应对反爬策略……这对非技术人员来说门槛极高。

那我们直接一步到位,使用网页抓取API(WebScrapersAPI)将爬虫技术封装成“ 开箱即用” 的工具。你只需输入目标网址,它就能自动识别页面结构,返回结构化数据(如商品信息、社交媒体内容等),甚至支持JavaScript渲染的动态页面。

小知识:“ Bright Data具有全球最大IP池(7200万+住宅IP),深受超20000位全球客户信赖”

Step 3:获取Tiktok博主信息

这次,我们选择Web Scrapers模块,可以看到众多热门的网站都有,同时也可以定制化爬取,这次演示的是爬取Tiktok博主信息。
在这里插入图片描述
点击进入之后,我们在点击tiktok.com,进入tiktok收集。
在这里插入图片描述
我们选择Pages Posts by Profile URL -collect by URL,通过URL进行爬取你想了解的博主的信息。
在这里插入图片描述
最好用的神器它来了——无代码抓取器,我们只需要配置基础信息就能访问,连访问URL的步骤都省略了。
在这里插入图片描述
这里我们需要填写博主的URL,点击start,就会触发爬取程序,只需要耐心等待就能获取到数据集了,没有比这更简单的操作了!
在这里插入图片描述
获取数据集也很简单,都是可视化操作,我们点击左侧的WebScrapers,然后点击日志,当状态为Ready时,就可以点击下载,将数据集下载到本地,数据自由从此开始实现!

小知识:“ Bright Data可以自动绕过反爬机制(验证码、WAF、JS渲染页面,同时具有合规审计体系,确保数据采集合法! ”

二、不想自己获取数据,那就买买买!

1.下载数据集

亮数据同时还提供直接购买数据集功能,点击左侧的Web Datasets Web,可以看到包含各种类型数据比如:地理信息、电商、房地产、社交媒体、新闻等等,价格是非常实惠的,还可以看到数据集的基本信息、数据量、城市、价格、位置等等。
在这里插入图片描述
同时还提供一部分免费的数据集,这里我们使用免费的IMDB媒体信息,喂给AI模型,输入电影或电视剧名,就可以获取到电影/电视剧信息,并且告诉你是否值得观看,成为你日常的观影推荐小助手
在这里插入图片描述
因为训练AI需要一定量的数据集,这里我们使用亮数据免费提供的案例,每个想尝试的朋友,都可以试一下,点击下载json文件。
在这里插入图片描述
小知识:“BrightData拥有超过50亿条数据记录可以随时使用,具有强大的筛选和自定义功能,想要的数据它都有!”

2.下载python运行环境

安装Python 3.8+(推荐3.8.10),下载地址。我用的是windows windows版本。
在这里插入图片描述
安装时候一定要勾选"Add Python to PATH"。
在这里插入图片描述
在这里插入图片描述

3.下载模型与运行库

以管理员身份运行命令提示符,也就是cmd。
在这里插入图片描述
依次执行一下命令:
python --version 查看是否安装成功python。
在这里插入图片描述
python -m venv tinybert_env

在这里插入图片描述tinybert_env\Scripts\activate
在这里插入图片描述
python -m pip install --upgrade pip==23.3.1
在这里插入图片描述
pip install torch==1.13.1+cpu torchvision==0.14.1+cpu torchaudio==0.13.1 -f https://download.pytorch.org/whl/cpu/torch_stable.html
在这里插入图片描述
pip install transformers==4.30.2 datasets==2.14.5 tokenizers==0.13.3 accelerate==0.20.3
pip install pandas==2.0.3 scikit-learn==1.3.0 tqdm==4.66.1
都安装成功就可以下一步。

4.创建数据文件data/train.json

我们先在D盘目录下创建一个test目录,接着在test中创建一个data目录,再创建一个train.json文件,然后把我们在亮数据中下载的json中的数据复制到train.json中。
在这里插入图片描述

5.创建数据处理脚本prepare_data.py

在test目录下创建“prepare_data.py”文件,将以下内容放到py脚本中。
在这里插入图片描述

import json
from datasets import Dataset
import pandas as pd

def preprocess_movie_data(item):
    """处理单条电影数据"""
    # 构建输入文本
    text_parts = [
        f"Title: {item['title']}",
        f"Director: {', '.join([n['name'] for c in item['credit'] if c['title']=='Director' for n in c['names']])}",
        f"Cast: {', '.join([n['name'] for c in item['credit'] if c['title']=='Stars' for n in c['names']][:3])}",
        f"Genres: {', '.join(item['genres'])}",
        f"Plot: {item['presentation']}",
        f"Release Date: {item['details_release_date']}",
        f"Country: {item['details_countries_of_origin']}"
    ]
    
    # 转换评分到100分制(原数据是0-10分)
    score = float(item.get("imdb_rating", 0)) * 10  # 转换为0-100分
    
    return {
        "text": "\n".join(text_parts),
        "labels": score
    }

# 加载原始数据
with open('data/train.json', 'r', encoding='utf-8') as f:
    raw_data = json.load(f)

# 预处理并过滤无效数据
processed = []
for item in raw_data:
    if item.get("imdb_rating") is not None:
        processed.append(preprocess_movie_data(item))

# 创建数据集
dataset = Dataset.from_pandas(pd.DataFrame(processed))

# 分割数据集
split_dataset = dataset.train_test_split(test_size=0.2, seed=42)
split_dataset.save_to_disk("imdb_processed")

6.创建训练脚本train.py

也是在test目录下创建train.py文件,这个是关键的训练脚本。
在这里插入图片描述

from transformers import (
    AutoTokenizer,
    AutoModelForSequenceClassification,
    TrainingArguments,
    Trainer
)
from datasets import load_from_disk
import numpy as np
import torch
import torch.nn as nn

# 自定义回归模型
class RegressionModel(AutoModelForSequenceClassification):
    def __init__(self, config):
        super().__init__(config)
        self.loss_fct = nn.MSELoss()

    def forward(self, **inputs):
        outputs = super().forward(**inputs)
        loss = self.loss_fct(outputs.logits.view(-1), inputs["labels"].view(-1))
        return {"loss": loss, "logits": outputs.logits}

# 加载数据
dataset = load_from_disk("imdb_processed")

# 初始化分词器
tokenizer = AutoTokenizer.from_pretrained("huawei-noah/TinyBERT_General_4L_312D")

# 文本预处理
def tokenize_function(examples):
    return tokenizer(
        examples["text"],
        padding="max_length",
        truncation=True,
        max_length=256,
        return_tensors="np"
    )

tokenized_datasets = dataset.map(
    tokenize_function,
    batched=True,
    remove_columns=["text"]
)

# 加载自定义模型
model = RegressionModel.from_pretrained(
    "huawei-noah/TinyBERT_General_4L_312D",
    num_labels=1,
    problem_type="regression"
)

# 自定义评估指标
def compute_metrics(p):
    preds = p.predictions.squeeze()
    labels = p.label_ids
    mae = np.abs(preds - labels).mean()
    return {"MAE": mae}

# 训练参数
training_args = TrainingArguments(
    output_dir="./imdb_results",
    evaluation_strategy="epoch",
    learning_rate=3e-5,
    per_device_train_batch_size=8,
    per_device_eval_batch_size=16,
    num_train_epochs=5,
    weight_decay=0.01,
    logging_dir='./logs',
    save_strategy="no",
    report_to="none",
    gradient_accumulation_steps=2,
    optim="adamw_torch",
    label_names=["labels"]
)

# 初始化Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["test"],
    compute_metrics=compute_metrics
)

# 数据格式验证
print("\n=== 数据格式验证 ===")
print("特征结构:", tokenized_datasets["train"].features)
print("首条数据标签:", tokenized_datasets["train"][0]["labels"])

# 开始训练
trainer.train()

# 保存模型
model.save_pretrained("./imdb_model")
tokenizer.save_pretrained("./imdb_model")

7.创建predict.py

在test目录下,创建predict.py文件,这个脚本是用来处理训练完的数据以及整合回答的结果。
在这里插入图片描述

import json
from typing import Dict, Optional

def load_movie_data(title: str) -> Optional[Dict]:
    """根据标题加载电影数据"""
    with open('data/train.json', 'r', encoding='utf-8') as f:
        all_data = json.load(f)
        for movie in all_data:
            if movie.get("title", "").lower() == title.lower():
                return movie
    return None

def translate_movie_info(movie_data: Dict) -> Dict:
    """带空值检查的完整翻译函数"""
    def safe_get(key, default="未知"):
        value = movie_data.get(key)
        return value if value is not None else default

    return {
        "标题": safe_get("title"),
        "导演": ", ".join(n["name"] for c in safe_get("credit", []) 
                        if c.get("title") == "Director" for n in c.get("names", [])),
        "主演": ", ".join(n["name"] for c in safe_get("credit", []) 
                        if c.get("title") == "Stars" for n in c.get("names", [])[:3]),
        "类型": "、".join(safe_get("genres", [])),
        "剧情简介": safe_get("presentation", "").replace("A venture capitalist", "一位风险投资家"),
        "上映日期": str(safe_get("details_release_date", "")).replace("(United States)", "(美国)"),
        "制片国家": str(safe_get("details_countries_of_origin", "")).replace("United States", "美国"),
        "IMDb评分": f"{float(safe_get('imdb_rating', 0)):.1f}/10",
        "预算": safe_get("boxoffice_budget"),
        "拍摄地点": str(safe_get("details_filming_locations", "")).replace("Los Angeles", "洛杉矶"),
        "制作公司": safe_get("details_production_companies"),
        "媒体类型": safe_get("media_type", "电影"),
        "语言": safe_get("details_language", "英语").replace("English", "英语")
    }

def get_recommendation(title: str) -> Dict:
    """主推荐函数"""
    movie_data = load_movie_data(title)
    if not movie_data:
        return {"错误": "未找到相关影片信息"}
    
    # 计算推荐指数
    imdb_rating = float(movie_data.get("imdb_rating", 0))
    score = min(max(round(imdb_rating * 10), 0), 100)  # 确保0-100范围
    
    # 评价等级
    if score >= 90:
        evaluation = "★★★★★ 优秀"
    elif score >= 60:
        evaluation = "★★★ 及格"
    else:
        evaluation = "★ 不及格"
    
    return {
        "推荐指数": f"{score}/100",
        "评价等级": evaluation,
        "详细信息": translate_movie_info(movie_data)
    }

if __name__ == "__main__":
    # 用户交互模式
    while True:
        print("\n" + "="*40)
        title = input("请输入电影/电视剧名称 (输入q退出): ").strip()
        if title.lower() == 'q':
            break
            
        result = get_recommendation(title)
        
        if "错误" in result:
            print(f"\n❌ {result['错误']}")
        else:
            print("\n🎬 推荐结果:")
            print(f"推荐指数: {result['推荐指数']} ({result['评价等级']})")
            print("\n📖 详细信息:")
            for k, v in result["详细信息"].items():
                print(f"{k}: {v}")

8.依次运行脚本,测试观影推荐小助手先

找到test目录,执行D:,在执行cd test
在这里插入图片描述
python prepare_data.py
在这里插入图片描述
set HF_ENDPOINT=https://hf-mirror.com
在这里插入图片描述
python train.py
在这里插入图片描述
python predict.py
输入我们json文件中有的title,比如我这里输入的就是:Lack of Cockery
在这里插入图片描述
通过显示的结果,可以看到这个电影的详细信息,同时还有推荐结果!是不是非常简单!

总结

通过上述步骤,我们利用亮数据提供的免费数据集以及相关工具,就完成了从数据获取、到AI 模型训练、再到最终创建观影小助手的全过程。借助动态住宅代理解决了数据采集难题,按照相应流程配置运行环境、编写并运行各个脚本,实现了输入电影或电视剧名称就能获取其相关信息并给出观看推荐的功能。这一整套流程为有兴趣利用AI 打造个性化应用的朋友们提供了一个可参考的示例,大家可以依此探索更多有趣且实用的AI 应用开发!Bright Data还有更多优惠套餐,快来体验下吧!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐