web编程期中大作业
爬虫实现
步骤1:知识储备
首先是知识储备,实现爬虫之前,我先学习了HTML,CSS,js,jQuery,mysql,正则表达式的相关知识,其中HTML用于实现前端,CSS用于美化2前端,js和jQuery用于实现主干程序,mysql用于创建本地数据库,将爬下来的文件储存以便在前端显示,正则表达式用于获取子网页网址。
步骤2:环境配置
首先,下载node.js
选择左侧版本下载即可,只需安装,无需过多特殊配置即可使用;
然后需要配置IIS,这个东西按照正常来说应该是无需配置即可直接使用的,但是实际操作过程中,当测试HTML,在Chrome中用地址访问本地文件时浏览器发生报错如下:
于是,我读IIS展开了调试:
搜索打开IIS管理器,并一路点击左侧小箭头,打开default web site界面
在右侧找到基本设置
原先出现问题的原因是物理路径不可用,这里显示的是已经更改好的版本,保证物理路径中不存在中文,且可被访问,解决问题;
然后,需要的是配置本地数据库mysql:
下载第一个轻量无需安装的版本即可。下载后,在c盘中创建一个mysql文件夹(方便找到),并将其安装入其中。
要注意的是,实际下载的是zip压缩包文件,需要解压才可使用。
然后开始配置,以管理员身份打开命令提示符:
然后打开mysql装入的文件夹:
之后,启动安装:输入命令mysqld –install;
初始化:mysqld --initialize --console,这里会生成一个初始密码;
然后启动数据库服务:net start mysql;
因为这里已经初始化过,所以图片中直接显示了服务已启动;
然后输入mysql -u root -v,登录数据库;
此处,命令行中显示Enter password,第一次登录时,输入之前显示的初始化密码即可;
进入后,将密码更改成自己的密码的,输入alter user 'root'@'localhost' identified by 'root'; ,这里‘’中的root 就是新的密码。使用quit退出数据库后,下一次登录,password中输入root即可;
然后我们需要授权从客户端中访问,输入指令:alter user 'root'@'localhost' identified with mysql_native_password by 'root';和flush privileges;
进入mysql后可创建一个数据库crawl,然后再创建一个表fetches,使用指令create database crawl;创建表格,然后输入use crowl以及如下指令
再输入show tables查看表格
到此为止,mysql就已经创建好了,接下来要做的是,让爬虫js文件可以调用这个数据库。
我们在爬虫文件所在文件夹下打开命令行,输入指令npm install mysql,在此创建数据库
然后,创建一个可以调用数据库的js文件,代码如下:
这样以后,在爬虫js文件中就可以通过var mysql = require(‘./mysql.js’)引包,调用相关函数以实现调用mysql。
至此,配置部分基本完成。
3.代码实现
首先呢,我么需要把网站中的内容爬如入数据库中:
建立模板,以网易新闻为例:
然后将我们的访问伪装成浏览器访问以防止被屏蔽:
接着,建立一个在进入一篇新闻网站后能读取页面中文章内容,标题,时间,作者,关键词等元素的函数,这个函数要查看页面的源代码并解析,通过选择器找到这些元素,选择器则要通过模板来更改,这里先只根据更改好的模板来展示代码:
然后,我们还需要一个函数,来进入每一个新闻页面,也就是说这个函数在进入新闻网站主页之后,要根据主页源代码查找到后面每一条新闻的网址:
根据这段代码,我们可以做到,将新闻文章爬取到数据库中,但是只做到如此,我们并不能根据想要的关键词查找文章,也做不到将爬下来的文章展示出来,所以我们还需要一个前端的输入想要查找的关键词、输出爬去得到的新闻标题的窗口:
首先我们创建一个HTML文件作为网页端(前端),代码如下:
然后,使用express建立后端用于实际查询:
这样就有了输入端口和后端处理程序;
不过为了较明朗的显示搜索结果,我们需要用express构建表格输出:
首先在js文件所在目录下用命令行输入express –e search_site构建网站框架:
因为这个网页需要访问数据库,所以将mysql文件放入文件夹内,便于调用;
接着,还需在对应文件夹下命令行运行命令npm install mysql –save将mysql包安装到该项目中,并且将依赖项保存进package.json里,再运行npm install将package.json中列举的依赖项全部安装,完成网站搭建。
然后用vscode打开该文件夹,对其中的/routes/index.js准备修改,修改为:
至此为止,一套完整的爬虫系统已经构建好。
使用方式如下:
先在search_site文件夹中打开命令行,命令行中输入node bin/www
然后打开Chrome浏览器,输入网址127.0.0.1:3030/search.html(因为之前爬了太多中新网的新闻,所以一搜索前边显示的都是中新网)
于是,爬虫文件成功实现!
4.更改模板,爬取更多新闻网站
首先我们看模板:
以网易新闻为例:
模板中需要更改的信息有:源名称(网易新闻),
网址:var seedURL = "https://news.163.com/"
字号:var myEncoding = "utf-8";
标题:var title_format = "$('title').text()";
内容:var content_format = "$('.post_body').text()";
发布时间:var date_format = "$('.post_info').text()";
获取子网站的正则表达式:var regExp = /(\d{4}(\-|\/|\.)\d{1,2}\2\d{1,2})/;
以及不需要修改的关键词:var keywords_format = ' $(\'meta[name="keywords"]\').eq(0).attr("content")';和描述:var desc_format = ' $(\'meta[name="description"]\').eq(0).attr("content")';
获取一个网站源代码中这些关键词的流程如下:
首先直接将网页网址复制粘贴入网址中
然后获取主页面源代码,找到各个子页面网址,
可以看到,网址有各自相同又比较有特点的地方,如这里的article,于是将它编写成网址的正则表达式(这里就是/article/就可以)
然后分别找到其余信息,以时间为例:
复制时间并在子页面源代码中查找:
得到它的id或者类,得到选择器之后,代入模板即可;
对于这些模板中的元素,原文中存在的,找到并代入选择器,不存在的,将模板连同后面对应的搜索的函数一起删除即可。
随后,执行爬虫文件:
下方终端显示大量转码读取成功,即说明,爬虫已经将新闻网站爬入数据库,接下来在search_site文件夹中打开命令行,命令行中输入node bin/www,再打开Chrome浏览器,输入网址127.0.0.1:3030/search.html即可搜索并查看已爬得的新闻了!!
结束语
太难了,太难了!但是,它真的爬起来的感觉好爽!!!