从零开始用nodejs爬虫
web编程课的第一个项目,写这个爬虫的过程中真的遇到了很多困难,走了很多弯路,最早遇到的困难是从来没有接触过Javascript,看老师上课的示例代码什么的都非常吃力,于是去找了很多教程学习,但是看了跟没看一样,代码拿到手上还是什么都看不懂。后来受到启发,学习一样东西的最好办法就是去使用它,光看是看不会的,只有自己上手实践才能慢慢掌握。希望我能够在这次爬虫的学习中有所收获,希望我能顺利完成这个项目。
项目要求
项目示例1
使用老师提供的实例1时我就遇到了很多莫名其妙的问题,先是下载node.js但是npm死活安装不了,到处找解决方法未果后,在同学的推荐下下载了VSCode。但是新的问题又来了,正当我怀着满腔热情想要以“hello world”作为我的js编程的开始时,不断跳出的“无调试适配器”给我浇上了一盆冷水。找了半天也没整明白到底问题出在哪,最后还是万能的重装解决了我的问题。
接下来是实例代码及效果的展示
出于好奇把实例代码中的网址换成腾讯体育NBA专栏的网址,看看会发生什么
果然,爬了个寂寞。
项目示例2
示例2的爬虫目标:
开始示例2的代码前,我先观看了老师的教学视频让自己心中有个大概的框架,看完视频后我又兴致勃勃地准备开始运行示例2的代码,结果编译器又是一顿报错。检查加求助了半个小时之后,原来是因为我把老师说的“npm install ***”,理解成了真的就是执行“npm install ***”这句话。
这个小插曲过后,我顺利地运行了示例2,但是调试运行台显示其中有一个种子中的新闻链接识别出错
来与正常的做个对比
观察爬取失败的新闻,发布日期是2018-01-17,而其他的2020-04-22以后的,或许与爬取失败的原因与发布日期有关?
项目示例3
这次的项目涉及到MySql数据库,和前两次一样,先跑跑看老师的代码
结果不管怎么查询数据库都是空的,仔细检查,发现调试控制台里显示我跑的代码似乎一直都是前一个示例
手动将launch.json中的program更改一下再运行试试
依然报错
问了好多同学都没解决这个问题,再问了老师之后,我仔细检查发现,我保存的mysql.js文件,多了一个空格
修改之后终于运行成功了
项目示例4
示例4的目标如下
先上代码
7.01的代码与在cmd界面中使用“select title,author,publish_data from fetches where title like’%新冠%’”的效果相同,都能达到使用mysql进行查询已爬取数据的目的。
接下来是创建前段和后端,同样运行一下示例代码,在前端网页输入查询关键词后,查询结果在后端显示出来了
再下一步需要用表格显示查询结果,但是在用express脚手架搭建网站时遇到了麻烦,安装了数个包后运行指令还是报错
上网查询似乎是express4.0以后版本的安装问题,自己一通瞎捣鼓环境变量之后没有任何效果,求助助教学姐后总算是成功搭建起了这个脚手架。
此时我们可以看到,在目标文件夹中出现了一个名为search_site的文件夹,接下来我们在这个文件夹里安装一系列所需要的包
正当我以为自己离成功实现代码只有一步之遥时
上网查询发现应该是环境变量的问题,修改未果后再次使用重装大法,但是我没想到的是,这次重装就是我噩梦的开始
重装完之后helloworld都跑不了了,加上远程教学没法让问题非常清晰地展示出来,问了助教学姐也没能解决。
我怀疑可能是自己在装express包的时候修改了环境变量,但是当初改之前忘了存个截图啥的方便改回去,瞎倒腾了一下午,电脑都差点给我干废了。
先写到这里吧,看看明天能不能有办法解决。
新的一天,我再次打开vscode,开始排查出现这种情况的原因,最后把范围缩小在了launch.json文件上,对program修改以后,再次尝试运行,代码终于又能跑起来了。
接下来继续昨天的步骤,此处省略重新建立mysql数据库的故事
准备完全之后再次输入指令node bin/www,这次没有再跳出让人崩溃的那句话,但是cmd窗口没有反应了,询问老师得知原来是正常情况,只要打开网页输入查询按钮就行了。
接下来跳过我输错网页浪费的几个小时无意义纠错时间,直接上图
到此,老师提供的项目示例总算是全部跑通了,接下来就到了我自己选择页面进行爬取的时候了。
首先我们需要理解老师的爬虫代码的原理,理解原理后依葫芦画瓢就能够爬取我们自己想要的页面了。这个过程中最大的困难就是正则表达式的学习了,使用工具可以帮助我们学习正则表达式,以下附上我在学习时使用的两个网页
https://regex101.com/
https://c.runoob.com/front-end/854
接下来要做的就是解析我们要爬取的页面的URL,我本来想选择腾讯体育的NBA专栏作为我的目标,但是正则表达式实在是有些陌生,所以我选择了更容易解析的虎扑体育作为我的目标,运行之后
转码成功但是又出现了一个我没有见过的问题,询问老师之后得知应该是date为空报错了。
目前的项目进度大概就到这里,想要达成要求我还需要继续学习正则表达式和解析源代码,作为作业来说并不合格,希望自己在这两天内能够尽快掌握这些。感谢我在赶ddl时我的同学们给我的帮助,感谢王老师和助教学姐不厌其烦地解答我的问题(有些真的很蠢)。