数据基础及分析 7_第1页
数据基础及分析 7_第2页
数据基础及分析 7_第3页
数据基础及分析 7_第4页
数据基础及分析 7_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python爬虫、数据清洗和数据可视化大数据分析大数据与人工智能技术丛书了解爬虫的定义掌握Python开发运行环境使用Python书写爬虫使用爬虫进行网页内容的抓取本章学习目标第二章爬虫与大数据网络爬虫简介2.1爬虫的基本概念网络爬虫(WebSpider)又称之为网络机器人、网络蜘蛛,是一种通过既定规则,能够自动提取网页信息的程序。网络爬虫也叫网络机器人,可以代替人们自动化浏览网络中的信息,进行数据的采集与整理。它是一种程序,基本原理是向网站/网络发起请求,获取资源后分析并提取有用数据。发送请求获取响应内容解析内容保存数据每一个程序都有自己的规则,网络爬虫也不例外。它穿梭于全球各个网站中间,会根据人们施加的规则去采集信息,我们称这些规则为网络爬虫算法搜索引擎在网络发展伊始,全球范围内能提供信息的网站数量不多,用户也不多。互联网只是文件传输协议(FTP)站点的集合,用户可以在这些站点中导航以找到特定的共享文件。为了查找和组合互联网上可用的分布式数据,人们创建了一个自动化程序,称为网络爬虫/机器人。可以抓取网上的所有网页,然后将所有页面上的内容复制到数据库中制作索引。这也是最早期的搜索引擎。搜索引擎的爬虫是善意的,可以检索网络中一切信息,并提供给其他用户访问,为此它们还专门定义了robots.txt文件,作为君子协议。如今随着互联网的高速发展,我们能够在任何一个搜索引擎中看到来自全球各个网站的信息。百度搜索引擎的爬虫叫做百度蜘蛛(Baiduspider),360的爬虫叫360Spider,搜狗的爬虫叫Sogouspider,必应的爬虫叫Bingbot。搜索引擎离不开爬虫。网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。该协议是国际互联网界通行的道德规范,虽然没有写入法律,但是每一个爬虫都应该遵守这项协议。搜索引擎的爬虫搜索引擎的爬虫SearchenginecrawlerRobots.txt可以让蜘蛛更高效的爬行网站;可以阻止蜘蛛爬行动态页面,从而解决重复收录的问题;可以减少蜘蛛爬行无效页面,节省服务器带宽;Robots.txt的作用必须是txt结尾的纯文本文件;文件名所有字母必须是小写;文件必须要放在网站根目录下;创建robots.txt文件它必须位于域名的根目录中并被命名为"robots.txt"。位于子目录中的robots.txt文件无效,因为漫游器只在域名的根目录中查找此文件。robots.txt自身是一个文本文件Robots协议Robots协议-RobotaExclusionStandard,网络爬虫排除标准Robots协议就是告知网络爬虫哪些可以抓取,哪些不允许抓取,网站讲robots.txt文件存储在根目录下。如:/robota.txt

淘宝的robots协议地址截取部分内容:User-agent:Baiduspider##对象为百度蜘蛛。Allow:/article##允许访问article根目录。Allow:/oshtml##允许访问oshtml根目录。Allow:/wenzhang##允许访问wenzhang根目录。Disallow:/product/##不允许访问product根目录。Disallow:/##不允许访问根目录*表示所有/表示根目录以

Allow项的值开头的

URL是允许robot访问的。例如,Allow:/article允许百度爬虫引擎访问/article.htm、/article/http://12345.com

等。01User-agent:*(定义所有搜索引擎)

User-agent:Googlebot(定义谷歌,只允许谷歌蜘蛛爬取)

User-agent:Baiduspider(定义百度,只允许百度蜘蛛爬取)02以

Disallow项为开头的链接是不允许百度爬虫引擎访问的。例如,Disallow:/product/不允许百度爬虫引擎访问/product/http://12345.com

等。03禁止搜索引擎抓取特定目录:User-agent:*Disallow:/admin/

Disallow:/tmp/

