Web Programming Lab1: Building a Node.js web crawler

Web Programming Lab1: Building a Node.js web crawler

目录

爬虫部分

Step 1:目标网站分析

Step 2:设计数据库结构

Step 3:爬虫结构设计

目录

Web Programming Lab1: Building a Node.js web crawler

爬虫部分

Step 1:目标网站分析

Step 2:设计数据库结构

Step 3:爬虫结构设计

(1) 设置获取参数的格式,与网页html相对应

(2) 为爬虫的request请求设置header,防止被网站403 forbidden

(3) 使用request模块异步的fetch url

(4) 利用node-schedule设置定时任务,不停地爬取文章

(5) 解析爬取的html,将unique url放入数据库

搜索网站部分

总结


 

(1) 设置获取参数的格式,与网页html相对应

(2) 为爬虫的request请求设置header,防止被网站403 forbidden

(3) 使用request模块异步的fetch url

(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是辛苦的,经过大概两个月的工作,终于完成了实验要求的功能并加以美化,感谢一直给我解答问题的王老师和各位助教,感谢你们的帮助~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值