从培训班出来后,我靠一个爬虫项目敲开了大厂的门

乐观锁玩家
2025-12-27 00:35
阅读 293

大家好,我是阿杰,一名刚从“前端速成班”毕业三个月的新人。别笑!我知道很多人对培训班有偏见,但我想说:只要肯动手,谁都能逆袭。我当初学的时候,连 console.log 都打错成 consoel.log,被 Chrome 控制台疯狂报错嘲讽 😭。

但就在上个月,我把自己的第一个开源项目——一个用 JavaScript 写的简易网页爬虫——传到了 GitHub 上,居然收获了 87 个 star!更离谱的是,某大厂 HR 主动私信问我有没有兴趣聊聊实习岗位……

今天,我就手把手带你从 零基础 开始,做出你人生中第一个能跑的 JavaScript 爬虫项目。不用怕“爬虫”听起来多高大上,其实它就是个自动帮你“抄网页内容”的小机器人。咱们不碰法律红线,只爬公开、允许抓取的数据(比如天气、新闻标题)。

准备好了吗?一杯奶茶的时间,带你从“Hello World”走向“Hello GitHub”!


为什么是 JavaScript + 爬虫?

很多新手一听到“爬虫”,第一反应是:“那不是 Python 干的事儿吗?”
没错,Python 的 requestsBeautifulSoup 确实强大。但!作为前端学员,我们天然拥有 JavaScript 这把利器——而且浏览器本身就是最好的运行环境!

更重要的是:用 JS 做爬虫,能让你同时练到网络请求、DOM 操作、异步编程三大核心技能。面试官问“你会处理 API 吗?”,你直接甩出自己写的爬虫项目,比背八股文香多了!

💡 我当初学的时候,死记硬背 fetchasync/await 总是混淆。直到自己写了个爬豆瓣电影的 demo,才真正搞懂——原来“等待数据回来”就像等外卖,不能边等边吃,得等到了才能开动!


第一步:搭环境,三分钟搞定

别被“开发环境”吓到!我们要做的爬虫项目,不需要装 Node.js、不用配 Webpack,打开浏览器就能跑!

所需工具清单:

工具 用途 是否必须
Chrome 浏览器 运行和调试代码 ✅ 必须
VS Code(或任意文本编辑器) 写代码 ✅ 必须
一个支持 CORS 的代理(后面会讲) 绕过浏览器安全限制 ⚠️ 临时需要

📌 注意:浏览器出于安全考虑,默认禁止跨域请求(CORS)。但我们用一个小技巧就能绕过——用第三方代理服务!先别慌,我会一步步教你。

创建你的第一个项目文件夹

  1. 在桌面新建一个文件夹,比如叫 my-first-crawler
  2. 里面新建一个文件:index.html
  3. 再新建一个文件:crawler.js

搞定!这就是你的“项目”了,简单到哭。


第二步:JavaScript 爬虫的核心原理(说人话版)

想象你要去图书馆抄一段书的内容:

  1. 你走到书架前 → 相当于浏览器发起 HTTP 请求
  2. 你找到那本书 → 服务器返回 HTML 页面
  3. 你翻到第 50 页,抄下标题 → 用 JS 解析 DOM,提取目标数据

在 JS 里,这三步对应:

  • fetch() 发请求
  • DOMParser 把 HTML 字符串变成可操作的对象
  • querySelectorgetElementById 找到你要的元素

是不是瞬间接地气了?


第三步:动手!写一个爬“今日天气”的小工具

咱们的目标:爬取 https://wttr.in(一个极简天气服务)的当前城市天气,并显示在网页上。

✅ 该网站明确允许非商业爬取,且返回纯文本,非常适合新手!

Step 1:写 HTML 骨架

index.html 中输入以下内容:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>我的第一个爬虫</title>
</head>
<body>
  <h1>🌤️ 今日天气预报</h1>
  <button id="getWeather">点击获取天气</button>
  <div id="result" style="margin-top: 20px; font-size: 18px;"></div>

  <script src="crawler.js"></script>
</body>
</html>

这个页面很简单:一个按钮 + 一个显示区域。

Step 2:写 JavaScript 爬虫逻辑

打开 crawler.js,开始编码!

// 获取按钮和结果显示区域
const button = document.getElementById('getWeather');
const resultDiv = document.getElementById('result');

// 给按钮绑定点击事件
button.addEventListener('click', async () => {
  try {
    // 显示“正在加载”
    resultDiv.textContent = '⏳ 正在获取天气...';

    // 使用代理绕过 CORS 限制
    const proxyUrl = 'https://api.allorigins.win/raw?url=';
    const targetUrl = 'https://wttr.in/?format=3'; // 只要一行简洁天气

    // 拼接最终请求地址
    const fullUrl = proxyUrl + encodeURIComponent(targetUrl);

    // 发起请求
    const response = await fetch(fullUrl);
    const weatherText = await response.text();

    // 显示结果
    resultDiv.textContent = `🌤️ ${weatherText.trim()}`;
  } catch (error) {
    resultDiv.textContent = '❌ 获取失败,请检查网络';
    console.error('错误:', error);
  }
});

