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

本文深入解析爬虫概念,探讨百度蜘蛛设计要点,教授如何限制爬虫访问敏感内容,详解URL与URI区别,演示常见编码及urllib.request.urlopen()使用,通过实战案例提升编码检测与网页抓取能力。

测试题:

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()

 

{ "code":200, "data":{ "articleContent":"## 一、技术技能\n**编程语言:** Python是最常用的爬虫语言,但了解其他语言如Java、C#等也是有益的。\n**网络爬虫:** 了解如何使用Scrapy、BeautifulSoup等工具抓取网页内容。\n**数据存储:** 了解如何将抓取的数据存储到数据库,如MySQL、MongoDB等。\n**数据清洗和分析:** 使用Pandas、Numpy等工具进行数据处理和分析。\n**代理和反爬策略:** 了解如何使用代理、改变抓取频率以避免被目标网站封禁。\n**API抓取:** 了解如何使用API进行数据抓取。\n## 二、职业素养\n**尊重目标网站的规定:** 不要违反任何robots.txt文件的规定,尊重网站的请求。\n**高效抓取:** 使用多线程、多进程等技术提高抓取效率。\n**错误处理:** 对可能出现的错误进行预处理,确保爬虫稳定运行。\n**数据备份与存储:** 确保抓取的数据有备份,且能长期保存。\n**代码可读性与可维护性:** 编写清晰、易于理解的代码,方便他人阅读和维护。\n## 三、职业道德\n**尊重隐私:** 不要抓取个人隐私数据,尊重用户隐私。\n**尊重版权:** 不要使用或分享未经授权的内容。\n**避免滥用:** 不要对目标网站造成过大的访问压力,避免滥用资源。\n**公平竞争:** 在商业应用中,确保爬虫活动的公平性,不违反竞争法。\n**诚实守信:** 在面对数据争议时,应保持诚实,不篡改、不伪造数据。\n\n## 结语\n最后,作为一个爬虫工程师,我们需要不断地学习和提高自己的技术水平,同时也要注重职业素养和职业道德的培养。只有这样,我们才能成为一个优秀的爬虫工程师,为社会做出更大的贡献。", "articleId":"96", "articleImage":"/static/img/04337bc80930ad46809f9fb88f33048bcf.jpg", "articleSummary":"当我们谈论爬虫工程师的自我修养时,我们不仅在谈论技术技能,而且还在谈论职业素养和职业道德。因为一个优秀的爬虫工程师不仅需要掌握编程和数据处理技能,还需要具备高度的职业素养和道德标准。", "articleTitle":"爬虫工程师的自我修养", "createTime":"2024-02-02 09:49:48", "isTop":"1", "likeNumber":"0", "readNumber":"286", "tags":[ "22", "73" ], "typeId":"29", "typeName":"Python", "updateTime":"2024-02-04 15:41:06", "userId":"1", "userName":"SOrigin" }, "msg":"操作成功" }输出结果如何才能是这个
05-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值