Disallow:/abc/该网站有三个目录对搜索引擎的访问做了限制,即搜索引擎不会访问这三个目录。04爬虫与反爬虫一些企业为了保证服务器的正常运转,降低服务器的运转压力与成本,不得不使出各种各样的手段来阻止爬虫工程师毫无节制地向服务器索取资源,这种行为我们称之为反爬虫。在爬虫与反爬虫的较量上,一些反爬手段常常会让人津津乐道,比如,文本混淆反爬虫、动态渲染反爬虫、信息校验反爬虫、代码混淆反爬虫……等等。通过User-Agent来控制访问无论是浏览器还是爬虫程序,在向服务器发起网络请求的时候,都会发过去一个头文件:headers。对headers进行伪装。目前,网络上有很多开源爬虫软件可供使用者选择,常见的有Larbin、Nutch、Heritrix等,开源爬虫是已成型的爬虫软件,用户可以直接使用开源爬虫抓取网络上的网页资源。01什么是反爬虫02反爬虫手段04爬虫软件03headers伪装网络爬虫的类型网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。实际的网络爬虫系统通常是几种爬虫技术相结合实现的。通用网络爬虫又叫作全网爬虫,顾名思义,爬取的目标资源在全互联网中,所爬取的目标数据是巨大的,并且爬行的范围也是非常大的。通用网络爬虫通用网络爬虫主要由初始URL集合、URL队列、页面爬行模块、页面分析模块、页面数据库、链接过滤模块等构成。正是由于其爬取的数据是海量数据,所以对于这类爬虫来说,其爬取的性能要求是非常高的。这种网络爬虫主要应用于大型搜索引擎中,有非常高的应用价值。通用网络爬虫在爬行的时候会采取一定的爬行策略,主要有深度优先爬行策略和广度优先爬行策略。网络爬虫的类型聚焦、增量式和深层网络爬虫聚焦网络爬虫也叫主题网络爬虫,是按照预先定义好的主题有选择地进行网页爬取的一种爬虫。聚焦网络爬虫主要应用在对特定信息的爬取中,主要为某一类特定的人群提供服务。增量式网络爬虫,在爬取网页的时候,只爬取内容发生变化的网页或者新产生的网页,对于未发生内容变化的网页,则不会爬取。增量式网络爬虫在一定程度上能够保证所爬取的页面,尽可能是新页面。在互联网中,网页按存在方式分类可分为表层页面和深层页面。表层页面指的是不需要提交表单,使用静态的链接就能够到达的静态页面;而深层页面是需要提交一定的关键词之后才能够获取得到的页面。而在互联网中,深层页面的数量往往比表层页面的数量要多很多。聚焦网络爬虫增量式网络爬虫深层网络爬虫控制中心URL队列初始URL集合内容评价模块链接评价模块链接过滤模块新URL页面爬行模块互联网网页页面数据库页面分析模块索引数据库主题用户检索爬取的顺序相对于通用网络爬虫,爬取的顺序并不是那么重要。但聚焦网络爬虫,爬取的顺序与服务器资源和宽带资源有关,所以非常重要,一般由爬行策略决定。爬行策略主要有深度优先爬行策略、广度优先爬行策略、大站优先策略、反链策略、其他爬行策略等。假设有一个网站,ABCDEFG分别为站点下的网页,如图所示表示网页的层次结构。假如此时网页ABCDEFG都在爬行队列中,那么按照不同的爬行策略,其爬取的顺序是不同的。

深度优先爬行策略:A→D→E→B→C→F→G