代码逐行解释(新手友好版):

  • async/await:让 JS “等”数据回来再继续执行,避免乱序
  • api.allorigins.win:这是一个免费 CORS 代理,帮我们转发请求
  • encodeURIComponent:把网址转成安全格式,防止特殊字符出错
  • trim():去掉天气文本前后的空格,看起来更干净

🔥 我当初学的时候,总忘记写 await,结果 response 是个 Promise 对象而不是真实数据,控制台打出 [object Promise],一脸懵。记住:凡是有 .then() 的地方,基本都能改成 await


第四步:测试你的爬虫!

  1. 双击打开 index.html(用 Chrome)
  2. 点击“点击获取天气”按钮
  3. 等待 1-2 秒,你应该看到类似这样的结果:
🌤️ 北京: ☀️ +28°C

恭喜!你刚刚完成了一个真正的网络爬虫!虽然简单,但五脏俱全。


进阶挑战:爬取网页中的结构化数据

刚才爬的是纯文本,现在我们试试爬 带 HTML 结构的网页,比如新闻标题。

目标网站:https://example.com(这是个官方测试域名,内容固定)

改造思路:

  1. 获取整个 HTML 页面
  2. DOMParser 解析成虚拟 DOM
  3. querySelector 提取 <h1> 标题

修改 crawler.js

// 新增一个按钮用于测试新功能(你可以在 HTML 里加)
// 这里我们复用同一个按钮,按需切换逻辑

let mode = 'weather'; // 初始模式

button.textContent = '点击获取天气(再点换新闻)';
button.onclick = null; // 清除旧事件
button.addEventListener('click', async () => {
  if (mode === 'weather') {
    // ...(之前的天气代码)
    mode = 'news';
    button.textContent = '点击获取新闻标题';
  } else {
    // 新闻爬取逻辑
    resultDiv.textContent = '📡 正在抓取新闻...';
    try {
      const proxy = 'https://api.allorigins.win/get?url=';
      const newsUrl = 'https://example.com';
      const res = await fetch(proxy + encodeURIComponent(newsUrl));
      const data = await res.json(); // allorigins 返回 JSON 格式
      const parser = new DOMParser();
      const doc = parser.parseFromString(data.contents, 'text/html');
      const title = doc.querySelector('h1').textContent;
      resultDiv.innerHTML = `📰 新闻标题:<strong>${title}</strong>`;
      mode = 'weather';
      button.textContent = '点击获取天气';
    } catch (e) {
      resultDiv.textContent = '❌ 新闻抓取失败';
    }
  }
});

⚠️ 注意:这次用了 allorigins.win/get 而不是 /raw,因为它会返回包含 HTML 的 JSON 对象,方便解析。


新手常踩的 5 个坑 & 解决方案

问题 原因 解决办法
点按钮没反应 JS 文件没正确引入 检查 <script src="crawler.js"> 路径是否正确
控制台报 CORS 错误 浏览器阻止跨域请求 务必使用代理(如 allorigins.win)
fetch 返回 undefined 忘记 await 或没处理 Promise async/await,并在 try/catch 中包裹
爬不到想要的内容 网站用了动态渲染(如 React/Vue) 初期避开 SPA 网站,选静态 HTML 页面
数据乱码或带标签 没正确解析 HTML DOMParser,别直接 innerHTML

🛑 特别提醒:不要爬需要登录的网站、不要高频请求、不要爬隐私数据!遵守 robots.txt 规则,做个有底线的程序员。


你的第一个开源项目,就从这里开始!

现在,你已经有了一个能跑的爬虫 demo。下一步,把它变成 GitHub 上的开源项目:

  1. 注册 GitHub 账号(如果还没有)
  2. 在项目根目录新建 README.md,写清楚:
    • 项目是干嘛的
    • 怎么运行(“双击 index.html 即可”)
    • 示例截图(可用文字描述:“点击按钮后显示:🌤️ 北京: ☀️ +28°C”)
  3. 初始化 Git,推送到 GitHub
git init
git add .
git commit -m "feat: first crawler demo"
git branch -M main
git remote add origin https://github.com/你的用户名/my-first-crawler.git
git push -u origin main

💬 我当初 push 失败十几次,因为忘了 git remote add。别怕错,每个程序员都是在红字报错中成长的!


学完这篇,下一步学什么?

你已经掌握了:

  • 浏览器端 JS 发请求
  • 处理异步数据
  • 解析 HTML 提取信息

接下来建议:

  1. 学 Node.js:让爬虫脱离浏览器,在服务器上跑(用 axios + cheerio
  2. 学 Puppeteer:控制无头浏览器,爬动态渲染页面
  3. 做更有用的项目:比如自动监控商品价格、抓取招聘信息等

但记住:别贪多!先把今天的 demo 跑通、改改、玩明白。我见过太多新手,教程看了 20 个,代码一行没写。


最后说两句心里话

培训班教会我语法,但真正让我成长的,是亲手做出一个能跑的东西。哪怕它只有 20 行代码,哪怕全世界只有你自己用——那也是你能力的证明。

所以,别等“准备好”。现在,立刻,马上,打开你的 VS Code,新建那个 index.html
代码不会骗人,你敲下的每一行,都在为未来的 offer 加分

我在 GitHub 等你来 star 你的第一个项目!✨

🌟 项目灵感来自真实经历。如果你觉得这篇教程帮到了你,不妨在评论区留下你的 GitHub 链接,我们一起互关互赞!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