《(高职)11.5 网络爬虫ppt课件.pptx》由会员分享,可在线阅读,更多相关《(高职)11.5 网络爬虫ppt课件.pptx(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、11.5 网络爬虫Python 程序设计丁辉 商俊燕 范晓玲u11.1 Pycharm的安装与使用u11.2 TCP/IP协议简介u11.3 TCP编程u11.4 UDP编程u11.5 网络爬虫u11.6 网络编程精选案例u小结2022年5月12日3第十一章 网络编程2022年5月12日411.5 网络爬虫 网络爬虫(Web Spider),又被称为网页蜘蛛,是一种按照一定的规则,自动地抓取网站信息的程序或者脚本。网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面开始,读取网页的内容,再找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的
2、网页都抓取完为止。 网络爬虫的基本工作流程如下: (1)首先选取一部分精心挑选的种子URL; (2)将这些URL放入待抓取队列; (3)从队列中读取待抓取队列的URL,解析DNS,并且得到主机的IP,并将URL对应的网页下载下来,存进下载网页库; (4)分析已抓取URL队列中的URL,从已下载的网页数据中分析其它URL,并和已抓取的URL进行比较去重,最后将去重过的URL放入待抓取URL队列,从而进入下一个循环。 Python实现网络爬虫,主要依赖第三方库: requests库:用来发起请求; BeautifulSoup库:用来解析HTML结构并提取内容; Faker库:用来模拟请求UA(Us
3、er-Agent)。2022年5月12日511.5 网络爬虫l 用urllib实现网络爬虫 urllib系Python系统自带的库,提供了urllib.request请求模块、urllib.parse解析模块和urllib.error异常处理模块等模块,很好地支持了网页内容读取功能。【例11-3】使用urllib库来读取的内容。#eg11_3.py#简单的网络爬虫from urllib import requestimport chardet #编码识别模块response = request.urlopen(“http:/”) #打开访问的网页html = response.read() #
4、读取网页#检测html的编码格式charset = chardet.detect(html)print(charset) #输出编码格式html = html.decode(charset.get(encoding),errors = ignore)print(html) #输出网页内容这是网络爬虫最简单的应用。但是如果这样的爬虫多了,会影响网络响应,所以有时会出现服务器拒绝用户的访问请求。一些网站常用的反爬虫措施是检查headers中的User-Agent。如果使用Python编写的爬虫代码,没有对headers进行设置,则User-Agent会声明自己是Python脚本,而如果网站做了反爬
5、虫设置,必然会拒绝这样带有Python脚本的请求。因此修改headers可以将自己的爬虫脚本伪装成浏览器的正常访问,这是常用的反拒绝手段。2022年5月12日611.5 网络爬虫l 用urllib实现网络爬虫(续) User-Agent域:是向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核等信息的标识。通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计。常用的浏览器标识如下: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome
6、/45.0.2454.85 Safari/537.36 115Browser/6.0.3, Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50, Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50, Mozilla/4.0 (comp
7、atible; MSIE 8.0; Windows NT 6.0; Trident/4.0), Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0), Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1, Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11
8、(KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11, Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0), Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0, Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) G
9、ecko/20100101 Firefox/4.0.1 Referer域:当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。如用于统计访问量、防外连接等。2022年5月12日711.5 网络爬虫l 用urllib实现网络爬虫(续)【例11-4】对【例11-3】 添加headers头信息后的爬虫代码。#eg11_4.pyfrom urllib import requestimport chardetheaders = User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; W
10、indows NT 6.0), Accept: rapplication/json, text/javascript, */*; q=0.01, Referer: rhttp:/ url=http:/req = request.Request(rhttp:/ headers=headers)response = request.urlopen(req)html = response.read()charset = chardet.detect(html) #检测html的编码格式html = html.decode(charset.get(encoding),errors = ignore)p
11、rint(charset)print(html)req = request.Request(rhttp:/ headers=headers)创建一个Request对象,并且能灵活地进行浏览器参数配置。2022年5月12日811.5 网络爬虫l用requests实现网络爬虫 requests库实现的是HTTP请求,是爬虫开发中最为常用的库。【例11-5】 使用requests库的网络爬虫应用示例。#eg11_5.pyimport requestsresponse = requests.get(http:/)response.encoding =utf-8print(response.text)利
12、用requests库相比urllib库,代码更加简单。以上代码是基于get请求为例,接下来看看以post请求实现的网络爬虫代码。post请求也很简单,只要在请求时添加一个data参数,这个data参数可以通过字典构成。import chardetdatas=key:valuetarget = http:/ = requests.post(url=target,data=datas)#获取网页的编码格式re.encoding=chardet.detect(re.content)encodingprint(re.content)requests对headers的处理与urllib非常相似,在req
13、uests的get函数中添加headers参数即可。headers = User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0), Accept: rapplication/json, text/javascript, */*; q=0.01, Referer: rhttp:/ response = requests.get(http:/),headers)response.encoding=utf-8print(response.text)get方式post方式get方式+User-Agent2022年5月12日911.5
14、网络爬虫l BeautifulSoup库的使用 BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python第三方库,可以用它来方便地从网页中提取数据。有了它不用再去写一些复杂的正则表达式,只需要简单的几条语句就可以完成网页中某个元素的提取。 BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如lxml。由于lxml解析速度比标准库中的HTML解析器速度快得多,所以选择将lxml作为新的解析器。下表列出了主要解析器的优缺点。解析器使用方法优势劣势Python标准库BeautifulSoup(markup, “html.parse
15、r”)Python的内置标准库执行速度适中文档容错能力强Python 2.7.3 or 3.2.2前的版本中文档容错能力差Lxml、HTML解析器BeautifulSoup(markup, “lxml”)速度快文档容错能力强需要安装C语言库Lxml、XML 解析器BeautifulSoup(markup, “lxml”,”xml”)BeautifulSoup(markup, “xml”)速度快唯一支持XML的解析器需要安装C语言库html5libBeautifulSoup(markup, “html5lib”)最好的容错性以浏览器的方式解析文档生成HTML5格式的文档速度慢2022年5月12日
16、1011.5 网络爬虫lBeautifulSoup库的使用(续) from bs4 import BeautifulSoup #导入Beautiful/soup库#创建一个html对象 htmlstr = The BeautifulSoupThe BeautifulSoupBeautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。对象有: 它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。. soup = BeautifulSoup(htmlstr,lxml) #创建beautifulSo
17、up对象 print(soup.prettify()提取的网页指定解释器格式化输出soup对象2022年5月12日1111.5 网络爬虫lBeautifulSoup库的使用(续) The BeautifulSoup The BeautifulSoup Beautiful Soup提供一些简单的、Python式的函数用来处理导航、搜索、修改分析树等功能。对象有: 它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。 . 2022年5月12日1211.5 网络爬虫(1)对象类型 BeautifulSoup将复杂HTML文档转换成一个复杂的
18、树形结构,每个节点都是Python对象,所有对象可以归纳为4种:Tag、NavigableString、BeautifulSoup、Comment。 Tag对象Tag,通俗点讲就是 HTML 中的标签。比如“The BeautifulSoup ”中,html、head、title这些HTML标签加上里面包括的内容就是Tag,使用 BeautifulSoup 可以很方便地获取Tag。前面的格式化输出代码soup.prettify(),是调用soup的方法prettify()获得的,soup对象具有title、a、p等HTML这些标签属性,通过soup.title、soup.a、soup.p等获得
19、标签的内容。 print(soup.a) 对于Tag,它有两个重要的属性,是 name 和 attributes。 name属性每个Tag都有自己的名字,通过name获取。 print(soup.name) document print(soup.title.name) titlesoup 对象本身比较特殊,它的 name 即为 document,对于其它内部标签,输出的值便为标签本身的名称。 attributes属性,soup对象的attributes属性用attrs表示,用于获取Tag中所有属性,Tag标签的属性用字典表示。 print (soup.p.attrs)class: title
20、, name: bs1获得了p标签以字典形式表示的内容。利用上述这种方式,查找到的是所有内容中第一个符合要求的标签,如果要查询所有标签,可自己查阅相关资料。如果想要单独获取某个属性,和获取字典中键值信息的方法一样。 print(soup.pclass)title print(soup.p.get(class)title2022年5月12日1311.5 网络爬虫NavigableString对象用 string获取标签内部的文字。 print(soup.p.string)The BeautifulSoup print(type(soup.p.string) BeautifulSoup对象Beau
21、tifulSoup 对象表示的是一个文档全部内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,name属性和attribute属性同样可以使用。 print(soup.name)document print(soup.attrs) print(type(soup.attrs)Comment对象Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对文本处理造成意想不到的麻烦。 print (soup.a.string)Tag print (type(soup.a.string)a 标签里的内容实
22、际上是注释,但是如果利用 string 来输出它的内容,发现它已经把注释符号去掉了,所以这可能会带来不必要的麻烦。另外打印输出它的类型,发现它是一个 Comment 类型。因此在提取字符串时,可以先判断一下类型,然后再进行其它操作。if type(soup.a.string) = bs4.element.Comment: print (soup.a.string)2022年5月12日1411.5 网络爬虫(2)findAll()函数搜索文档:BeautifulSoup定义了很多搜索方法,这里主要介绍findAll()方法。findAll() 方法搜索当前Tag的所有子节点,并判断是否符合过滤器
23、的条件,函数原型如下:findAll( name , attrs , recursive , text , limit, *kwargs )name参数(查找标签)name 参数可以查找所有名字为 name 的Tag 。name参数取值可以是字符串、列表、True、方法、正则表达式。最简单的过滤器是字符串,在搜索方法中传入一个字符串参数,BeautifulSoup会查找与字符串完整匹配的内容。下面的例子用于查找文档中所有的标签: print(soup.findAll(b) The BeautifulSoup如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回。下面代
24、码找到文档中所有标签和标签: print(soup.findAll(head,b) The BeautifulSoup, The BeautifulSoup2022年5月12日1511.5 网络爬虫True参数可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点: for tg in soup.findAll(True): print(tg.name,sep=,)Html,head,title,body,p,b,p,a,a,a,p,如果没有合适过滤器,那么还可以定义一个方法。方法只接受一个元素参数,如果这个方法返回 True 表示当前元素匹配并且被找到,如果不是则反回 False
25、。下面方法校验了当前元素,如果包含 class 属性和 id 属性,那么将返回 True: def has_class_and_id(tag): return tag.has_attr(class) and tag.has_attr(id) print(soup.findAll(has_class_and_id), , 2022年5月12日1611.5 网络爬虫*kwargs参数kwargs参数在Python中表示为关键字参数。如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字Tag的属性来搜索。如包含一个名字为 id 的参数,BeautifulSoup会搜索每个Tag的
26、id属性: print(soup.findAll(id=link1)text参数(查找文本)通过 text 参数可以搜索文档中的字符串内容。与 name 参数的可选值一样,text 参数可以接受字符串、列表、True、正则表达式: print(soup.findAll(text=The BeautifulSoup) The BeautifulSoup, The BeautifulSoup2022年5月12日1711.5 网络爬虫limit参数 findAll() 方法返回全部的搜索结构,如果文档树很大那么搜索会很慢。如果不需要全部结果,可以使用 limit 参数限制返回结果的数量。当搜索到的结
27、果数量达到 limit 的限制时,就停止搜索返回结果。如文档树中有3个Tag符合搜索条件,但结果只返回了1个,因为限制了返回数量: print(soup.findAll(a,limit=1) recursive参数 调用Tag的 findAll() 方法时,BeautifulSoup会检索当前Tag的所有子孙节点,如果只想搜索Tag的直接子节点,可以使用参数 recursive=False: print(soup.findAll(title)The BeautifulSoup print(soup.findAll(title,recursive=False)2022年5月12日1811.5 网络爬虫attrs参数 用一个python字典封装一个标签的若干属性和对应的属性值,注意是对一个标签的属性,所以一定要指明这个标签。可以更好的区分众多相同的标签。格式:格式:(”tag“,属性属性,属性值属性值 soup.findAll(p,class:title,story)The BeautifulSoup, Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。对象有: 它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。, .2022年5月12日19