广度优先爬行策略:A→B→C→D→E→F→G网站ABCGFED++爬虫技术同样高并发能力非常强。搜索引擎(SearchEngine),例如传统的通用搜索引擎Baidu、Yahoo和Google等,是一种大型复杂的网络爬虫,属于通用性网络爬虫的范畴。在大数据架构中,数据收集与数据存储占据了极为重要的地位,可以说是大数据的核心基础,而爬虫技术在这两大核心技术层次中占有很大的比例。PHPJavaPythonNode.JS适合开发大型爬虫项目。爬虫框架非常丰富,并且多线程的处理能力较强,并且简单易学、代码简洁,优点很多。后端处理很强,代码很简洁,模块也较丰富,但是并发能力相对来说较弱。运行速度快,适合开发大型爬虫项目,成本较高。支持高并发与多线程处理。C++:Go语言2.2Python介绍Python语言具有如下特点:Python简介Python是一种面向对象的解释型计算机程序设计语言,由荷兰人GuidovanRossum于1989年发明。Python的第一个公开发行版于1991年发行。开源、免费、功能强大语法简洁清晰,强制用空白符(whitespace)作为语句缩进具有丰富和强大的库易读、易维护,用途广泛解释性语言,其变量类型可改变,类似于JavaScript语言Python下载Python的开发环境十分简单,用户可以登录其官网/中直接下载Python的安装程序包,如若是安装在Windows操作系统上的Python,请下载“64位下载Windowsx86-64executableinstaller”版本。目前,Python有两个主流版本,一个是Python2.7,另外一个是Python3.7,这两个版本在语法上有些差异。本书搭建的Python开发环境为Python3.7。Python安装下载Python3.7安装程序包后直接安装。Python安装在不改变默认设置的情况下单击“Next”进行下一步。Python安装等待Python进度条加载完毕安装完毕,点击“Close”关闭安装界面Python安装完成后验证下Python是否安装成功,打开应用程序Python,可以看到pythonIDLE,同时也可以看到python的版本号是3.7。Python3.8Python版本Python启动Anaconda的Python开发环境Python安装完成后在Windows的启动菜单中可以看到Python3.7的启动菜单,启动Python3.7可以看到Python的命令行界面,其中“>>>”后面就是输入命令的地方。启动Python3.7,在程序编译环境中输入程序:print("Hi,MyFirstPythonApplication!")键入“回车”按钮,就可以看到运行结果Python数据类型整型,简答表述就是平时所见的整数。Python3的整型已经与长整型进行了无缝结合,现在的Python3的整型类似于Java的BigInteger类型,它的长度不受限制浮点型就是平时所说的小数,例如圆周率3.14是浮点型,例如地球到太阳的距离大约1.5亿千米也是浮点型。Python区分整型和浮点型的唯一方式就是看有没有小数点。在Python3环境下浮点型数据输出:>>>a=0.0000000000000000000025>>>a2.5e-21>>>整型和浮点型1、整型2、浮点型1.整型2.浮点型布尔类型事实上是特殊的整型,布尔类型用True和False来表示“真”与“假”,同时布尔类型可以当作整数来对待,True相当于整型值1,False相当于整型值0。t=Truef=Falseprint(type(t))#运行结果为:<class'bool'>print(tandf)#逻辑AND运算;运行结果为:Falseprint(torf)#逻辑OR运算;运行结果为:Trueprint(nott)#运算NOT运算;运行结果为:Falseprint(t!=f)#运算XOR运算;运行结果为:Truet=Truef=Falseprint(type(t))#运行结果为:<class'bool'>print(tandf)#逻辑AND运算;运行结果为:Falseprint(torf)#逻辑OR运算;运行结果为:Trueprint(nott)#运算NOT运算;运行结果为:Falseprint(t!=f)#运算XOR运算;运行结果为:True布尔类型在Python3环境下布尔类型的运算都是可以的(最后的例子报错是因为False相当于0,而0不能作为除数)。>>>True+True2>>>True*True1>>>True*False0>>>True/FalseTraceback(mostrecentcalllast):File”<stdin>”,line

1,in<module>ZeroDivisionError:divisionbyzero>>>3.布尔类型字符串类型字符串是程序中最常用的一种数据类型,字符串可以包含中文与英文等任何字符,在内存中用Unicode编码存储,但是存储到磁盘中时往往采用GBK或者UTF-8等其他编码形式。获取字符串长度函数len字符串s的长度为len(s),例如:len("abc")字符串长度为3;len("呵呵abc")字符串长度为5。s="ILU"n=len(s)foriinrange(n):print(s[i])对应输出的结果是:ILUs="huangyuan"n=len(s)foriinrange(n):print(s[i])huang

