Web Programming Lab1: Building a Node.js web crawler
目录
目录
Web Programming Lab1: Building a Node.js web crawler
(2) 为爬虫的request请求设置header,防止被网站403 forbidden
(4) 利用node-schedule设置定时任务,不停地爬取文章
(5) 解析爬取的html,将unique url放入数据库
(2) 为爬虫的request请求设置header,防止被网站403 forbidden
(4) 利用node-schedule设置定时任务,不停地爬取文章
(5) 解析爬取的html,将unique url放入数据库
爬虫部分
Target:
1、完成最少一个目标网站(网站主题不限,不允许直接使用示例中的中国新闻网)的分析和爬虫设计。
2、爬取不少于100条数据(每条数据包括最少3个字段,标题、内容和时间),并存储在数据库中。
Prerequisite:
1、详细描述对目标网站的分析过程。
2、详细描述爬虫整体结构,使用的工具包,以及数据库设计。
可以看到,我们的目标是爬取不少于100条数据,同时为了我们数据的分布在类别上更加的general,我们希望得到不同类别的新闻网站,因此在这里我爬取了三个类别的不同网站429条的数据,希望可以做到老师要求的数据分布。
因此我写了三个crawl javascript文件,其实三个文件的结构是一样的,为了更加清楚地说明我们爬虫的结构和方式方法,我将对一个爬虫js进行举例。
Step 1:目标网站分析
这次我选择爬取的网站是中国科技网,中国艺术网和中国地产网。
本文以中国科技网为例进行分析:http://tech.china.com.cn/
可以看到,中国科技网的门户如图所示,我们需要先纵观这个网站的结构,可以看到我们需要爬取的结构。
首先我们应该观察网站URL和每一篇文章URL的关系:
可以看到,每一个文章的URL其实就是网站URL+类似/phone/20210428/376772.html这样一个结构。
因此我们就找到了第一个关键点:确保解析目标网站的子网站,也就是我们需要爬取的文章。
这个是我写的关于url的正则表达式,可以看到和网站上的是一一对应的。
接下来,我们需要观察网页的html结构,看看我们需要的内容在哪里获得。
可以看到我们需要一些信息,在meta元信息下面可以唯一定位,所以我们在我们的代码里面写上对应的表达式:
此外我们也应该注意到一个问题,就是全文的内容并不是一个meta信息,因此我们怎么找到全文的信息呢,我自己的方法是这样的:
打开开发者模式,移动鼠标找到左侧对应全文的模块,这个时候左上角Chrome浏览器会自动跳出对应的应用id,如图:
我们就拿到了这个全文的id,将数据库的内容存储进去。
Step 2:设计数据库结构
很多人觉得应该开始写爬虫代码了,但其实在一个开发流程中,数据库的设计一定优先于代码的编写,好的code design可以节省大量debug的时间,因此这里我们应该先进行数据库的设计。
我们的数据库结构一共有10个column:
其中id_fetches是primary key全局唯一,同时在我们的后台确保url唯一,content作为longtext,为了加快查询,我在作者和标题的field使用了普通索引,在content的field使用了全文索引加快搜索。
Step 3:爬虫结构设计
引用的包:
Request | 发送HTTP请求,让服务器获得对应的请求 |
Cheerio | 为服务器实现的JQuery核心快速,爬虫工具包 |
iconv-lite | 对response请求转码 |
data-utils | 提供JavaScript缺少的函数集合 |
node-schedule | 定时调度任务工具库 |
下面我们分析一下一个爬虫大体逻辑:
- 设置获取参数的格式,与网页html相对应
- 为爬虫的request请求设置header,防止被网站403 forbidden
- 使用request模块异步的fetch url
- 利用node-schedule设置定时任务,不停地爬取文章
- 解析爬取的html,将unique url放入数据库
所以我们按图索骥。
(1) 设置获取参数的格式,与网页html相对应
(2) 为爬虫的request请求设置header,防止被网站403 forbidden
这里如果依然被forbidden,可以加入多个agent逃过网站的屏蔽
(3) 使用request模块异步的fetch url
(4) 利用node-schedule设置定时任务,不停地爬取文章
(5) 解析爬取的html,将unique url放入数据库
判断是否有重复URL
搜索网站部分
为了页面展示的简介清晰,我使用了已有的JQuey库帮助我的美化。在Github上一个外国老哥的推荐了下,我使用了一个模板进行包装我们的搜索网站。搜索网站的关键是将结果展示的清晰而不是炫技,所以我放弃了大色块进行美化。
其中我使用了一个dashboard记录爬取的目标网站数目以及当前的有效IP数,以及爬取的总记录数,异常数和服务器开启 | 爬虫的时间,以及全局新闻的热度。
这个部分其实很简单,只要在数据库中维护一个记录就行了,可以让我们的网站更加清晰整洁。
- 搜索部分
后台利用express框架配合ejs渲染引擎
同时支持内容搜索和标题搜索
将返回的内容展示在表格中:
可以看到,我们需要搜索的科技相关文章放在了表格中。
- 时间热度分析
我们在后台把关于关键词相关的新闻数量进行一个groupBy并输出:
之后利用一个Jquery的图表框架进行展示:
总结
以上就是我的web programming实验一的全部内容了,通过这次实验,我学会了爬虫相关技巧和node.js搭建一个简易网站的过程。爬虫被403的过程是艰辛的,前后端交互的过程debug是辛苦的,经过大概两个月的工作,终于完成了实验要求的功能并加以美化,感谢一直给我解答问题的王老师和各位助教,感谢你们的帮助~