版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章数据分析与可视化网络爬虫9.1Pandas数据处理9.2数据可视化9.3本章小结9.4本章实训9.5本章导读39.1网络爬虫5爬虫可以模拟浏览器对存储指定网页的服务器发起请求,从而获得网页的HTML文件,再从这个文件中提取所需要的数据。通用网络爬虫聚焦网络爬虫增量式网络爬虫深层网络爬虫9.1.1网络爬虫概述通用网络爬虫又称为全网爬虫,是百度和谷歌等搜索引擎抓取系统的重要组成部分,主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份,有非常高的应用价值。“面向特定主题需求”,又称为主题网络爬虫。会对内容筛选,按照预定主题,有选择地进行网页爬取,尽量保证只抓取与需求相关的网页信息,节省存储硬件和网络资源。一般用户使用的爬虫都是这一类型。增量型网络爬虫是指在爬取数据时,只爬取新产生或更新过的页面,对于没有发生变化的页面,则不会爬取,这样可以有效的减少数据下载量,减少时间和空间的开销。能爬取那些隐藏在深层网页中的信息的爬虫。所谓深层网页是指那些不能通过静态链接获取、需要提交一些表单才能获得的页面。实际上,大部分信息都是隐藏在深层网页中的。6HTML称为超文本标记语言通过标签可将文本、声音和图片等内容组织起来。9.1.2HTML语言简介<!DOCTYPEhtml><html><head><title>页面标题</title></head><body><header>这是头部</header><nav>这是导航栏</nav><main><section>这是一个区块</section><section>这是另一个区块</section></main><aside>这是侧边栏</aside><footer>这是页脚</footer></body></html>7查看网页源码方法——右键菜单“查看网页源代码”在网页的空白处右击,在弹出的快捷菜单中点单击“查看网页源代码”。不便于分析数据在源代码中所处的位置。9.1.2HTML语言简介8查看网页源码方法——开发者工具在谷歌浏览器打开网页,按【F12】键或用快捷键【Ctrl+Shift+l】开启开发者工具,窗口左侧正常显示网页,右侧显示源代码。9.1.2HTML语言简介9创建简单的网页在Pycharm中,单击“File”菜单。选择“New”命令。在弹出界面中单击“HTMLFile”并输入一个主文件名并回车,系统会自动补全“.html”扩展名,创建一个HTML网页文件。HTML网页文件上右击,单击“打开于”-“浏览器”,选择一个浏览器,可在浏览器中查看网页。9.1.2HTML语言简介10HTML的基本元素9.1.2HTML语言简介<!DOCTYPEhtml><!--网页声明,告诉浏览器用html规范解释当前文档-->
<htmllang="en"><!--声明这是一个HTML文档-->
<head><!--定义文档头部-->
<metacharset="UTF-8"><!--描述文档属性-->
<title>爬虫练习</title><!--定义文档标题-->
</head><!--文档头部结束标签-->
<body><!--定义文档主体,包含文档所有内容-->
</body><!--文档主体结束标签-->
</html><!--HTML文档结束标签-->主要用于网页的描述表示这个网页的标题是“爬虫练习”放置这个网页的上呈现的数据和呈现形式的代码表示其中的代码是HTML语言11<div>标签<div>可定义文档中的区块,可以把文档分割为独立的、不同的部分来显示内容。9.1.2HTML语言简介<!DOCTYPEhtml><!--网页声明,告诉浏览器用html规范解释当前文档-->
<htmllang="en"><!--声明这是一个HTML文档-->
<head><!--定义文档头部-->
<metacharset="UTF-8"><!--描述文档属性-->
<title>爬虫练习</title><!--定义文档标题-->
</head><!--文档头部结束标签-->
<body><!--定义文档主体,包含文档所有内容-->
<!--定义一个区块-->
<divclass="hot-news-wrapper">
<spanclass="title-content-title">数字人才紧缺新需求开启就业新空间</span>
</div>
</body><!--文档主体结束标签-->
</html><!--HTML文档结束标签-->定义一个区块,用于显示一条新闻的标题12<ul><ol>和<li>标签<ul>和<ol>标签用于定义无序列表和有序列表。<li>用于列表标签之下,用于定义列表中的一项。9.1.2HTML语言简介<!DOCTYPEhtml><!--网页声明,告诉浏览器用html规范解释当前文档-->
<htmllang="en"><!--声明这是一个HTML文档-->
<head><!--定义文档头部-->
<metacharset="UTF-8"><!--描述文档属性-->
<title>爬虫练习</title><!--定义文档标题-->
</head><!--文档头部结束标签-->
<body><!--定义文档主体,包含文档所有内容-->
<!--定义一个区块-->
<divclass="hot-news-wrapper">
<ul><!--定义一个无序列表-->
<li><spanclass="title-content-title">数字人才紧缺新需求开启就业新空间</span></li>
<li><spanclass="title-content-title">支撑数字经济高质量发展——数字人才“养成记”</span></li>
</ul>
<ol><!--定义一个有序列表-->
<li><spanclass="title-content-title">“数字人才”需求旺盛</span></li>
<li><spanclass="title-content-title">数字化人才培养势在必行</span></li>
</ol>
</div>
</body><!--文档主体结束标签-->
</html><!--HTML文档结束标签-->包含2项的无序列表包含2项的有序列表9.1.2HTML语言简介13标签作用<h1>到<h6>标签<h>标签可定义标题,<h1>定义一级标题。<h6>定义最小的标题。<a>标签<a>标签定义超链接,<a>元素最重要的属性是href属性,它指示链接的目标,用于从一网页链接到href指定的位置。<p>标签<p>标签定义段落,不设置样式时,<p>标签的内容在网页中显示为一行。<span>标签<span>标签可以将网页元素放在一行中显示,可以为span应用id或class属性,这样既可以增加适当的语义,又便于对span应用样式或精确获取其中的数据。<img>标签<img>标签用于创建一个图像的占位空间,用于从网页中链接图像,<img>标签有两个必需的属性:src属性和alt属性。src属性用于指定图片的地址,alt属性用于指定无法正常加载图片时的替换文本。14<table>标签定义HTML表格。简单的HTML表格组成:<table>元素一个或多个表示行的<tr>表示表头单元格的<th>或标准单元格的的<td>元素9.1.2HTML语言简介<!DOCTYPEhtml><!--网页声明,告诉浏览器用html规范解释当前文档-->
<htmllang="en"><!--声明这是一个HTML文档-->
<head><!--定义文档头部-->
<metacharset="UTF-8"><!--描述文档属性-->
<title>爬虫练习</title><!--定义文档标题-->
</head><!--文档头部结束标签-->
<body><!--定义文档主体,包含文档所有内容-->
<tableborder="1">
<tr>
<th>序号</th>
<th>标题</th>
</tr>
<tr>
<td>1</td>
<td>数字人才紧缺新需求开启就业新空间</td>
</tr>
<tr>
<td>2</td>
<td>数字化人才培养势在必行</td>
</tr>
</table>
</body><!--文档主体结束标签-->
</html><!--HTML文档结束标签-->15在Chrome中打开百度首页,按F12打开开发者工具,点击左侧元素选择工具9.1.3网页结构16在Chrome中打开百度首页,按F12打开开发者工具,点击左侧元素选择工具9.1.3网页结构17第三方库request模拟浏览器发起HTTP或HTTPS协议的网络请求,实现利用python程序自动获取网页源代码。调用前需要安装,pipinstallrequests。request模块中发起络请求的方法:get()方法:向服务器发起获取网页的请求,该函数只获取资源,不会在服务器中执行修改操作。post()方法:向服务器传送数据,服务器根据这些数据做出响应,post()函数经常被用于模拟用户登录。9.1.4request模块18get()函数参数(1)headers用于设置请求头信息。爬虫需要参数设置合适的值,把自己模拟成浏览器。查看请求头信息方法:开发者工具并切换到Network选项卡。单击“All”并刷新页面,在“Name”窗格会显示加载的数据包。单击主页的数据包切换至“Headers”选项卡,在“RequestHeaders”下查看名为“User-Agent”的参数。9.1.4request模块19get()函数参数(1)headers9.1.4request模块importrequests#网页头,模拟浏览器行为headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/Safari/537.36'}url='/'#请求的网址response=requests.get(url=url,headers=headers)print(response)#输出<Response[200]>,200状态码表示请求已成功print(response.text)#查看获取到的数据20get()函数参数(2)Params用于在发送请求时携带动态参数,将用户参数发送给服务器,供服务器获取相关网页。9.1.4request模块21get()函数参数(3)timeout用于设置请求超时的时间。由于网络或其他原因,并不是每次请求都会被服务器接收到,适当设置参数值可以在请求超时的时候抛出异常。9.1.4request模块importrequests#导入requests模块response=requests.get(url='',timeout=1.0)print(response.text)22get()函数参数(4)proxies用于设置代理服务器,网站会限制在短时间内发起大量请求的IP,为规避这种反爬手段,可使用代理服务代替实际的IP地址发起请求。9.1.4request模块23解析静态网页数据9.1.4request模块importrequests#导入requests模块#用get()方法请求url指定的网页,服务器返回一个响应对象,命名为responseresponse=requests.get(url='')print(response.text)#text属性以文本的方式返回请求对象#<!--STATUSOK--><html><head><bodylink=#0000cc>...</body></html>24get()响应对象返回响应头和响应体信息9.1.4request模块importrequests#导入requests模块#用get()方法请求url指定的网页,返回响应对象responseresponse=requests.get(url='')print(response)#返回对象<Response[200]>print(response.status_code)#返回状态码200print(response.encoding)#返回自动解码得到的编码ISO-8859-1print(response.raw)#获取来自服务器的原始套接字响应#<urllib3.response.HTTPResponseobjectat0x0000023A8AD411B0>print(response.headers)#获取响应头#{'Cache-Control':'private,no-cache,...'Transfer-Encoding':'chunked'}print(response.content)#以字节的方式返回请求对象#b'<!DOCTYPEhtml>\r\n<!--STATUSOK--><html>...</body></html>\r\n'25动态网页数据获取9.1.4request模块按F5刷新页面按【Ctrl+F】调出搜索框,输入要爬取的数据,如“海上钢琴师”,若搜索结果为“0”,说明此网页上的数据是动态加载的在搜索结果中单击数据包定位到包含该关键词的数据包9.1.4request模块26importrequests#导入requests模块#网页头,模拟浏览器行为headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/Safari/537.36'}url='/j/chart/top_list'#浏览器传递参数,'limit':'2'表示只返回前2条数据,修改数字可以得到更多数据data={'type_name':'音乐',
'type':'14',
'interval_id':'100:90',
'action':'',
'start':'0',
'limit':'2'}#用get方法对网址发起请求并获取响应对象response=requests.get(url=url,headers=headers,params=data)result_json=response.json()#获取响应对象中JSON格式数据print(result_json)27获取电影封面图片9.1.4request模块img_url=result_json[0]['cover_url']#用列表索引和字典键索引从爬取的数据中取得封面的url地址response=requests.get(url=img_url)#获取图片数据的响应对象content=response.content#content属性可提取图片的二进制字节码withopen('天下一家.jpg','wb')asfp:#以写二进制模式创建文件对象
fp.write(content)#将图片写入文件对象中28正则表达式(RegularExpression,RE)是一串字符串,用于匹配一段有规律的字符串信息,用来检查、提取和替换一个字符串中符合某种规律的子串。9.1.5正则表达式29提取网页上全部的邮箱邮箱的基本格式为“名称@域名”,“@”符号必须存在且只出现一次不考虑中文用户名和中文域名,用户名由只允许英文字母、数字、下划线、英文句号、以及中划线组成合法的域名的规律为“[N级域名][三级域名.]二级域名.顶级域名”正则表达式:^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$9.1.5正则表达式30正则表达式的字符类型9.1.5正则表达式普通字符包含所有大写和小写字母、所有数字、所有标点符号和一些其他符号,用于匹配自身。普通字符元字符就是指那些在正则表达式中具有特殊意义的专用字符,用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。元字符31基本符号(1)特殊字符9.1.5正则表达式表9.2特殊字符的含义表字符描述.(点)在默认模式,匹配除换行符(\n、\r)之外的任何单个字符,相当于[^\n\r]^(插入符号)匹配字符串的开始位置$匹配字符串的结尾或者新的一行前面的字符串的结尾,例如:foo$匹配'foo'[]字符集合,范围内的所有字符都可以被匹配。例如[amk]匹配'a','m',或者'k'。[a-z]匹配任何小写ASCII字符,[0-5][0-9]将匹配从00到59的两位数字|A|B,A和B可以是任意正则表达式,匹配A或者
B,任意个正则表达式可以用'|'连接(...)(组合),匹配括号内的任意正则表达式,并标识出组合的开始和结尾。\转义字符,使后面一个元字符失去特殊意义,匹配字符本身32基本符号(2)限定符指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。9.1.5正则表达式9.1.5正则表达式33表9.3正则表达式限定符表字符描述*匹配前面的子表达式零次或多次。例如,ab*能匹配"a"以及"abb",*等价于{0,}。+匹配前面的子表达式一次或多次。例如,'ab+'能匹配"ab"以及"abb",但不能匹配"a",+等价于{1,}。?匹配前面的子表达式零次或一次。例如,ab?会匹配'a'或者'ab',但不能匹配"abb",?等价于{0,1}。*?+???'*','+',和'?'修饰符都是贪婪的,它们在字符串进行尽可能多的匹配。在修饰符之后添加?将使样式以非贪婪方式或者最简方式进行匹配;匹配尽量少的字符。例如:<.*?>仅仅匹配'<a>'{m}m是一个非负整数。确定匹配前面的子表达式m次。例如,'o{2}'能匹配"food"中的两个o,但不能匹配"Bob"中的'o'{m,n}m和n均为非负整数,其中m<=n。最少匹配m次且最多匹配n次。例如,a{3,5}将匹配3到5个'a'。忽略m意为指定下界为0,忽略n指定上界为无限次。例如a{4,}b将匹配'aaaab'或者1000个'a'尾随一个'b',但不能匹配'aaab'。逗号不能省略,否则无法辨别修饰符应该忽略哪个边界。{m,n}?前一个修饰符的非贪婪模式,只匹配尽量少的字符次数。例如,对于'aaaaaa',a{3,5}匹配5个'a',而a{3,5}?只匹配3个'a'。9.1.5正则表达式34表9.4特殊序列表字符描述\A只匹配字符串开始位置。\b匹配单词开始或结尾的位置的空字符串。\B匹配空字符串,但不能在词的开头或者结尾。\d匹配任何Unicode十进制数\D匹配任何非十进制数字的字符\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]\S匹配任何非空白字符。等价于[^\f\n\r\t\v]\w匹配字母、数字和下划线。等价于[A-Za-z0-9_]\W匹配当前区域中既非字母数字也非下划线的字符。\Z只匹配字符串结尾。35基本符号(3)转义字符9.1.5正则表达式字符描述\cx匹配由x指明的控制字符\f匹配一个换页符。等价于\x0c和\cL\n匹配一个换行符。等价于\x0a和\cJ\r匹配一个回车符。等价于\x0d和\cM\t匹配一个制表符。等价于\x09和\cI\v匹配一个垂直制表符。等价于\x0b和\cK表9.5转义字符表36正则表达式的用法实例(1)\w与\W\w匹配字母、数字、数字和下划线。\W匹配当前区域中既非字母数字也非下划线的字符。9.1.5正则表达式importreemail='vasp@'print(re.findall(r'\W',email))#['@','.'],匹配非字母、数字、下划线print(''.join(re.findall(r'\w',email)))#vaspqqcom,用join()将结果连接为一个字符串37正则表达式的用法实例(2)\s与\S\s匹配任何空白字符,包括空格、制表符、换页符等。\S匹配任何非空白字符。9.1.5正则表达式importrepoem="""苏幕遮范仲淹\n\n\t\t碧云天,黄叶地,秋色连波,波上寒烟翠。\n
\n"""print(''.join(re.findall(r'\S',poem)))#苏幕遮范仲淹碧云天,黄叶地,秋色连波,波上寒烟翠。38正则表达式的用法实例(3)\d与\D\d匹配所有数字字符。\S匹配所有非数字字符。9.1.5正则表达式importretemp_str='子曰1:“学2而时习3之,不亦说4乎?有朋5自远方来,不亦乐6乎?'print(''.join(re.findall(r'\D',temp_str)))#子曰:“学而时习之,不亦说乎?有朋自远方来,不亦乐乎?39正则表达式的用法实例(4)^和$'^s'只匹配位于字符串开头的字符串s。's$'只匹配位于字符串末尾的字符串s。9.1.5正则表达式importretemp_str='武汉理工大学位于武汉'print(re.findall('武汉',temp_str))#匹配字符串中的武汉,['武汉','武汉']print(re.findall('^武汉',temp_str))#只匹配位于字符串开头的武汉,['武汉']print(re.findall('武汉$',temp_str))#只匹配位于字符串末尾的武汉,['武汉']40正则表达式的用法实例(5)点号“.”、星号“*”和问号“?”一个点号可以匹配除换行符(\n、\r)之外的任何单个字符,相等于[^\n\r]。包括但不限于英文字母、数字、汉字、英文符号和中文符号等。问号“?”匹配前面的字符0次或1次,星号“*”匹配前面的字符任意多次。9.1.5正则表达式importretemp_str='abcaaabb'print(re.findall('a.b',temp_str))#['aab']print(re.findall('a?b',temp_str))#['ab','ab','b']print(re.findall('a*b',temp_str))#['ab','aaab','b']print(re.findall('a.*b',temp_str))#['abcaaabb'],匹配任意个数的任意字符print(re.findall('a.*?b',temp_str))#['ab','aaab'],匹配任意个数的任意字符41正则表达式的用法实例(6)转义字符“\”特殊字符,用于转义其他正则表达式元字符的特殊意义。9.1.5正则表达式importretemp_str='\teaching'print(''.join(re.findall('t',temp_str)))
#因\t为制表符,匹配不到ttemp_str='\\teaching'print(''.join(re.findall('t',temp_str)))#因\\t转义,可以匹配ttemp_str=r'\teaching'#r告诉编译器这是一个普通字符串,无需转义。print(''.join(re.findall('t',temp_str)))#输出t42正则表达式的用法实例(7)字符集[]定义一个字符集,允许匹配一组特定的字符中的任意一个字符。9.1.5正则表达式importretemp_str='abbahbazba0ba6ba9b'print(re.findall('a[a-z]b',temp_str))#['abb','ahb','azb']#中间字符属于a-z的字母就可以匹配print(re.findall('a[0-9]b',temp_str))#['a0b','a6b','a9b']#中间字符属于0-9的数字就可以匹配print(re.findall('a[abc]b',temp_str))#['abb']#中间字符只能是abc之一才可以匹配43正则表达式的用法实例(8)分组()将一个正则表达式分成多个子表达式(也称为分组),对整个分组应用量词(如*,+,?等)或者进行替换操作。当正则表达式中包含圆括号时,匹配的文本会被存储到一个编号的捕获组中。可以在后续的替换操作或者引用中使用这些捕获组,例如\1、\2等。9.1.5正则表达式importretemp_str='vasp@'print(re.findall('(\w+)@(\w+).(\w+)',temp_str))#[('vasp','qq','com')]44正则表达式的应用(1)findall()函数提取满足正则表达式的所有字符串。9.1.5正则表达式re.findall(pattern,string,flags=0)45正则表达式的应用(1)findall()函数9.1.5正则表达式importreimportrequests#导入requests模块#网页头,模拟浏览器行为headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/Safari/537.36'}url='/shicimark/songcisanbaishou.html'#浏览器传递参数,'limit':'2'表示只返回前2条数据,修改数字可以得到更多数据response=requests.get(url=url,headers=headers,timeout=1.0)text=response.text.replace('','')poem_name=re.findall('《.*?》',text)#匹配以《开头,以》结尾,中间包含任意字符的字符串print(poem_name)46正则表达式的应用(2)search()函数扫描整个字符串,找到并返回匹配样式的第一个满足正则表达式的字符串,使用group()函数取值,匹配不到时返回None。9.1.5正则表达式re.search(pattern,string,flags=0)47正则表达式的应用(2)search()函数9.1.5正则表达式importretemp_str='?vasp@'ret=re.search(r'\w',temp_str)print(ret.group())#匹配到时使用group()函数取值,返回字符串'v'48正则表达式的应用(3)match()函数从头开始匹配0个或多个字符,若开头不满足,后面满足正则表达式的字符串也不会被匹配。如果没有匹配,就返回None。9.1.5正则表达式re.match(pattern,string,flags=0)49正则表达式的应用(3)match()函数9.1.5正则表达式importretemp_str='?vasp@'ret=re.match(r'\w',temp_str)print(ret)#None50正则表达式的应用(4)sub()函数返回通过使用repl替换在string最左边非重叠出现的pattern而获得的字符串。如果样式没有找到,则不加改变地返回string。repl可以是字符串或函数;如为字符串,则其中任何反斜杠转义序列都会被处理。9.1.5正则表达式re.sub(pattern,repl,string,count=0,flags=0)51解析网页源代码结构使用lxml解析器将网页源代码加载为BeautifulSoup对象使用对象方法提取数据使用前先安装lxml库和BeautifulSoup库pipinstalllxmlpipinstallbeautifulsoup49.1.6BeautifulSoup模块52实例化9.1.6BeautifulSoup模块importrequests#导入requests模块frombs4importBeautifulSoup#网页头,模拟浏览器行为headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/Safari/537.36'}url='/shicimark/songcisanbaishou.html'#浏览器传递参数,'limit':'2'表示只返回前2条数据,修改数字可以得到更多数据response=requests.get(url=url,headers=headers,timeout=1.0)response.encoding='utf-8'soup=BeautifulSoup(response.text,'lxml')#用获取的网页源代码实例化BeautifulSoup对象print(soup)53定位标签——通过标签名进行定位9.1.6BeautifulSoup模块importrequests#导入requests模块frombs4importBeautifulSoup#网页头,模拟浏览器行为headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/Safari/537.36'}url='/shicimark/songcisanbaishou.html'#浏览器传递参数,'limit':'2'表示只返回前2条数据,修改数字可以得到更多数据response=requests.get(url=url,headers=headers,timeout=1.0)response.encoding='utf-8'#用获取的网页源代码实例化BeautifulSoup对象soup=BeautifulSoup(response.text,'lxml')print(soup.h3)#返回第一个<h3>标签下的数据#<h3class="bt">宋词三百首(300首)</h3>54定位标签——通过标签属性进行定位9.1.6BeautifulSoup模块importrequests#导入requests模块frombs4importBeautifulSoup#网页头,模拟浏览器行为headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/Safari/537.36'}url='/shicimark/songcisanbaishou.html'response=requests.get(url=url,headers=headers,timeout=1.0)response.encoding='utf-8'#用获取的网页源代码实例化BeautifulSoup对象soup=BeautifulSoup(response.text,'lxml')#返回第一个属性名为class_=“text"的标签下的数据print(soup.find(class_="text"))print(soup.find('div',class_="text"))#以列表返回全部属性名为class_=“text"的标签下的数据print(soup.find_all(class_="text"))55定位标签——通过选择器进行定位使用select()函数根据指定的选择器返回所有符合条件的标签。9.1.6BeautifulSoup模块Id选择器01Class选择器02标签选择器03层级选择器0456定位标签——通过选择器进行定位id选择器根据标签的id属性进行定位。“#”代表id选择器,后面内容为id属性值,返回一个列表。9.1.6BeautifulSoup模块select('#id名')57定位标签——通过选择器进行定位class选择器根据标签的class属性进行定位,返回满足条件的所有标签的列表。9.1.6BeautifulSoup模块select('.class名')print(soup.select('.shici_content'))58定位标签——通过选择器进行定位标签层层嵌套,利用层级选择器先定位外层的标签,再定位内层的标签,逐层定位,精确定位到内层标签。9.1.6BeautifulSoup模块print(soup.select('h3>a'))print(soup.select('h3a'))59从标签中提取文本string属性返回直接存储于该标签中的文本,而不是存于标签下其他标签中的文本。如果当前标签没有直系文本,或者当前标签包含子标签,导致string属性无法确定要提取哪些文本,返回None。text属性返回的是指定标签下的所有文本。9.1.6BeautifulSoup模块print(soup.select('.shici_list_main')[0].string)#None,无直接存储的数据print(soup.select('.shici_list_main')[0].text)#所有文本,如输出结果所示60定位标签创建etree对象后的网页可以视为树形结构:9.1.7XPath表达式图9.6树形结构61etree对象实例化本地HTML文档,使用parse()函数进行etree对象的实例化。从网上获取到的网页源代码字符串,使用HTML()函数进行实例化。9.1.7XPath表达式fromlxmlimportetreeimportrequests#导入requests模块headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/Safari/537.36'}url='/shicimark/songcisanbaishou.html'response=requests.get(url=url,headers=headers,timeout=1.0)html=etree.HTML(response.text)#<Elementhtmlat0x1fedd5a0700>print(html)62定位标签并提取数据(1)标签名定位“/”表示一个层级。“//”表示多个层级,或当前标签节点之上的每一级标签节点。将数据所在标签一直向上回溯到树的根标签,作为XPath()的参数即可获取最底层标签下面的数据。9.1.7XPath表达式63定位标签并提取数据9.1.7XPath表达式fromlxmlimportetreeimportrequests#导入requests模块headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/Safari/537.36'}url='/shicimark/songcisanbaishou.html'response=requests.get(url=url,headers=headers,timeout=1.0)#print(response.text)html=etree.HTML(response.text)#<Elementhtmlat0x1fedd5a0700>print(html.xpath('/html/body/div/div/div/div/div/h3')[0].text)#宋词三百首(300首)64定位标签并提取数据(2)索引定位etree对象的每一个层级都是一个包含所有标签节点的列表,如果同一层级中有多个同名的标签节点,使用列表切片就能定位到所需的标签节点,即通过索引定位。9.1.7XPath表达式print(html.xpath('///*[@class="main"]/div[2]/div[1]/div[2]/div/ul/li[1]/div[2]/div/a[1]')[0].text)#渔家傲·塞下秋来风景异65定位标签并提取数据(3)属性定位在复杂的网页中,每个标签都有属性,此时可以通过属性定位。“//”表示多个顶层,处于XPath表达式的开头代表从任意层级开始定位。“*”代表任何标签。“[@class="text"]”代表定位class属性值为"shici_content"的任意标签9.1.7XPath表达式print(html.xpath('//*[@class="text"]')[0].text)#塞下秋来风景异,衡阳雁去无留意。四面边声连角起。千嶂里,长烟落日孤城闭。使用这种方法可以定位到指定属性的任意标签。不满足要求时还可以配合用“or”、“and”等逻辑运算来进行更精确的定位。66提取文本内容定位到标签节点后,可以在XPath表达式后面添加:添加“/text()”来提取该节点的直系文本内容添加“//text()”提取该节点下的所有文本内容添加“/@属性名”来提取该节点的指定属性值9.1.7XPath表达式print(html.xpath('//*[@class="text"]/text()'))print(html.xpath('//*[@class="text"]//text()'))67快速获取XPath表达式9.1.7XPath表达式图9.7复制标签的XPath表达式68快速获取XPath表达式9.1.7XPath表达式fromlxmlimportetreeimportrequests#导入requests模块headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/Safari/537.36'}url='/shicimark/songcisanbaishou.html'response=requests.get(url=url,headers=headers,timeout=1.0)#print(response.text)html=etree.HTML(response.text)#<Elementhtmlat0x1fedd5a0700>text_lst=html.xpath('//*[@class="main"]/div[2]/div[1]/div[2]/div/ul/li[2]/div[2]/div/div//text()')print(text_lst)#得到包含醉花阴诗句的列表text_lst=html.xpath('//*[@class="main"]/div[2]/div[1]/div[2]/div/ul//text()')text_lst=[x.strip()forxintext_lstifx.strip()andx.strip()notin['展开全文''收起']]#去除文本中的空行、空字符串、'展开全文'和’收起'print(text_lst)#得到页面上全部诗句的列表69获取全部诗词文本9.1.7XPath表达式fromlxmlimportetreeimportrequests#导入requests模块poem=[]headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/Safari/537.36'}foriinrange(1,16):#宋词共有15页,修改URL中的序号
url='/shicimark/songcisanbaishou_'+str(i)+'_0__0.html'
response=requests.get(url=url,headers=headers,timeout=1.0)
html=etree.HTML(response.text)#<Elementhtmlat0x1fedd5a0700>#获取当前网页上的所有宋词文本
text_lst=html.xpath('//*[@class="main"]/div[2]/div[1]/div[2]/div/ul//text()')
text_lst=[x.strip()forxintext_lstifx.strip()andx.strip()notin['展开全文','收起']]
#去除文本中的空行、空字符串、'展开全文'和'收起'
poem=poem+text_lst#将全部页面上文本合并到一个列表
forlineinpoem:
print(line)#输出查看全部宋词文本70网络爬虫工作方式根据爬取初始URL,解析html网页,抽取其中的超级链接接着抓取这些新发现的链接指向的网页循环往复,从而达到获取网页上的数据的目的9.1.8爬虫协议71网络爬虫可能会引发的问题9.1.8爬虫协议给WEB服务器带来巨大的资源的开销。0102占用带宽资源、甚至导致服务器宕机。03服务器上的数据有产权归属,网络爬虫获取数据后牟利将会带来法律的风险。网络爬虫可能具备突破简单访问的控制能力,获取被保护的数据,从而泄露个人隐私。0472Robots协议用于告知搜索引擎哪些页面可以抓取,哪些页面不能抓取。全称“网络爬虫排除标准”(RobotsExclusionProtocol),也称为爬虫协议、机器人协议等。网站域名根目录下的robots.txt文件指定不同的网络爬虫能访问的页面和禁止访问的页面指定的页面由正则表达式表示9.1.8爬虫协议73WARNING爬虫访问站点时,首先检查是否存在robots.txt如果存在,按照该文件中的内容来确定访问的范围如果不存在,将能够访问网站上所有没有被口令保护的页面9.1.8爬虫协议74Robots协议的写法User-agent:指定对哪些爬虫生效Disallow:指定要屏蔽的网址9.1.8爬虫协议User-agent:BaiduspiderDisallow:/User-agent:baiduspiderDisallow:/例如,淘宝网站不希望被百度抓取,/robots.txt其中:*代表所有,/代表根目录。实例说明:从网站/ssq.shtml获取最30期双色球的开奖数据,并写入到csv文件中。9.1.9爬虫的实例75实例9.1
抓取双色球开奖数据76importrequestsfrombs4importBeautifulSoupimporttimedefget_ball(url,page):
"""解析网页,获取开奖结果,输出提示信息,并写入csv文件"""
html=requests.get(url).text#获取网页源码
soup=BeautifulSoup(html,'html.parser')#解析网页源码
list=soup.select('div.ball_box01ulli')#获取开奖结果
ball=[]#存放开奖结果
forliinlist:#遍历开奖结果
ball.append(li.string)#将开奖结果添加到ball列表中
write_to_csv(page,ball)#将开奖结果写入csv文件
print(f"第{page}期开奖结果录入完成")#打印提示信息实例代码1实例9.1
抓取双色球开奖数据77defwrite_to_csv(page,ball):
"""将开奖结果逐行写入csv文件"""
withopen('双色球开奖结果.csv','a',encoding='utf_8_sig')asfw:
fw.write(f'第{page}期,{ball[0]},{ball[1]},{ball[2]},{ball[3]},{ball[4]},{ball[5]},{ball[6]}\n')实例代码2实例9.1
抓取双色球开奖数据78defget_page():
url="/ssq.shtml"#双色球开奖信息网址
html=requests.get(url).text#获取网页源码
soup=BeautifulSoup(html,'html.parser')#解析网页源码
pageList=soup.select("div.iSelectLista")#获取各期的网址列表
recent_pages=pageList[:30]#获取最近30期的网址列表
forpinrecent_pages:#遍历最近30期的页码
time.sleep(5)#推迟执行5秒,确保可以获取到数据
url=p['href']#获取每期开奖结果的网址
page=p.string#获取每期开奖结果的期数
get_ball(url,page)#解析网页,获取开奖结果,输出提示信息,并写入csv文件实例代码3实例9.1
抓取双色球开奖数据79if__name__=='__main__':
get_page()#调用函数,获取最近30期的开奖结果实例代码4实例9.1
抓取双色球开奖数据运行结果:在当前路径下创建文件“双色球开奖结果.csv”,将近30期的开奖结果逐行写入到文件中。9.2Pandas数据处理81Pandas是基于Numpy的一个开源、高效操作大型数据集的工具。兼容所有Python的数据类型支持两种数据结构一维数组Series二维表格型数据结构DataFrame9.2.1Pandas文件操作82使用pandas库之前需要安装,指令为
Pandas的引用方式为:9.2.1Pandas文件操作pipinstallpandasimportpandasaspd83Pandas输入输出API提供了对文本、二进制和结构化查询语言(SQL)等不同格式类型文件的读写函数,可以方便快速的读取本地文件。9.2.1Pandas文件操作csvtxtjsonhtmlExcel9.2.1Pandas文件操作84表9.6Pandas输入输出API格式类型数据描述读写文本CSVread_csv()to_csv()文本JSONread_json()to_json()文本HTMLread_html()to_html()文本Localclipboardread_clipboard()to_clipboard二进制MSExcelread_excel()to_excel()二进制HDF5Formatread_hdf()to_hdf()二进制FeatherFormatread_feather()to_feather()二进制ParquetFormatread_parquet()to_parquet()二进制Msgpackread_msgpack()to_msgpack()二进制Stataread_stata()to_stata()二进制SASread_sas()
二进制PythonPickleFormatread_pickle()to_pickle()SQLSQLread_sql()to_sql()SQLGoogleBigQueryread_gbq()to_gbq()85read_excel()用于读取Excel文件9.2.2Excel文件读取pd.read_excel(io,sheet_name=0,header=0,names=None,usecols=None,squeeze=False,converters=None,skiprows=None,nrows=None,skipfooter=0)IOExcel的存储路径。86read_excel()
9.2.2Excel文件读取pd.read_excel(io,sheet_name=0,header=0,names=None,usecols=None,squeeze=False,converters=None,skiprows=None,nrows=None,skipfooter=0)sheet_name要读取的工作表名称,默认读取第一个工作表。整型数字:目标sheet所在的位置,以0为起始,sheet_name=1代表第2个工作表。列表名:目标sheet的名称,中英文皆可。SheetN:代表第N个sheet,S要大写。87read_excel()
9.2.2Excel文件读取pd.read_excel(io,sheet_name=0,header=0,names=None,usecols=None,squeeze=False,converters=None,skiprows=None,nrows=None,skipfooter=0)header用哪一行作列名。默认为0如果设置为[0,1],则表示将前两行作为多重索引。88read_excel()
9.2.2Excel文件读取pd.read_excel(io,sheet_name=0,header=0,names=None,usecols=None,squeeze=False,converters=None,skiprows=None,nrows=None,skipfooter=0)names自定义最终的列名。适用于Excel缺少列名,或者需要重新定义列名的情况。长度必须和Excel列长度一致。89read_excel()
9.2.2Excel文件读取pd.read_excel(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公交车突发事件应急演练预案
- 个体化健康教育记录表
- 腹腔引流管道滑脱应急预案演练脚本
- 钢结构监理实施细则(新)
- 肺癌试题及答案
- 儿童发展心理学试题库及答案
- 动火作业安全考试试题及答案
- 磁共振诊断试题及答案
- AI引用品牌前先做好西双版纳GEO优化前期诊断服务
- 2026-2027学年高二上学期开学语文试题
- GB/T 6109.17-2025漆包圆绕组线第17部分:180级自粘性直焊聚酯亚胺漆包铜圆线
- 内镜室医院感染知识培训课件
- LNG接收站安全培训课件
- 商砼站消防演习应急预案
- 足少阴肾经课件
- 医学实验室建设
- 厂区油污管理办法
- 4.2 厘米和米(2)(教学课件) 人教版(2024)小学数学二年级上册
- 涂装车间质量培训
- 消防站建设项目环评报告
- CJT 340-2016 绿化种植土壤
评论
0/150
提交评论