yuans1="huang"s2="lilei"print(s1+s2)huanglilei读出字符串中的各个字符要得到字符串其中的第i个字符,可以像数组访问数组元素那样用s[i]得到这些字符,其中s[0]是第1个字符,s[1]是第2个字符,……,s[len(s)-1]是最后一个字符。例如:右图。4.字符串类型字符串类型两个字符串a、b可以比较大小,比较规则是按各个对应字符的Unicode编码,编码大的一个为大。比较a[0]和b[0],如果a[0]>b[0],则a>b;如果a[0]<b[0],则a<b;如果a[0]=b[0],则继续比较a[1]和b[1]。比较a[1]和b[1],如果a[1]>b[1],则a>b;如果a[1]<b[1],则a<b;如果a[1]=b[1],则继续比较a[2]和b[2]。假如c是一个大写英文字母,则ord(c)是它的编码,ord(c)-ord("A")是它相对"A"的偏移量,ord("a")是"a"的编码,显然ord("a")+ord(c)-ord("A")是c对应的小写字母的编码,因此chr(ord("a")+ord(c)-ord("A"))就是c对应的小写字母。例如:c="B"d=chr(ord(a)+ord(c)-ord("A"))print(d)对应输出的结果是:b同理,如果c是一个小写的英文字母,那么chr(ord("A")+ord(c)-ord("a"))是它对应的大写字母。c="B"a="a"d=chr(ord(a)+ord(c)-ord("A"))print(d)b字符串大小的比较英文字母的大小写转换如果知道一个符号的编码为n,那么可以用chr(n)函数把它转为对应的字符,例如:a=chr(119)b=chr(101)print(a,b)对应输出的结果是:we编码转换为字符字符串类型其中start、end、step三个参数都是可选的,冒号是必须的。该函数的含义是从start开始(包括string[start]),以step为步长,获取到end的一段元素(注意不包括string[end])。格式:s.upper()作用:返回一个字符串,把s中所有的小写字符转换为大写字母。格式:s.lower()功能:返回一个字符串,把s中所有的大写字母转换为小写字母。格式:s.find(t)作用:返回在字符串s中査找t子串第一个出现的位置下标,如不存在就返回-1。格式:s.rfind(t)作用:返回在字符串s中査找t子串最后一次出现的位置下标,如不存在就返回-1。s="welcome"c="co"print(s.find(c))格式:s.index(t)作用:返回在字符串s中査找t子串第一个出现的位置下标,如不存在就报错误。s="welcome"c="me"print(s.index(c))⑥字符串函数(1)求字符串的子串函数string[start:end:step](2)字符串大小写转换函数upper()、lower()(3)字符串查找函数find(t)、rfind(t)(4)字符串索引查找函数index(t)格式:s.startswith(t)作用:判断字符串s是否以子串t开始,返回逻辑值。格式:s.endswith(t)作用:判断字符串s是否以子串t结束,返回逻辑值。s="welcome"c="we"print(s.startswith(c))格式:s.lstrip()作用:返回一个字符串,去掉了s中左边的空格。格式:s.rstrip()作用:返回一个字符串,去掉了s中右边的空格。格式:s.strip()作用:返回一个字符串,去掉了s中左边与右边的空格,等同s.lstrip().rstrip()。格式:s.split(sep)作用:用sep分割字符串s,分割出的部分组成列表返回。其中sep是分隔符,结果是字符串按sep字符串分割成多个字符串,这些字符串组成一个列表,即函数split调用后返回一个列表。hello='hello'#字符串的字符使用单引号world="world"#字符串的字符使用双引号.print(len(hello))#len()函数表示获取字符串的长度;运行结果为:5hw=hello+''+world#字符串的连接print(hw)#运行结果为:helloworldhw12='%s%s%d'%(hello,world,12)#按格式输出字符串print(hw12)#运行结果为:helloworld12字符串类型⑥字符串函数(5)字符串判断函数startswith(t)、endswith(t)(6)字符串去掉空格函数lstrip()、rstrip()、strip()(7)字符串分离函数split(sep)列表类型列表是Python中最常用的数据类型,列表的数据项不需要具有相同的类型。列表中的每个元素都分配一个数字表示它的位置或索引,第1个索引值是0,第2个索引值是1,以此类推。只要把逗号分隔的不同的数据项使用方括号括起来即可创建一个列表,例如:list1=[1,2,3,4,’5’,6,2]列表的元素可以重复,如list1中的2重复出现。列表中的元素类型不一定要完全一样,如list1中有字符串也有数值。使用下标索引来访问列表中的值,同样也可以使用方括号的形式截取字符,截取的方法与字符串中截取的方法类似。例如:list1=[1,2,3,4,5,6,7]print(list1[1:5])对应输出的结果是:[2,3,4,5]5.列表类型创建一个列表访问列表中的值可以使用del语句来删除列表中的元素。使用in或者notin操作判断一个元素是否在或者不在列表中。用for循环依次输出列表中的三个元素cat,dog和monkey。animals=['cat','dog','monkey']foranimalinanimals:print(animal)更新列表可以对列表的数据项进行修改或更新,也可以使用append方法来添加列表项。删除列表元素列表联合操作可以使用"+"来连接多个列表。列表的截取L[start:end:step]其中start、end、step三个参数是可选的,冒号是必须包含的。该函数的含义是从start开始(包括L[start],以step为步长,获取到end的一段元素(注意不包括L[end])。判断一个元素是否在列表中元组类型元组也是Python中常用的一种数据类型,它是tuple类的类型,与列表list几乎一致。元组与列表的区别如下:6.元组类型元组数据使用圆括号()来表示,如t=(’a’,’b’,’c’,’d’,’e’,’f’)。元组数据的元素不能改变,只能读取。类型转换数据类型紧密相关的函数:int()、float()和str()。int()的作用是将一个字符串或浮点数转换为一个整数。如图所示是在Python3环境中的int类型转换输出示意图。float()的作用是将一个字符串或整数转换成一个浮点数,也即是转换为小数。如图所示是在Python3环境中的float类型转换输出示意图。str()的作用是将一个数或任何其他类型转换成一个字符串。如图所示是在Python3环境中的str类型转换输出示意图。7.类型转换123获得关于类型的信息有时候可能需要确定一个变量的数据类型,例如当需要用户输入一个整数,但用户却输入一个字符串,就有可能引发一些意想不到的错误或导致程序崩溃!Python提供了一个函数可以明确告诉我们变量的类型,这就是type()函数。money=int(input('你一个月工资多少钱?'))#将输入的工资数(字符串),强制转换为整数ifmoney>=10000:#当工资数(整数)大于等于10000(整数)时

