使用 nodejs 写爬虫 (二): 抓取 github 热门项目

使用 nodejs 写爬虫 (二): 抓取 github 热门项目

💡 原文中文,约7200字,阅读约需17分钟。
📝

内容提要

本文介绍如何用 Node.js 编写爬虫抓取 GitHub 高星项目:先分析搜索页 GET 请求参数,确认无需请求头;再用 superagent 获取源码,cheerio 解析项目名、作者、语言、star 数等信息并存入 JSON;支持按页或全部抓取,并用 readline-sync 实现命令行交互。

🔎

延伸解读

爬虫基础技能要求

文章指出,编写爬虫需要综合能力:理解HTTP协议以分析请求响应,可使用Chrome DevTools、Postman或Charles等工具;掌握正则表达式处理字符串;并了解常见反爬虫机制,如检查cookies、host和referer头、隐藏字段、验证码、访问频率限制、代理及SPA网站等。这些是应对爬虫挑战的基础。

GitHub搜索技巧与请求分析

通过GitHub搜索时添加star数过滤条件(如stars:>60000)可找到高星项目。搜索结果页是GET请求返回HTML,URL参数包括p(页码)、q(查询内容)、type(类型)。用curl测试发现无需请求头和cookies即可获取页面,简化了爬虫实现。

数据解析与存储实现

使用superagent获取网页源代码,cheerio解析项目信息,抽象出Repository类存储项目名、作者、语言、star数等字段。解析时需注意有些仓库无语言信息,以及区分star链接和issues链接。数据可序列化为JSON文件保存,支持按页或全部抓取。

命令行交互与注意事项

通过readline-sync实现命令行交互,让用户输入star下限、选择抓取模式(某一页、一定页数或所有页),并决定是否保存。注意在Windows的git bash中可能出现中文乱码,可切换编码为UTF-8解决。

❓

Q&A

如何用 Node.js 爬取 GitHub 上 star 数超过一定数量的项目?

通过 GitHub 搜索页的 GET 请求,使用参数 q=stars:>60000 来筛选 star 数大于 60000 的项目,然后用 superagent 获取页面源代码,再用 cheerio 解析出项目信息。

爬取 GitHub 搜索页时,需要设置请求头或 cookies 吗?

不需要。通过 curl 测试发现,直接请求搜索页 URL 就能正常返回页面源代码,因此爬虫脚本无需添加请求头和 cookies。

用 cheerio 解析 GitHub 项目列表时,如何提取项目名、作者、语言和 star 数?

每个项目在 li.repo-list-item 中。项目名和作者从 h3 a 的文本按 '/' 分割获得;语言从 .repo-language-color 的父 div 文本获取(可能为空);star 数从 .muted-link 链接中获取(注意区分 issues 链接)。

如何实现抓取 GitHub 搜索结果的多个页面?

可以编写 crawlProjectsByPagesCount 函数,根据指定的页数生成任务数组,使用 Promise.all 并发抓取每一页,然后合并所有结果。如果不指定页数,则先获取总页数再抓取全部。

怎样让 Node.js 爬虫支持用户交互,比如输入 star 下限和选择抓取模式?

使用 readline-sync 库同步获取用户输入。通过 questionInt 获取 star 数量下限,用 keyInSelect 让用户选择抓取模式(某一页、一定页数或所有页),再用 keyInYN 询问是否保存和继续。

爬取到的 GitHub 项目数据如何保存到本地?

将项目信息实例化为 Repository 对象,然后调用 Repository.saveToLocal 方法,使用 fs-extra 的 writeJSON 将数据以 JSON 格式写入 out/repositories.json 文件。

🏷️

标签

➡️

继续阅读