富源县建设局网站,产品营销策划,培训网址大全,家居东莞网站建设0. 请写下这一节课你学习到的内容#xff1a;格式不限#xff0c;回忆并复述是加强记忆的好方式#xff01;
马上我们的教学就要进入最后一个章节#xff0c;Pygame 嗨爆引爆全场#xff0c;但由于发生了一个小插曲#xff0c;所以这里决定追加一个章节#xff0c;因为…0. 请写下这一节课你学习到的内容格式不限回忆并复述是加强记忆的好方式
马上我们的教学就要进入最后一个章节Pygame 嗨爆引爆全场但由于发生了一个小插曲所以这里决定追加一个章节因为有人反应说“你上一节课教我们去查找文档教我们如何从官方文档中找到需要的答案但是我发现知易行难也希望举一个详细点的例子教我们如何去查找。”
所以这里我们详细的深刻的讲一下网络爬虫。所以就有了本章节论一只爬虫的自我修养。
首先我们需要理解什么是网络爬虫如图 网络爬虫又称为网络蜘蛛Spider如果你把整个互联网想象为一个蜘蛛网的构造每个网站或域名都是一个节点那我们这只蜘蛛就是在上面爬来爬去在不同的网页上爬来爬去顺便获得我们需要的资源抓取最有用的。做过网站的朋友一定很熟悉我们之所以能够通过百度、谷歌这样的搜索引擎检索到你的网页靠的就是他们每天派出大量的蜘蛛在互联网上爬来爬去对网页中的每个关键字建立索引然后建立索引数据库经过了复杂的排序算法之后这些结果将按照搜索关键词的相关度的高低展现在我们的眼前。那当然现在让你编写一个搜索引擎是一件非常苦难的、不可能完成的事情但是有一句老话说的好啊千里之行始于足下。我们先从编写一段小爬虫代码开始然后不断地来改进它要使用Python编写爬虫代码我们要解决的第一个问题是:
Python如何访问互联网
好在Python为此准备好了电池Python为此准备的电池叫做urllib urllib 事实上是由两个单词组成的URL就是我们平时说的网页地址 和 lib就是library的意思就是首页。 •URL的一般格式为带方括号[]的为可选项 protocol :// hostname[:port] / path / [;parameters][?query]#fragment •URL由三部分组成 –第一部分是协议protocolhttphttpsftpfileed2k… –第二部分是存放资源的服务器的域名系统或IP地址有时候要包含端口号各种传输协议都有默认的端口号如http的默认端口为80。 –第三部分是资源的具体地址如目录或文件名等。 那好说完URL我们现在可以来谈一下 urllib 这个模块了Python 3 其实对这个模块进行了挺大的改动以前有urllib和urllib2 两个模块Python3 干脆把它们合并在了一起并做了统一。其实 urllib 并不是一个模块而是一个包。我们来查一下文档就知道了我们说过有问题找文档。 urllib 其实是一个包其中包含4个模块request 、error、parse 和 robotparser我们主要会来讲解 request 这个模块这个模块也是最复杂的因为它包含了对服务器的请求和发出、跳转、代理、安全等几大方面。
我们点进去会发现文档非常长从头看到尾是不可能的这时候怎么办呢建议百度、谷歌查询 urllib.request 的用法或者查询 Python3 如何访问网页也可以得到想要的结果。你会得到使用 urlopen() 这个函数。 urlopen() 函数除了第一个参数 url 是必需的外后面的都有默认参数和可选参数文档告诉我们url 可以是一个字符串或者 Request object。Request object 是什么我们下节课讲解。我们猜测 url 为一个字符串是应该就是域名地址的字符串我们先来尝个鲜之所以选择https://ilovefishc.com这个网页是因为这个网页的源代码量较少其他的网站会直接把IELD搞崩溃不信你可以试试 https://www.baidu.com。 import urllib.request response urllib.request.urlopen(https://ilovefishc.com) html response.read() print(html) b!DOCTYPE html\nhtml langen\nhead\n meta charsetUTF-8\n meta nameviewport contentwidthdevice-width, initial-scale1.0\n meta namekeywords content\xe9\xb1\xbcC\xe5\xb7\xa5\xe4\xbd\x9c\xe5\xae\xa4|\xe5\x85\x8d\xe8\xb4\xb9\xe7\xbc\x96\xe7\xa8\x8b\xe8\xa7\x86\xe9\xa2\x91\xe6\x95\x99\xe5\xad\xa6|Python\xe6\x95\x99\xe5\xad\xa6|Web\xe5\xbc\x80\xe5\x8f\x91\xe6\x95\x99\xe5\xad\xa6|\xe5\x85\xa8\xe6\xa0\x88\xe5\xbc\x80\xe5\x8f\x91\xe6\x95\x99\xe5\xad\xa6|C\xe8\xaf\xad\xe8\xa8\x80\xe6\x95\x99\xe5\xad\xa6|\xe6\xb1\x87\xe7\xbc\x96\xe6\x95\x99\xe5\xad\xa6|Win32\xe5\xbc\x80\xe5\x8f\x91|\xe5\x8a\xa0\xe5\xaf\x86\xe4\xb8\x8e\xe8\xa7\xa3\xe5\xaf\x86|Linux\xe6\x95\x99\xe5\xad\xa6\n meta namedescription content\xe9\xb1\xbcC\xe5\xb7\xa5\xe4\xbd\x9c\xe5\xae\xa4\xe4\xb8\xba\xe5\xa4\xa7\xe5\xae\xb6\xe6\x8f\x90\xe4\xbe\x9b\xe6\x9c\x80\xe6\x9c\x89\xe8\xb6\xa3\xe7\x9a\x84\xe7\xbc\x96\xe7\xa8\x8b\xe8\xa7\x86\xe9\xa2\x91\xe6\x95\x99\xe5\xad\xa6\xe3\x80\x82\n meta nameauthor content\xe9\xb1\xbcC\xe5\xb7\xa5\xe4\xbd\x9c\xe5\xae\xa4\n title\xe9\xb1\xbcC\xe5\xb7\xa5\xe4\xbd\x9c\xe5\xae\xa4-\xe5\x85\x8d\xe8\xb4\xb9\xe7\xbc\x96\xe7\xa8\x8b\xe8\xa7\x86\xe9\xa2\x91\xe6\x95\x99\xe5\xad\xa6|Python\xe6\x95\x99\xe5\xad\xa6|Web\xe5\xbc\x80\xe5\x8f\x91\xe6\x95\x99\xe5\xad\xa6|\xe5\x85\xa8\xe6\xa0\x88\xe5\xbc\x80\xe5\x8f\x91\xe6\x95\x99\xe5\xad\xa6|C\xe8\xaf\xad\xe8\xa8\x80\xe6\x95\x99\xe5\xad\xa6|\xe6\xb1\x87\xe7\xbc\x96\xe6\x95\x99\xe5\xad\xa6|Win32\xe5\xbc\x80\xe5\x8f\x91|\xe5\x8a\xa0\xe5\xaf\x86\xe4\xb8\x8e\xe8\xa7\xa3\xe5\xaf\x86|Linux\xe6\x95\x99\xe5\xad\xa6/title\n link relshortcut icon typeimage/x-icon hrefimg/favicon.ico\n link relstylesheet hrefcss/styles.css\n script srcjs/jq.js/script\n script srchttps://cdn.bootcss.com/timelinejs/2.36.0/js/storyjs-embed.js/script\n script srchttps://cdnjs.cloudflare.com/ajax/libs/timelinejs/2.36.0/js/storyjs-embed.js defer/script\n !-- script srchttps://fishc.oss-cn-hangzhou.aliyuncs.com/Web/js/embed.js/script --\n script\n $(document).ready(function() {\n var windowHeight document.documentElement.clientHeight || document.body.clientHeight;\n\n createStoryJS({\n type: \timeline\,\n width: \auto\,\n height: windowHeight,\n source: \data.json\,\n start_at_end:true, //OPTIONAL START AT LATEST DATE\n embed_id: \my-timeline\\n });\n\n });\n /script\n !-- END TimelineJS --\n/head\nbody\ndiv idmy-timeline/div\n/body\n/html\n
得到的字符串是一个以 b 开头二进制字符串。得到的字符串似乎和我们所理解的网页代码不一样但是我们又看到了很熟悉的身影例如divlink rel等但是在这个网页如果右键审查元素 我们会发现网页的代码很整齐那这是怎么回事呢为什么Python这里高的一团糟我们刚才说了Python这里直接得到的是byte类型二进制编码所以我们可以对它进行解码操作我们先来看一下这个网页的编码方式是UTF-8。 html html.decode(utf-8) print(html) !DOCTYPE html html langen head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 meta namekeywords content鱼C工作室|免费编程视频教学|Python教学|Web开发教学|全栈开发教学|C语言教学|汇编教学|Win32开发|加密与解密|Linux教学 meta namedescription content鱼C工作室为大家提供最有趣的编程视频教学。 meta nameauthor content鱼C工作室 title鱼C工作室-免费编程视频教学|Python教学|Web开发教学|全栈开发教学|C语言教学|汇编教学|Win32开发|加密与解密|Linux教学/title link relshortcut icon typeimage/x-icon hrefimg/favicon.ico link relstylesheet hrefcss/styles.css script srcjs/jq.js/script script srchttps://cdn.bootcss.com/timelinejs/2.36.0/js/storyjs-embed.js/script script srchttps://cdnjs.cloudflare.com/ajax/libs/timelinejs/2.36.0/js/storyjs-embed.js defer/script !-- script srchttps://fishc.oss-cn-hangzhou.aliyuncs.com/Web/js/embed.js/script -- script $(document).ready(function() { var windowHeight document.documentElement.clientHeight || document.body.clientHeight; createStoryJS({ type: timeline, width: auto, height: windowHeight, source: data.json, start_at_end:true, //OPTIONAL START AT LATEST DATE embed_id: my-timeline }); }); /script !-- END TimelineJS -- /head body div idmy-timeline/div /body /html 测试题
0. 请问 URL 是“统一资源标识符”还是“统一资源定位符”
答往后的学习你可能会经常接触 URL 和 URI为了防止你突然懵倒所以在这里给大家简单普及下。URI 是统一资源标识符Universal Resource IdentifierURL 是统一资源定位符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模块。 response urllib.request.urlopen(http://www.fishc.com) type(response) class http.client.HTTPResponse
调用其read()方法才能读出URL的内容。
5. 如果访问的网址不存在会产生哪类异常
虽然课堂没讲过但你可以动手试试
答HTTPError
6. 鱼C工作室https://ilovefishc.com的主页采用什么编码传输的
答UTF-8 编码。
一般网页通过点击审查元素在 head 标签中的 charset 会显示采用了哪种编码。 7. 为了解决 ASCII 编码的不足什么编码应运而生
答Unicode 编码。扩展阅读关于编码的那篇文章太长了有鱼油说太生涩难懂对于对编码问题还一头雾水的鱼油请看 - 什么是编码 动动手
0. 下载鱼C工作室首页https://ilovefishc.com并打印前三百个字节。
代码清单 import urllib.request response urllib.request.urlopen(http://www.fishc.com) print(response.read(300)) b!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Strict//EN\r\n\thttp://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\nhtml xmlnshttp://www.w3.org/1999/xhtml\r\n\thead\r\n\t\tmeta http-equivcontent-type contenttext/html; charsetutf-8 /\r\n\t\t
1. 写一个程序检测指定 URL 的编码。
演示 提示
提供个“电池”给你用 - 一次性解决你所有的编码检测问题
代码清单 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()
2. 写一个程序依次访问文件中指定的站点并将每个站点返回的内容依次存放到不同的文件中。
演示
urls.txt 文件存放需要访问的 ULR 执行你写的程序test.py依次访问指定的 URL 并将其内容存放为一个新的文件 代码清单 import urllib.request import chardet def main(): i 0 with open(urls.txt, r) as f: # 读取待访问的网址 # 由于urls.txt每一行一个URL # 所以按换行符\n分割 urls f.read().splitlines() for each_url in urls: response urllib.request.urlopen(each_url) html response.read() # 识别网页编码 encode chardet.detect(html)[encoding] if encode GB2312: encode GBK i 1 filename url_%d.txt % i with open(filename, w, encodingencode) as each_file: each_file.write(html.decode(encode, ignore)) if __name__ __main__: main()