print('土豪我们做朋友吧!')#打印if条件下的结果elif5000<money<10000:#当工资数(整数)大于5000(整数)小于10000(整数)时

print('我们都是搬砖族。。。')#打印elif条件下的结果else:#当工资数(整数)小于等于5000(整数)时

print('我负责赚钱养家,你负责貌美如花~')#打印else条件下的结果age='59'choice=input('请你猜一下斯内普教授的年龄:')ifchoice==age:print('猜对惹~你好厉害!ヽ✿゜▽゜)ノ~~~')elifchoice<age:print('斯内普的提示:你猜小了(;´д`)ゞ。。。。')else:print('斯内普的提示:乃猜大了惹(>﹏<)~~')8.获得关于类型的信息2.3爬虫相关知识任意打开一个网页(/),鼠标右键单击,从弹出的快捷菜单中选择“检查”,即可查看到该网页结构的相应代码无论我们通过浏览器打开网站、访问网页,还是通过脚本对URL网址进行访问,本质上都是对HTTP服务器的请求,浏览器上所呈现的、控制台所显示的都是HTTP服务器对我们请求的响应。源代码与HTML源代码(也称源程序)是指未编译的按照一定的程序设计语言规范书写的文本文件。计算机源代码的目的是将人类可读的文本翻译成计算机可执行的二进制指令。HTML,是HypertextMarkupLanguage的英文缩写,即超文本标记语言,是制作网页内容的一种标签语言。HTML通过再内容上附加各种标签,在浏览器中正确展示内容。什么是HTTP、HTTP的请求过程超文本传输协议(HTTP,HyperTextTransferProtocol)用于从www服务器传输超文本到本地浏览器的传输协议;保证计算机正确快速地传输超文本文档;确定传输文档中的哪一部分;以及哪部分内容首先显示等。1.浏览器向DNS发起IP请求;2.浏览器从DNS处获得IP地址;3.浏览器向服务器发送请求资源;4.服务器将请求返回浏览器。什么是HTTPHTTP的请求过程什么是URL、URL访问如下面的URI:

/myhtml/html1223/我们可以这样解释它:①这是一个可以通过HTTP协议访问的资源,②位于主机上,③通过路径“/myhtml/html1223/”访问。

使用超级文本传输协议HTTP,提供超级文本信息服务的资源。

例:/channel/welcome.htm

其计算机域名为。超级文本文件(文件类型为.html)是在目录/channel下的welcome.htm。这是中国人民日报的一台计算机。

