1、7.1网络爬虫工作的基本原理7.2网页内容获取-requests库概述7.3网页内容解析-Beautiful Soup库7.6实战:大数据论文文章标题采集习题7.5实战:热门电影搜索of5617.7实战:全国空气质量第七章网络爬虫7.4正则表达式第七章 网络爬虫of3127.1.1 网页的概念7.1 类的方法1、URL的含义URL(Uniform Resource Locator,URL)称为统一资源定位符,也称为网址。互联网上的每个页面,都对应一个URL。如:浏览上海市空气质量和pm2.5指标的网址为http:/ 网络爬虫of3137.1.1 网页的概念7.1 类的方法2、页面的渲染用户若想
2、要浏览城市空气质量排名情况,必须输入网址:http:/ 的结果,网页的样式,实际上是html源代码经过渲染后形成的。这个页面实际上是用户通过浏览器向DNS服务器提交http:/ 网络爬虫of3147.1.1 网页的概念7.1 类的方法3、网页文件的格式网页文件主要是由各种标签对构成的一个纯文本文件,如:与标签对,与标签对等,不同的标签有不同的作用。如:li标签定义列表项目,span标签被用来组合文档中的行内元素。标签可以有属性,可以有显示的文本。下面以表格第一行乐山市对应的第二列的html代码(乐山市)为例进行说明:与:是一对标签,class=td td-2nd,说明,span标签有一个cla
3、ss属性,值为td td-2nd,用于设置列的外观。乐山市,是span标签的内嵌标签,用于设置超链接的,超链接文本是“乐山市”,超链接网址是/air/leshan.html,是个相对路径,绝对路径是http:/ 网络爬虫of3157.1.2 网络爬虫的工作流程7.1 类的方法网络爬虫实质上是一个能自动下载网页的程序,它是搜索引擎中最核心的部分。通用网络爬虫是从一个或若干个初始网页上的URL开始,读取网页的代码并对页面结构进行分析、过滤,并对感兴趣的内容建立索引,同时提取网页上的其他感兴趣的超链接地址,放入到待爬行队列中,如此循环,直到满足系统的停止条件为止。在爬取网页过程中,如何根据当前网页的
4、超链接页面,形成待爬行队列呢?目前有基于IP 地址搜索策略、广度优先策略、深度优先策略和最佳优先等,具体请看相关文档。第七章 网络爬虫of3167.1.3 Python与网页爬虫7.1 类的方法使用Python 语言实现网络爬虫和信息提交是非常简单的事情,代码行数很少,也无须知道网络通信等方面知识,非常适合非专业读者使用。然而,肆意的爬取网络数据并不是文明现象,通过程序自动提交内容争取竞争性资源也不公平。就像那些肆意的推销电话一样,他们无视接听者意愿,不仅令人讨厌也有可能引发法律纠纷。在互联网上爬取数据,要遵从Robots 排除协议(Robots Exclusion Protocol),它也被
5、称为爬虫协议,是网站管理者表达是否希望爬虫自动获取网络信息意愿的方法。管理者可以在网站根目录放置一个robots.txt 文件,并在文件中列出哪些链接不允许爬虫爬取。一般搜索引擎的爬虫会首先捕获这个文件,并根据文件要求爬取网站内容。Robots 排除协议重点约定不希望爬虫获取的内容,如果没有该文件则表示网站内容可以被爬虫获得,然而,Robots 协议不是命令和强制手段,只是国际互联网的一种通用道德规范。绝大部分成熟的搜索引擎爬虫都会遵循这个协议,建议个人也能按照互联网规范要求合理使用爬虫技术。7.1网络爬虫工作的基本原理7.2网页内容获取-requests库概述7.3网页内容解析-Beauti
6、ful Soup库7.6实战:大数据论文文章标题采集习题7.5实战:热门电影搜索of5677.7实战:全国空气质量第七章网络爬虫7.4正则表达式第七章 网络爬虫of3187.2.1 requests对象7.2 网页内容获取-requests库概述http工作原理:HTTP是基于请求-响应模式的,客户端发出请求叫Request,服务器端的响应叫Response。HTTP请求服务器端,常用的方式是GET和POST。通常,GET表示向指定的服务器请求数据,POST表示向指定的服务器提交要被处理的数据。Requests请求的相关函数:Get(url,timeout=n):对应HTTP的get方法,获取
7、网页内容,timeout设定每次请求的超时时间,单位秒。该函数将网页的内容封装成一个Response对象并返回。Post(url,data=key:value):对应HTTP的post方式,其中字典用于传递客户端数据。第七章 网络爬虫of3197.2.2 response对象7.2 网页内容获取-requests库概述通过Response对象的属性可以获取网页内容。属性:Status_code:http请求返回的状态,整数,200表示连接成功,404表示失败。在处理网页数据前,要先判断该状态值。Text:页面内容,以字符串形式存储在text中。Encoding:HTTP响应内容的编码格式,通过
8、此属性可以更改返回页面的编码格式,便于处理中文。方法:Json():如果HTTP响应页面包含JSON格式数据,该方法能够在HTTP 响应内容中解析存在的JSON 数据,这将带来解析HTTP的便利。raise_for_status():方法能在非成功响应后产生异常,即只要返。回的请求状态status_code 不是200,这个方法会产生一个异常,用于tryexcept 语句。使用异常处理语句可以避免设置一堆复杂的if 语句,只需要在收到响应调用这个方法。第七章 网络爬虫of31107.2.2 response对象7.2 网页内容获取-requests库概述当遇到网络问题时阿,requests 会
9、产生几种常用异常。例如:DNS 查 询 失 败、拒 绝 连 接 等,requests 会 抛 出ConnectionError 异常。遇到无效HTTP 响应时,requests 则会抛出HTTPError 异常。若请求url 超时,则抛出Timeout 异常。请求超过了设定的最大重定向次数,则会抛出一个TooManyRedirects 异常。所以在使用requests 时,通常需要将此语句放在try快中进行处理。第七章 网络爬虫of31117.2.2 response对象7.2 网页内容获取-requests库概述【案例7-1】爬取天堂图片网中小黄人图片网页的内容import requests
10、def gethtmltext(url):try:r=requests.get(url,timeout=30)r.raise_for_status()return r.text except:return“url=http:/ Soup库7.6实战:大数据论文文章标题采集习题7.5实战:热门电影搜索of56127.7实战:全国空气质量第七章网络爬虫7.4正则表达式第七章 网络爬虫of31137.3.1 Beautiful Soup库概述7.3 网页内容解析-Beautiful Soup库beautifulsoup4 库,也称为Beautiful Soup 库或bs4 库,用于解析和处理HTML
11、和XML。它的最大优点是能根据HTML 和XML 语法建立解析树,进而高效解析其中的内容。类似于c#中的或HTTP中的文档类HTML 建立的Web 页面一般非常复杂,除了有用的内容信息外,还包括大量用于页面格式的元素,直接解析一个Web 网页需要深入了解HTML 语法,而且比较复杂。beautifulsoup4 库将专业的Web 页面格式解析部分封装成函数,提供了若干有用且便捷的处理函数。有关beautifulsoup4 库的更多介绍请参考这个第三方库主页:http:/ 网络爬虫of31147.3.1 Beautiful Soup库概述7.3 网页内容解析-Beautiful Soup库例如:
12、有一个描述学生选课的XML代码,表示20004146学生选修了2门课,20004176选修了1门课。20004146111167 2222 78 200041762222 70 第七章 网络爬虫of31157.3.1 Beautiful Soup库概述7.3 网页内容解析-Beautiful Soup库它对应的Beautiful Soup对象的逻辑结构可以理解成这样一棵树。树中一般有4类节点:Tag,NavigableString,BeautifulSoup,Comment,但很多时候,可以把节点当作 Tag 对象。第七章 网络爬虫of31167.3.2 beautifulsoup4 库常用方
13、法和tag节点7.3 网页内容解析-Beautiful Soup库beautifulsoup4 提供Xpath操作方式解析数据:1.即按照解析树的逻辑结构,解析数据。2.解析树上的常用节点是tag节点。3.常用方法:BeautifulSoup(html,”html.parser”):该方法需要两个参数,第一参数是需要提取数据的html文档内容或XML,第二个参数是指定解析器。该方法的目的是生成一颗解析树。find_all(name,attrs,recursive,string,limit):方法可以根据标签名字、标签属性和内容检索并返回标签列表。name为标签名;attrs为标签的属性名和值,
14、采用JSON表示;recursive,设置查找层次;string标签的字符串内容;limit返回匹配结果的个数。利用 string参数可以实现模糊查找。find(name,attrs,recursive,string):返回找到的第一个结果,find_all()函数由于可能返回更多结果,所以采用列表形式存储返回结果;find()函数返回字符串形式,找不到,返回None。第七章 网络爬虫of31177.3.2 beautifulsoup4 库常用方法和tag节点7.3 网页内容解析-Beautiful Soup库例如:根据选课学号和门数标签字符串,输出选课的学号。soup=BeautifulSo
15、up(200041462 201810125)tag=soup.scs print(tag.string)print(tag.contents0.name)print(tag.contents0.sno.string)soup.find_all(sno)7.1网络爬虫工作的基本原理7.2网页内容获取-requests库概述7.3网页内容解析-Beautiful Soup库7.6实战:大数据论文文章标题采集习题7.5实战:热门电影搜索of56187.7实战:全国空气质量第七章网络爬虫7.4正则表达式第七章 网络爬虫of31197.4.1 正则表达式概念7.4 正则表达式从网页中解析需要的数据,除
16、了采用beautifulsoup4 库的方法,也可以根据被查找字符串的特征,采用正则表达式的方法,得到符合条件的子字符串。正则表达式库是python的标准库,使用时:import re,即可。正则表达式(Regular Expression):称为规则表达式,又称为规则字符串,它通过一个字符序列来表示满足某种逻辑条件的字符串,主要用于字符串模式匹配或字符串匹配。一个正则表达式由字母、数字和一些特殊符号组成,特殊符号也称为元字符,在正则表达式中具有特殊的含义,可以用来匹配一个或若干个满足某种条件的字符,这些元字符才是构成正则表达式的关键要素。正则表达式通过元字符的各种运用,可以表示丰富的匹配字符
17、串。对程序员来说,如果需要从源字符串中得到需要的子字符串(也称结果字符串),首先要分析子字符串在源字符串中的规律,根据规律去描述正则表达式。第七章 网络爬虫of31207.4.2 正则表达式元字符介绍7.4 正则表达式1、字符限定元字符字符作用m1m2mn表示一个字符集合(m1、m2mn等均为单个字符),表示可以与集合中的任意一个字符匹配m1m2mn表示可以与集合之外的任意一个字符匹配m-n表示一个字符范围集合,表示可以与字符m到n之间的所有字符匹配m-n表示可以与集合范围之外的任意一个字符匹配d用来匹配一个数字字符,相当于“0-9”D用来匹配一个非数字字符,相当于“0-9”w用来匹配一个单词
18、字符(包括数字、大小写字母和下画线),相当于“A-Za-z0-9_”W用来匹配任意一个非单词字符,相当于“A-Za-z0-9_”s用来匹配一个不可见字符(包括空格、制表符、换行符等)S用来匹配一个可见字符.用来匹配除了换行符外的任意一个字符第七章 网络爬虫of31217.4.2 正则表达式元字符介绍7.4 正则表达式【简单案例】import re str=南昌市17优则:re.findall(rdd,str)17,79,80#匹配出str中只含2个数字的字符串 re.findall(r6789d,str)#匹配出str中只含2个数字的字符串,且第一个数字符号可以是6或7或8或9 79,80 r
19、e.findall(rtd.,str)#匹配出 str中以td开头,第三个字符不是换行符的连续三个字符 td,td-,td,td-,td,td-s=aaa,bbb ccc high#定义字符串 re.findall(ra-zA-Z+,s)aaa,bbb,ccc,high#实现了分词效果第七章 网络爬虫of31227.4.2 正则表达式元字符介绍7.4 正则表达式2、数量限定元字符字符作用*用来匹配前面的字符任意多次(0到多次)+用来匹配前面的字符一次或多次?用来匹配前面的字符零次或一次n用来匹配前面的字符n次,n是一个非负整数n,用来匹配前面的字符至少n次,n是一个非负整数n,m用来匹配前面的
20、字符串至少n次,至多m次,m和n为非负整数且nm*?,+?,?,?跟在前面所述的任何一个数量限定符后面时,表示匹配模式是非贪婪的,即尽可能少地匹配字符串。而默认情况下,匹配是贪婪的,即尽可能多地匹配所搜索的字符串。请将案例7-2中注释掉的正则表达式改为list1=re.findall(r_blank.1,?import re str=南昌市17优则:#re.findall(rd2,str)等价于re.findall(rdd,str),re.findall(rddd,str)re.findall(rd2,str)17,79,800#匹配出str中至少含2个数字的字符串 re.findall(rd
21、1,bd1,str)79b800#匹配出str中数字串中包含一个字母b的字符串 s=fdfdaaaaadfefebbbbregex=.*?re.findall(regex,s)aaaaa,bbbb#从字符串中分离出标签对第七章 网络爬虫of31247.4.2 正则表达式元字符介绍7.4 正则表达式3分组元字符字符作用(正则表达式)将括号之间的正则表达式称为一个子组(group),一个子组对应一个匹配字符串,子组的匹配内容会返回(?P=)也用来定义一个组。这种方式定义的组可以被组名索引进行访问,访问方式为“(?P=name)”。|用来将两个匹配条件进行逻辑“或”运算 第七章 网络爬虫of3125
22、7.4.2 正则表达式元字符介绍7.4 正则表达式【简单案例】import re str=Sat May 28 22:18:59 1994:gsbxhwtkxw.gov:770134739-5-5Fri Dec 1 19:33:07 1995:odzfmsqkqgefpjbd.gov:817817587-5-11则:regex=:(a-z2,13)(a-z2,13).(com|edu|net|org|gov)re.findall(regex,str)#只输出分组内的匹配字符串(gsbxh,wtkxw,gov),(odzfm,sqkqgefpjbd,gov)第七章 网络爬虫of31267.4.2
23、 正则表达式元字符介绍7.4 正则表达式4、字符定位元字符字符作用用来匹配输入字符串是否以。开始。$用来匹配输入字符串是否以。结束。b用来匹配一个单词边界(即单词和空格之间的位置)。事实上,所谓单词边界不是一个字符,而只是一个位置。B用来匹配一个非单词边界。第七章 网络爬虫of31277.4.2 正则表达式元字符介绍7.4 正则表达式【简单案例】import re str=南昌市17优则:re.findall(rtd,str)td,td,td,td,td,td re.findall(rtd,str)#判断str是以td开头,进行匹配第七章 网络爬虫of31287.4.2 正则表达式元字符介绍7
24、.4 正则表达式5.转义元字符字符作用元字符在符号在正则表达式中与特殊的含义,如果想要匹配元字符,可以采用转义的方式。如:,*,.等第七章 网络爬虫of31297.4.2 正则表达式元字符介绍7.4 正则表达式【简单案例】import re str=南昌市17优则:re.findall(r.*?,str)#匹配出str中所有 之间的字符串td td-2nd,/air/nanchang.html,_blank,td td-4rd,td td-4rd,f1,color:#79b800 re.findall(r.*?,str)td td-2nd,/air/nanchang.html,_blank,t
25、d td-4rd,td td-4rd,f1,color:#79b800#通过结果可以看出,如果把元字符放在中,就不需要采用转义方式。第七章 网络爬虫of31307.4.3 正则表达式的常用函数介绍7.4 正则表达式pile(pattern,flags=0)匹配任何可选的标记来编译正则表达式的模式,然后返回一个正则表达式对象 re.search(pattern,string,flags=0)使用可选标记搜索字符串中第一次匹配正则表达式的对象。如果匹配成功,则返回匹配对象,否则返回Nonere.match(pattern,string,flags=0)使用带有可选标记的正则表达式的模式来匹配字符串
26、,匹配是从字符串的第一个字符开始进行。如果匹配成功,返回匹配对象,否则返回Nonere.findall(pattern,string,flags=0)查找字符串中所有匹配的子字符串,并返回一个字符串匹配列表 匹配对象.group(num=0)返回整个匹配对象,或者编号为num的特定子组第七章 网络爬虫of31317.4.3 正则表达式的常用函数介绍7.4 正则表达式例如:下面的正则表达式定义从s中匹配出ip地址的内容。import re s=ipddress192.168.10.1elsem1=re.search(r(010,1d0,1d|250-5).)3(010,1d0,1d|20-4d|
27、250-5),s)print(m1.group()#输出192.168.10.1 str=南昌市17优武汉市17优 re.findall(r_blank(.1,?),str)#匹配出所有的城市名南昌市,武汉市第七章 网络爬虫of31327.4.3 正则表达式的常用函数介绍7.4 正则表达式【案例】爬取解析并保存天堂图片网的小黄人图片import requestsimport re#爬取天堂图片网小黄人图片网页源码url=http:/ item in myItems:print(item)第七章 网络爬虫of31417.6 实战:大数据论文文章标题采集url=http:/ i in range(
28、1,count+1,20):print(第+str(j+1)+页)if j=0:url=http:/ else:url=http:/ j=j+1#print(url)#读取网页并解析 html=gethtmltext(url)paper_title(html)第七章 网络爬虫of31427.6 实战:大数据论文文章标题采集运行结果:7.1网络爬虫工作的基本原理7.2网页内容获取-requests库概述7.3网页内容解析-Beautiful Soup库7.6实战:大数据论文文章标题采集习题7.5实战:热门电影搜索of56437.7实战:全国空气质量第七章网络爬虫7.4正则表达式第七章 网络爬虫o
29、f31447.7 实战:全国空气质量【案例】用beautifulsoup4爬取全国空气质量数据import requestsfrom bs4 import BeautifulSoup#一共有318座重点城市a=0 for col in range(3)for row in range(318)def gethtmltext(url):try:r=requests.get(url,timeout=30)r.raise_for_status()#r.encoding=utf-8 return r.text except:print(error)return 第七章 网络爬虫of31457.7 实战
30、:全国空气质量def fillweather(soup):j=i=0 city_name_list=soup.find_all(class_=td td-2nd)city_num_list=soup.find_all(class_=td td-4rd)#print(len(city_name_list)#print(ghghggh)while ilen(city_name_list):city_name=city_name_listi.get_text()city_num=city_num_listj.get_text()#city_num=city_num_listj.text#两种方法都可
31、以 city_info=city_num_listj+1.get_text()ai0=city_name ai1=city_num ai2=city_info i=i+1 j=j+2def printweather():print(排名,城市,空气质量指数,质量状况)for i in range(317):print(i+1,ai)第七章 网络爬虫of31467.7 实战:全国空气质量def main():#全国重点城市空气质量指数排行榜 url=http:/ html=gethtmltext(url)#print(html)if(html!=):soup=BeautifulSoup(html,html.parser)fillweather(soup)printweather()main()第七章 网络爬虫of31477.7 实战:全国空气质量运行结果:7.1网络爬虫工作的基本原理7.2网页内容获取-requests库概述7.3网页内容解析-Beautiful Soup库7.6实战:大数据论文文章标题采集习题7.5实战:热门电影搜索of56487.7实战:全国空气质量第七章网络爬虫7.4正则表达式习题:1用Python爬取今日头条动态页面数据。2用Python爬取电影票房数据网http:/