前言
以下是业务流程:
• 打开 github.com/trending 页面;
• 选择 JavaScript 语言,时间设置为最近一个月,查看排行榜。
• 在排行榜内,获取到仓库名称,仓库地址,仓库当前的 star 数量,以及仓库的作者名。
• 将提取的数据,汇总为一个 Array,保存到mysql数据库。
• 表名为 tbl_github_trending。字段有 id, repo_name, repo_url, repo_star, repo_author, created_at, updated_at。
为了实现这个功能,我们需要使用 Node.js 中的一些模块,包括 和 。
• 是一个 Node.js 库,它提供了一个高级 API,可以通过编程方式控制一个 Chromium 或 Chrome 浏览器的实例。
• 是一个 Node.js 库,用于连接和操作 MySQL 数据库。
以下是代码示例,其中包括了连接 MySQL 数据库、使用 puppeteer 抓取数据、写入数据到数据库等步骤。其中数据库信息部分,替换为你的MySQL数据库配置即可。
在以上示例中,浏览器示例要手动关闭,数据库示例则无需手动维护,在程序结束时,自动断开。
爬取页面常见bug
在爬取 Github Trending 页面时,可能会遇到以下一些bug:
1.Github 反爬虫机制:Github有反爬虫机制,例如请求频率限制、IP封禁、人机验证等,如果触发,可能导致拒绝访问或被封禁IP地址。
2.页面渲染:Github 使用 JavaScript 动态渲染页面,这可能导致无法正确解析页面,从而无法获取到需要的数据。
3.Github API 限制:如果使用 Github API 来获取数据,可能会受到 Github API 的访问限制,例如每小时访问次数限制、每分钟访问次数限制等。
4.认证问题:有些页面的数据,是需要登录验证才能访问到的。这就要求处理登录验证的流程。
优化数据库操作部分
上面写入数据库记录的代码,我们改进一下。如果仓库repo_name已存在,那么仅更新字段;如果不存在,再创建。
原生的MySQL语句不够优雅,换成orm的方式
这里演示使用 Sequelize ORM 库的代码:
在本示例中,我们首先定义了一个 模型,并使用 方法将其同步到数据库。
接下来,我们定义了一个 函数,使用 方法来检查仓库名称是否已经存在。如果数据已经存在,则更新记录,否则就创建新记录。
在更新记录时,只需更新需要修改的字段,然后调用 方法保存更改。
注意,在模型定义中,使用了 选项来启用自动管理 和 字段的功能。
小结
本文从github趋势页的爬取,以及数据库操作两部分,演示了nodejs是如何实现功能的。特别地,现代前端页面一般为重JS应用,页面在多个文件、多个数据源加载完成之后,可能才能获取到想要的数据。这一点是获取页面数据,绕不过的地方,也是最考验开发者功底之处。
领取专属 10元无门槛券
私享最新 技术干货