Python——论一只爬虫的自我修养

测试题:

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模块。

  1. >>> response = urllib.request.urlopen("http://www.fishc.com")
  2. >>> type(response)
  3. <class 'http.client.HTTPResponse'>

复制代码


调用其read()方法才能读出URL的内容。
5. 如果访问的网址不存在,会产生哪类异常?(虽然课堂没讲过,但你可以动手试试)
答:HTTPError
6. 鱼C工作室(http://www.fishc.com)的主页采用什么编码传输的?
答:UTF-8 编码。
一般网页通过点击审查元素,在 <head> 标签中的 charset 会显示采用了哪种编码。


7. 为了解决 ASCII 编码的不足,什么编码应运而生?
答:Unicode 编码。扩展阅读关于编码的那篇文章太长了,有鱼油说太生涩难懂,对于对编码问题还一头雾水的鱼油请看 -> 什么是编码?


动动手答案:


0. 下载鱼C工作室首页(http://www.fishc.com),并打印前三百个字节。
代码清单:

  1. >>> import urllib.request
  2. >>> response = urllib.request.urlopen('http://www.fishc.com')
  3. >>> print(response.read(300))
  4. b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\r\n\t"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r\n\r\n<!-- \r\n(c) 2011 \xc4\xbdubom\xc3\xadr Krupa, CC BY-ND 3.0\r\n -->\t\r\n\r\n<html xmlns="http://www.w3.org/1999/xhtml">\r\n\t<head>\r\n\t\t<meta http-equiv="content-type" content="text/html; charset=utf-8" />\r\n\t\t'

复制代码


1. 写一个程序,检测指定 URL 的编码。
代码清单:

  1. import urllib.request
  2. import chardet
  3.  
  4. def main():
  5.     url = input("请输入URL:")
  6.  
  7.     response = urllib.request.urlopen(url)
  8.     html = response.read()
  9.  
  10.     # 识别网页编码
  11.     encode = chardet.detect(html)['encoding']
  12.     if encode == 'GB2312':
  13.         encode = 'GBK'
  14.  
  15.     print("该网页使用的编码是:%s" % encode)
  16.         
  17. if __name__ == "__main__":
  18.     main()

复制代码



2. 写一个程序,依次访问文件中指定的站点,并将每个站点返回的内容依次存放到不同的文件中。
代码清单:

  1. import urllib.request
  2. import chardet
  3.  
  4. def main():
  5.     i = 0
  6.     
  7.     with open("urls.txt", "r") as f:
  8.         # 读取待访问的网址
  9.         # 由于urls.txt每一行一个URL
  10.         # 所以按换行符'\n'分割
  11.         urls = f.read().splitlines()
  12.         
  13.     for each_url in urls:
  14.         response = urllib.request.urlopen(each_url)
  15.         html = response.read()
  16.  
  17.         # 识别网页编码
  18.         encode = chardet.detect(html)['encoding']
  19.         if encode == 'GB2312':
  20.             encode = 'GBK'
  21.         
  22.         i += 1
  23.         filename = "url_%d.txt" % i
  24.  
  25.         with open(filename, "w", encoding=encode) as each_file:
  26.             each_file.write(html.decode(encode, "ignore"))
  27.  
  28. if __name__ == "__main__":
  29. main()
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()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值