URI通常由三部分组成:①访问资源的命名机制;②存放资源的主机名;③资源自身的名称,由路径表示。爬虫最主要的处理对象就是URL,它根据URL地址取得所需要的文件内容,然后对它进行进一步的处理。因此,准确地理解URL对理解网络爬虫至关重要。什么是URLURL访问Request(请求)。每一个用户打开的网页都必须在最开始由用户向服务器发送访问的请求。Response(响应)。服务器在接收到用户的请求后,会验证请求的有效性,然后向用户发送相应的内容。客户端接收到服务器的相应内容后,再将此内容展示出来,以供用户浏览。请求与响应的过程、结构网页请求和响应的过程网络爬虫主要的操作对象:HTTP请求(Request)、HTTP响应(Response)HTTP请求和响应都由两部分组成:消息头(MessageHeader)、消息体(MessageBody)请求结构响应结构HTTP的Methods(请求方法)指定客户端想对指定的资源/服务器作何种操作。常见的Methods有:GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE等。HTTP的Methods(请求方法)HTTP各个请求方法的详细描述GET:请求指定的页面信息,并返回实体主体。HEAD:类似于GET请求,只不过返回的响应没有具体的内容,用于获取报头。POST:向指定资源提交数据进行处理请求。数据被包含在请求体内,POST请求可能导致新的资源建立/已有资源修改。GET方法用来请求已被URI识别的资源。指定的资源经服务器端解析后返回响应内容。将需要的参数附在URL的后面,以“?”分隔URL和参数,多个参数之间用“&”连接。对微博的GET请求:/signup/signup/php?inviteCode=2388493434POST方法向目的服务器发出请求,要求它接受附在请求后的实体,并把它作为附在请求队列中请求URL所指定的附加新子项。POST请求会把请求的数据放置再HTTP请求包的包体中。POST方法HTTP的MethodsGET与POST的对比GETPOST后退按钮/刷新无害数据被重新提交缓存能被缓存不能历史参数保留再浏览器历史中不会保存对数据长度限制URL最大长度2048个字符无限制对数据类型限制只允许ASCII字符无限制安全性安全性较差,因为发送的数据是URL的一部分POST比GET更安全,参数不会保存可见性数据在URL中对所有人可见数据不会显示在URL中ChromeInspect监控网络交互过程响应状态码响应状态码一般由3位数字组成,标志着服务器对客户端请求的处理结果。响应状态码是我们调整爬虫抓取状态的重要参考。我们平时打开一个网页,显示的404就是响应状态码的一种。1开头的HTTP状态码表示临时响应并需要请求者继续执行操作的状态码。2开头的HTTP状态码表示请求成功。比如做常见的200:一般请求成功的状态码。3XX重定向状态码,也是常见的状态码。比如303:指示可在另一个URI之下找到该请求的响应。4开头的HTTP状态码表示请求出错。比如404服务器找不到请求的网页。5开头的状态码比如503(服务不可用)服务器目前无法使用(由于超载或停机维护)。12345爬虫实现过程用户使用爬虫来获取网页数据的时候,一般要经过以下几步:发送请求获取响应内容解析内容保存数据第三方库的安装:打开终端,输入如下命令:pipinstallrequests网络爬虫使用Python网络库和远程服务器建立联系。URLLIB是Python自带的标准库,无需安装。提供如下功能:网页请求响应获取代理和cookie设置异常处理URL解析爬虫使用步骤Python网络爬虫需要的内置库以及第三方库Python网络爬虫需要的内置库Python库说明urllib提供一系列用于操作URL的方法,并以urlopen函数的形式提供接口requests基于urllib的HTTP库cookielib提供可存储cookie的对象,配合urllib访问网络re提供Python语言对正则表达式的支持lxmlPython语言中处理XML和HTML的库BeautifulSoup从HTML和XML中提取数据的Python库urllib.request—打开网页的基础模块当我们知道一个网站的URL时,使用python下的urllib组件,即可实现简单的网页抓取。urllib模块urllib是URL和lib两个单词共同构成的,URL就是网页的地址,lib是library(库)的缩写。URL的一般格式为(带方括号[]的为可选项):protocol://hostname[port]/path/[;parameters][?query]#fragment。urlib.request:打开和读取url

urllib.error:包含由request产生的错误

url.parse:解析url通过urllib.request.urlopen()这个函数接口就可以打开一个网站,它主要有url与data两个输入参数。urllib模块urllib.request.urlopen()函数访问网页,urllib.request.urlopen()函数参数如下:urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)

Urllib结构与格式Urllib组件的主要模块在Urllib模块中可以使用urlopen函数

urllib.request.urlopen()函数参数功能参数功能url用于打开的网址datadata用来指明发往服务器请求中的额外的参数信息,data默认是None,此时以GET方式发送请求;当用户给出data参数的时候,改为POST方式发送请求。timeout设置网站的访问超时时间cafile、capath、cadefault用于实现可信任的CA证书的HTTP请求context实现SSL加密传输创建一个表示指定url的类文件对象,以此为出发点获取数据,并操作数据。Urllib.request.urlopen(url.data=[timeout,]*Cafile=None.capath=None,Cadefault=False.context=None)url:表示指定的资源路径,一般是http或者ftpl路径。data:表示以get或者post方式提交到url的数据timeout:表示用于超时的设置。Urlopen函数语法输入参数完成对百度的GET请求importurllib.requestresponse=urllib.request.urlopen('')print(response.read().decode('utf-8'))<metahttp-equiv="content-type"content="text/html;charset=utf-8">importurllib.parseimporturllib.requestdata

