实验题目1
实验要求
用任意编程语言,但不调用任何网络应用库或模块,直接使用socket编程,编写一个HTTP协议的爬虫,描写它支持的HTTP语法,并在超过1000个网站上进行测试,在报告里写一下你如何选择和编制网站列表,发现了什么现象,有什么统计规律,对观察到的互联网有什么看法?
这里我的编程语言选择为python,适用于GET请求;
首先我们需要一段爬虫代码,上网搜索了一圈,写出代码如下:
在编写代码时,我遇到一些问题,在这里做一个小的总结
1. python转义字符’ \ ’
我的代码是先从一个存放了若干使用http协议的网站的txt文件中读取这些网站在逐一进行测试,文件的选取是通过一个绝对路径写入。此处的文件路径的’ \ '一定要多写一个,否则会执行错误;
2. UTF-8编码
这里采用UTF-8解码;
3. 无法解码问题
这里的红框框的内容如果不写的话可能会在运行时出现以下警告信息:
Traceback (most recent call last):
File "D:\Software\vscodeFile\test\1.py", line 32, in <module>
if '200 OK' in response.decode():
^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7 in position 1359: unexpected end of data
这个错误可能是由于服务器返回的数据不是UTF-8编码的。
在try代码块中,使用UTF-8编码对接收的数据进行解码,如果出现UnicodeDecodeError,则忽略该错误。在except代码块中,打印出错误消息,以便于调试问题。
4. 分网站输出txt
在代码中这条字段的目的就是根据不同的url来输出对应的响应报文,并保存在以该url命名的txt文件中
测试网站列表
测试网站(若干)都保存在名字为http_web的txt文件中,和网络爬虫代码所在的1.py在同一个文件夹下;
下面是测试网站的部分截图:
部分站点的响应信息
在测试代码运行之后,每个测试网站的响应信息都被写入一个以他名字命名的txt文档当中:
在所有txt文档中:
在相应信息的头部之前都会输出一个段信息这是我在我自己的爬虫代码中添加输出的,用于标识是否能成功的从该网站爬取信息
若成功则形如:
若不成功则形如:
在相应信息的末尾都会有这个字段,这是我在我自己的爬虫代码中添加输出的,其实原本是因为所有信息都输出到了一个txt文档当中,加入这个字段用于区分不同网址的响应信息,使得不同网站的响应信息可以相互分隔开来,使得条理更加清晰:
www.163.com
www.aliyun.com
www.baidu.com(少数状态码为200)
www.douban.com
www.ifeng.com
www.jd.com
www.qq.com
www.sina.com.cn
www.sohu.com
www.taobao.com
实验第一部分总结
现象和统计规律
从响应报文的情况来看,只有少数网站站点的返回信息为200,例如www.baidu.com;其余多数网站都返回了301(所请求的资源已经被永久移动到新的位置。),302(请求的资源临时被移动到新的位置。),403(服务器拒绝访问请求的资源)。
大部分网站现如今都使用HTTPS协议,已经很少有网站直接使用http协议了。特别是对于一些需要账号密码登录的页面来说,如果直接使用http协议无疑是致命的。即使直接使用http协议也会进行一些相应的手段,例如湖南大学的个人门户登录网页使用的虽然是http协议,但他在密码处做了加密,以及相应的处理,使得即使获取了加密串也无法真正做到解密。
我自己的看法
虽然现代网站已经逐渐转向使用更安全、高效、灵活的协议,但是仍然有一些网站在使用HTTP协议。虽然HTTP协议存在一些安全和性能上的问题,但对于一些小型网站或简单的应用来说,使用HTTP协议可能并不会带来过多的风险和影响。但随着网络安全和性能要求的提高,越来越多的网站将会转向更加安全、高效的协议。
HTTP协议在互联网的早期发展阶段非常流行,因为它是一个简单、通用的协议,可以很容易地实现客户端和服务器之间的通信。但是随着互联网的快速发展和网站规模的不断扩大,HTTP协议的一些局限性和缺陷逐渐暴露出来,这些问题使得现在的网站使用HTTP协议已经变得不够适用了,主要原因包括:
- 安全性问题:HTTP协议是明文传输,因此容易被黑客攻击,窃取用户的敏感信息,如账号、密码等。
- 性能问题:HTTP协议是基于文本传输的,每个请求和响应的报文都很大,占用带宽和服务器资源较多,容易导致网络拥塞和服务器负载过高。
- 可扩展性问题:HTTP协议没有很好地支持一些新技术,如流媒体、实时通信等,无法满足现代网站的需要。
为了解决这些问题,出现了一些新的协议和技术,如HTTPS等,它们采用了更加安全、高效、灵活的方式进行数据传输,取代了HTTP协议成为现代网站的主流协议。
实验题目2
实验要求
用任意编程语言,编写网络爬虫,先后调用不少于5个网络应用库或模块,评测这些库支持的HTTP/HTTPS特性,并再找1000个网站进行测试,在报告里写一下你如何选择和编制网站列表,发现了什么现象,有什么统计规律,对观察到的互联网有什么看法?
我选择的编程语言是python;
以下是爬虫代码:
这个爬虫代码根据实验第一部分改编而来,对文件路径以及实现的功能作出了相应调整,调整部分如下:
-
http网站判断,即如果待测网址前没有http字段,那就默认为http网站;
-
加入待评测的特性
-
去除违规字符
因为在Windows下,创建文件命名中不能含有 ’ : ’ 和 ’ / ’ 字样,所以要对这些字符做一下替换;
部分待测试网站列表
这里选取了一些不需要科学上网就可以ping通的网址;
部分待测网站响应结果
可能是代码爬虫编写或者一些其他问题,我的结果输出看基本全是not supported,改了很多次也没有成功;
https_www.alibaba.com
https_www.baidu.com
https_www.huawei.com
后面我又尝试加入一些代理,使得爬虫可以科学上网去测试外国网站,不过返回的结果依旧全是not supported。。。。。。
在原爬虫基础上,加入以下字段配置代理:
科学上网网站测试列表
科学上网响应结果
https_www.bbc.com_
https_www.aljazeera.com_
实验第二部分总结
现象和统计规律
对于我自身的响应结果而言,基本上都是“is not supported”,但是如果真的自己去进行单个网站测试的话,抓到的响应报文很明显可以看到是支持某些特性的。这可能是与我爬虫的编写能力不足有很大关系。
我自己的看法
根据错误信息可以看出,该代码测试连接出错是因为在发起请求时无法解析主机名。具体来说,错误信息中提到了 getaddrinfo failed,这通常是由于无法将主机名解析为IP地址导致的。
这种问题通常可以由以下几个原因引起:
- 主机名错误:在测试过程中,可能会将错误的主机名用于请求,例如拼写错误、使用无效的域名等。
- DNS服务器问题:在使用DNS解析器时,可能会遇到DNS服务器故障或临时问题,导致无法解析主机名。
- 防火墙/代理问题:在某些情况下,网络上的防火墙或代理可能会阻止您的请求,导致无法解析主机名。