如何实现今日热榜这种排行网站?

2020-08-31 | 5,722浏览 | 0评论 | 标签:今日热榜

1.jpg

注意:以下探讨的方法和代码,全是个人推测,与他人无关。

“今日热榜”都知道吧? 就是你经常上班摸鱼的地方,类似的还有“鱼塘”,实现的核心就是“爬”。关于爬虫我之前写过一篇《nodejs抓取网站图片和文字》,使用node爬取了本博客图片和内容。今天在这个基础上,再尝试写一个外网版的今日热榜,去爬取国外网站的聚合网站,暂且命名“今日外网热搜榜” 。

首先定几个目标

  1. 目标是外国网站,要能翻,
  2. 上线后不需要人工参与,实现自动抓取,
  3. 定时任务,按时更新

技术选型

后端:爬虫Node+cheerio
前端:php(简单粗暴混合渲染)
管理端:php + mySql(能对网站及抓取内容进行人工监管)

实现思路

1. 墙

本地:request模块配置好proxy属性,具体请看官方文档。
线上:使用国外服务器
1.png

2. 爬取

node爬虫写法简单易上手,操作数据库也很轻松,特别适合这种简单粗暴的爬取任务。我以抓取台湾Mobile 01论坛“热门文章”栏目为例,地址 https://www.mobile01.com/hottopics.php 。F12肉眼分析网站html结构,使用cheerio提供类似jQuery方式的选择器,这对前端来说是逆天的好工具。接下来要做的就是提取标题、url等字段,存入数据库即可。

当然,有些网站可能会有不同的反爬策略,比较常见的是大家熟知的cloudflare 5秒金盾。反反爬不是本文要讨论的点,我也不是专家。只有特殊网站特殊处理,比如Mobile 01就使用了cloudflare,直接爬大概率会受阻,但它的移动端网页是没有金盾的。又比如有些网站,比如Reddit,网页结构复杂,且使用随机css类名,无法长期固定抓取,但它却提供了api让人调用。

2.jpg

3. 入库

今日热榜 有完整的登录、订阅等个性化功能。这些都不是必须的,我只需要直接展示爬取内容,因此数据库只需要两张表:网站信息表、新闻内容表。后端我是外行,就不细谈了。
3.jpg

4. 定时更新

你以为会有什么高科技? 并没有。拿起setInterval就是干。因为我的服务器提供了定时执行任务功能,我连setInterval都可以省了。(是的,本文就是这么水)
4.jpg

5. 展示

鉴于SEO以及懒,前端我直接使用php混合渲染,各位手里都是有货的,页面渲染这些我也就不细谈了。
具体效果可以点这里:今日外网热搜榜

暂时想记录的就这些,有兴趣的欢迎在下边留言交流,有错误欢迎指正。

(本篇完。有疑问欢迎留言探讨)

留言:

*

* (方便回复通知)

打赏
编辑代码 运行结果
退出