=

bytes(urllib.parse.urlencode({'hello':'world'}),encoding='utf-8')#传入data参数即完成post请求response=urllib.request.urlopen('/',data=data)print(response.read()){'hello':'world'}#传入数据会进行显示使用urllib获取响应信息[例2-3]使用urllib获取响应信息,代码如下:importurllib.requesturl="/"response=urllib.request.urlopen(url)print(response.getcode())print(response.geturl())print(response.getheaders())属性说明r.status_codeHTTP请求的返回状态,200表示连接成功,404表示失败r.textHTTP响应内容的字符串形式,(即url对应的页面内容)r.encoding从HTTPheader中猜测的响应内容编码方式r.contentHTTP响应内容的二进制形式r.apparent_encoding根据网页内容分析出的编码方式使用urllib获取响应信息importurllib.requestresponse=urllib.request.urlopen('')print(response.status)print(response.getheaders())print(response.getheader('Server'))importurllib.requestresponse=urllib.request.urlopen('')print(response.read().decode('utf-8'))使用urllib获取响应信息importurllib.requesturl="/"response=urllib.request.urlopen(url)#按行读取#print(response.readline().decode())#获取多行装入列表#print(response.readlines())#服务器响应的状态码print(response.getcode())#响应的来源print(response.geturl())#获取响应头print(response.getheaders())定制headers定制headers另一种方法。importurllib.requestimporturllib.parseurl='/post'dict={'name':'French'}data=bytes(urllib.parse.urlencode(dict),encoding='utf-8')req=urllib.request.Request(url=url,data=data,method='POST')#使用add_headers方法增加headerreq.add_headers=('User-Agent','Mozilla/5.0(WindowsNT6.3;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.87Safari/537.36')response=urllib.request.urlopen(req)print(response.read().decode('utf-8'))Requests库Requests是用Python语言编写,基于urllib,采用Apache2Licensed开源协议的HTTP库。它比urllib更加方便,可以节约开发者大量的工作,完全满足HTTP测试需求。Requests库的安装十分简单,一般可在Windows命令行中输入:pipinstallrequests来完成下载安装。在安装完成后,在Python环境中即可导入该模块,如果不报错则表示安装成功。导入模块命令如下:importrequestsRequests库Requests库安装使用GET方式抓取数据,代码如下:importrequestsurl=""strhtml=requests.get(url)print(strhtml.text)语句含义如下:importrequests:导入requests库url="":访问目标网页strhtml=requests.get(url):将获取的数据保存到strhtml变量中print(strhtml.text):打印网页源码使用GET方式抓取数据,代码如下:Requests库importrequestsr=requests.get("/",timeout=1)print(r.status_code)该例使用timeout来设置响应时间,其中

timeout并不是整个下载响应的时间限制,而是如果服务器在timeout秒内没有应答,将会引发一个异常。例2-5使用GET方式读取网页数据,并设置超时反应Requests库importrequestsr3=requests.get("/net/a/04/link?appid=100140019&url=http%3A%2F%2F4%2Fpreview%2Finternettv%2Fsp_images%2Fott%2F2019%2F5%2F24%2Fdianying%2F324910%2F20190524172409419-new.jpg")withopen('baidu_logo.png','wb')asf:f.write(r3.content)该例抓取了网页中的图片,其中图片地址为/net/a/04/link?appid=100140019&url=http%3A%2F%2F4%2Fpreview%2Finternettv%2Fsp_images%2Fott%2F2019%2F5%2F24%2Fdianying%2F324910%2F20190524172409419-new.jpg例2-6使用Requests库抓取网页图片Requests库解析HTML页面的源代码工具BeautifulSoup

提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。目前,BeautifulSoup已成为和lxml、html5lib一样出色的Python解释器(库),并为用户灵活地提供不同的解析策略或强劲的速度。BeautifulSoup将复杂的HTML文档转换为一个树形结构来读取,其中树形结构中的每个节点都是Python对象,并且所有对象都可以归纳为Tag、NavigableString、BeautifulSoup以及Comment等4种。要使用BeautifulSoup

