测试题:
0. 请问 URL 是“统一资源标识符”还是“统一资源定位符”?
1. 什么是爬虫?
2. 设想一下,如果你是负责开发百度蜘蛛的攻城狮,你在设计爬虫时应该特别注意什么问题?
3. 设想一下,如果你是网站的开发者,你应该如何禁止百度爬虫访问你网站中的敏感内容?(课堂上没讲,可以自行百度答案)
4. urllib.request.urlopen() 返回的是什么类型的数据?
5. 如果访问的网址不存在,会产生哪类异常?(虽然课堂没讲过,但你可以动手试试)
6. 鱼C工作室(http://www.fishc.com)的主页采用什么编码传输的?
7. 为了解决 ASCII 编码的不足,什么编码应运而生?
动动手:
0. 下载鱼C工作室首页(http://www.fishc.com),并打印前三百个字节。
1. 写一个程序,检测指定 URL 的编码。
演示:
提示:
提供个“电池”给你用 -> 一次性解决你所有的编码检测问题
2. 写一个程序,依次访问文件中指定的站点,并将每个站点返回的内容依次存放到不同的文件中。
演示:
urls.txt 文件存放需要访问的 ULR:
执行你写的程序(test.py),依次访问指定的 URL 并将其内容存放为一个新的文件:
图一时之快先看答案,您将失去一次锻炼的机会!
请先自己动手,再回复查看参考答案。
测试题答案:
0. 请问 URL 是“统一资源标识符”还是“统一资源定位符”?
答:往后的学习你可能会经常接触 URL 和 URI,为了防止你突然懵倒,所以在这里给大家简单普及下。URI 是统一资源标识符(Universal Resource Identifier),URL 是统一资源定位符(Universal Resource Locator)。用一句话概括它们的区别:URI 是用字符串来标识某一互联网资源,而 URL 则是表示资源的地址(我们说某个网站的网址就是 URL),因此 URI 属于父类,而 URL 属于 URI 的子类。
1. 什么是爬虫?
答:爬虫事实上就是一个程序,用于沿着互联网结点爬行,不断访问不同的网站,以便获取它所需要的资源。
2. 设想一下,如果你是负责开发百度蜘蛛的攻城狮,你在设计爬虫时应该特别注意什么问题?
答:不要重复爬取同一个 URL 的内容。假设你没做这方面的预防,如果一个 URL 的内容中包含该 URL 本身,那么就会陷入无限递归。
3. 设想一下,如果你是网站的开发者,你应该如何禁止百度爬虫访问你网站中的敏感内容?(课堂上没讲,可以自行百度答案)
答:在网站的根目录下创建并编辑 robots.txt 文件,用于表明您不希望搜索引擎抓取工具访问您网站上的哪些内容。此文件使用的是 Robots 排除标准,该标准是一项协议,所有正规搜索引擎的蜘蛛均会遵循该协议爬取。既然是协议,那就是需要大家自觉尊重,所以该协议一般对非法爬虫无效。
4. urllib.request.urlopen() 返回的是什么类型的数据?
答:返回的是一个HTTPResponse的实例对象,它属于http.client模块。
复制代码
调用其read()方法才能读出URL的内容。
5. 如果访问的网址不存在,会产生哪类异常?(虽然课堂没讲过,但你可以动手试试)
答:HTTPError
6. 鱼C工作室(http://www.fishc.com)的主页采用什么编码传输的?
答:UTF-8 编码。
一般网页通过点击审查元素,在 标签中的 charset 会显示采用了哪种编码。
7. 为了解决 ASCII 编码的不足,什么编码应运而生?
答:Unicode 编码。扩展阅读关于编码的那篇文章太长了,有鱼油说太生涩难懂,对于对编码问题还一头雾水的鱼油请看 -> 什么是编码?
动动手答案:
0. 下载鱼C工作室首页(http://www.fishc.com),并打印前三百个字节。
代码清单:
复制代码
1. 写一个程序,检测指定 URL 的编码。
代码清单:
复制代码
2. 写一个程序,依次访问文件中指定的站点,并将每个站点返回的内容依次存放到不同的文件中。
代码清单:
import urllib.request
response = urllib.request.urlopen('http://www.fishc.com')
print(response.read(300))
import urllib.request
import chardet
def main():
url = input("请输入URL:")
response = urllib.request.urlopen(url)
html = response.read()
# 识别网页编码
encode = chardet.detect(html)['encoding']
if encode == 'GB2312':
encode = 'GBK'
print("该网页使用的编码是:%s" % encode)
if __name__ == "__main__":
main()