库首先需要在Python3中安装,可以直接在cmd下用pip3命令进行安装:pipinstallbeautifulsoup4BeautifulSoup库12345解析HTML页面的源代码工具1.正则表达式2.lxml3.BeautifulSoupBeautifulSoup准备一个网页,命名为2-1.html,内容如下:<!DOCTYPEhtml><htmllang="zh"><head><title>这是我的网页</title></head><body><h1>我的第一个标题</h1><p>我的第一个段落。</p></body></html>在Python3中导入BeautifulSoup库获取该网页信息,代码如下:frombs4importBeautifulSoupfile=open('2-1.html','rb')html=file.read()bs=BeautifulSoup(html,"html.parser")#缩进格式print(bs.prettify())#格式化html结构print(bs.title)#获取title标签的名称print()#获取title的nameprint(bs.title.string)#获取head标签的所有内容print(bs.head)该例使用BeautifulSoup获取2-1.html网页的相关信息,如网页结构,网页title标签的名称,网页head标签的所有内容等。例2-7使用BeautifulSoup获取网页信息正则表达式正则表达式又称为规则表达式,是对字符串操作的一种逻辑公式。其特点是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。通常被用来检索、替换那些符合某个模式(规则)的文本。\d{15}\d{17}([0-9]|X)这一串奇怪的字码代表什么?居民身份证的正则式表达。正则表达式是对字符串进行操作的一种逻辑公式用事先定义好的字符和字符组成,组成“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式正则表达式的匹配过程依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功。一旦有匹配不成功的字符则匹配失败。正则表达式引擎正则表达式对象匹配结果正则表达式文本需要匹配的文本编译匹配正则表达式文本正则表达式

说明\d“\d”代表一个数字*“*”代表任意的字符[]“[]”内的字符只能取其一{}“{}”指定字符的个数+“+”表示前一个字符至少出现一次—“—”表示一个范围?“?”表示前一个字符可出现0次或1次代码说明.匹配除换行符以外的任意字符\w匹配字母或数字或下划线或汉字\s匹配任意的空白符\d匹配数字\b匹配单词的开始或结束^匹配字符串的开始$匹配字符串的结束代码/语法说明*重复零次或更多次+重复一次或更多次?重复零次或一次{n}重复n次{n,}重复n次或更多次{n,m}重复n到m次比如,声明“电话号码”。该数据类型由“***—********”组成,如,可使用正则表达式书写为"\d{3}-d{8}"。再比如,声明“密码”。该数据类型由“*********”组成,前面3位是字母,后面6位是数字,如“abc123456”,可使用正则表达式书写为"[a-z]{3}[0-9]{6}"。正则表达式的应用正则表达式有如下常见应用:替换指定内容数字替换删除指定字符删除空行0\d\d-\d\d\d\d\d\d\d\d匹配这样的字符串:以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字。我们也可以这样写这个表达式:0\d{2}-\d{8}。这里\d后面的{2}({8})的意思是前面\d必须连续重复匹配2次(8次)。\s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。\w匹配字母或数字或下划线或汉字。\ba\w*\b匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b)。\b\w{6}\b

匹配刚好6个字符的单词。12345正则表达式的应用捕获组用小括号包裹起来的表达式去匹配字符串。把表达式中的括号进行编号,以左括号出现的前后顺序为准,第一个出现的分组,组号即为1组号0代表正则表达式整体。例如,正则表达式(\d{4})-(\d{2}-(\d\d))匹配2019-04-19。编号捕获组匹配内容0(\d{4})-(\d{2}-(\d\d))2019-04-191(\d{4})20192(\d{2}-(\d\d))04-193(\d\d))190\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(,一种是4位区号,7位本地号。(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。捕获组Re库Rpile()编译正则字符。Re.match()匹配正则表达式与字符串。Re.search()扫描整个字符串并返回第一个成功的匹配。Re.findall()返回全部匹配的字符串。Re库的主要函数importrea="student"str1="teacherandstudent"ret=re.search(a,str1)print(ret)该例导入了Python中的re模块,并使用其中的search()函数从字符串“teacherandstudent”中搜索“student”第一次出现的匹配情况【例2-6】使用re模块匹配普通字符串。importrea="\d{2}st"str1="teacherand12345student"ret=re.search(a,str1)print(ret)在该例中,\d{2}st表示在字符st前面有2个任意的十进制数字[0-9]Re库【例2-7】使用通用字符串匹配字符。import

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论