




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章Python网页下载技术
数1、http是超文本传送协议,https是加密传输协议。浏览器默认使用HTTP协议。2、http请求是典型的请求-响应类型的的网络协议:客户端按照指定的格式开始向服务端发送HTTP请求;服务器读取和分析请求信息,生成响应信息;最后返回一个HTTP的响应给客户端2.1HTTP协议简介1、格式:http://host[:post][abs_path]其中:(1)http:表示传输协议是http协议;(2)host:表示的是主机域名或IP地址;(3)port:指端口号;(4)abs_path:指要请求的资源的路径。2.1.1HTTP协议简介2、请求信息的内容:(1)请求行:请求方法、http协议版本和URL;(2)请求头部:用键值对表示,如Accept-Charst:utf-8,指定客户端接收的字符集;(3)空行:通知请求头部结束;(4)请求数据:由数据头部信息和数据内容组成,数据头部规定了数据的类型、长度、编码等信息(post方法有请求数据,get方法不能发送请求数据)。2.1.1HTTP协议3、响应信息的内容:(1)状态行:协议版本、状态码(如常见的404,500,200)以及状态码文本描述;(2)响应头部:用键值对表示;(3)空行:表示响应头部结束;(4)响应数据:服务器返回的数据内容和数据头部信息(head请求无响应数据)。2.1.1HTTP协议4、HTTP请求/响应的步骤(1)建立连接;(2)发送HTTP请求;(3)服务器接受请求并返回HTTP响应;(4)释放连接;(5)客户端浏览器解析响应信息。2.1.1HTTP协议1、http请求消息是浏览器发送给web服务器的信息。2、一个完整的http请求消息,包含“请求行,请求头部,空行(分隔行),请求数据”。其中空行表示请求头部结束。(1)请求行:由三部分组成:请求方法,请求URL(不包括域名),HTTP协议版本。请求方法有GET、POST、HEAD、PUT、DELETE等,最常用的是GET和POST。2.1.2http请求消息2.1.2http请求消息(2)请求头部:Accept:用于告诉服务器,客户机支持的数据类型,如Accept:text/html,image/*;Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式;Accept-Language:客户机语言环境;Connection:告诉服务器,请求完成后,是否保持连接;Cookie:客户机将Coockie信息带给服务器;Host:客户机想访问的主机名;Referer:客户机通过这个信息告知服务器,客户端访问服务器的路径;User-Agent:客户机通过这个信息告知服务器,客户机的软件环境,如操作系统,浏览器版本等。2.1.2http请求消息(3)请求数据:指浏览器端通过http协议发送给服务器的数据。如“T=9008&rsv=80”。2.1.2http请求消息HTTP响应消息是服务器端向客户端回送的数据,它包括状态行、响应头部、空行和响应数据。其中空行表示响应头部结束。1、状态行:由三部分组成:服务器HTTP协议版本,响应状态码,状态码的文本描述。如“HTTP/1.1200OK”。状态码:由3位数字组成,第一个数字定义了响应的类别。2xx:表示请求已被成功接受,其中200OK:表示客户端请求成功。3xx:重定向信息4xx:客户端错误5xx:服务器端错误,服务器未能实现合法的请求。2.1.3http响应消息2、响应头部(消息头):Server:服务器通过这个头,告诉浏览器服务器的类型;Content-Encoding:告知浏览器,服务器的数据压缩格式;Content-Type:告知浏览器,回送数据的类型;Transfer-Encoding:告知浏览器,传送数据的编码格式;Expries:告知浏览器回送的资源缓存多长时间。如果是-1或者0,表示不缓存;Cache-Control:控制浏览器不要缓存数据;Connection:响应完成后,是否断开连接;Date:告诉浏览器,服务器响应时间。2.1.3http响应消息3、响应数据(响应体):响应数据包含浏览器能够解析的静态内容,如:html,纯文本,图片信息等。2.1.3http响应消息2.2.1爬虫的基本流程网络爬虫(又称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。2.2爬虫基础1、爬虫程序发起http请求:使用http请求方法向目标站点的web服务器发起请求,即发送一个Request,Request包含:请求头、请求体等。2、接收响应信息:如果web服务器能正常响应,则会得到一个Response响应对象,Response包含:状态码、html、json、图片、视频等响应内容。3、解析反馈的非结构化数据:如解析html数据,可使用正则表达式、css选择器、第三方解析库如Beautifulsoup等;如需解析json数据,可使用json模块处理方法;如需解析二进制数据,可以”wb”的方式写入文件系统,在进行相应的处理。4、保存数据:将非结构化数据进行清洗后,提取的有效数据保存在数据库或txt、csv、json等数据库或文件系统中。2.2.1爬虫的基本流程1、通用网络爬虫:
通用网络爬虫又叫作全网爬虫。搜索引擎中一般使用通用网络爬虫。2、聚焦网络爬虫:按照预先定义好的主题有选择地进行网页爬取的一种爬虫,也叫主题网络爬虫。3、增量式网络爬虫:
爬取网页的时候只爬取内容发生变化的网页或者新产生的网页。4、深层网络爬虫:深层网络爬虫则可以抓取到深层网页的数据。2.2.2爬虫分类2.2.3爬虫结构爬虫程序框架1、爬虫调度器:用来启动、执行、停止爬虫,或者监视爬虫中的运行情况。
首先根据需求从互联网页面中精心选择种子URL,种子URL作为爬虫的起始点放入待抓取URL队列中,同时以种子URL启动网页下载器;调用网页解析器将内容解析,获得价值数据和待爬取的URL链接,放入URL管理器中;直到所有的URL被爬取。2.2.3爬虫结构2.2.3爬虫结构爬虫调度器和各模块的运行流程2、URL管理器:
主要是管理待抓取URL和已抓取URL,其目的是为了防止重复抓取,循环抓取;URL管理器的实现方式一般采用Python的集合、列表或数据库等方式。3、网页下载器:
将互联网上URL对应的网页下载到本地的工具。Python中的网页下载器,大致为requests是和urllib两种。其中urllib是python的基础模块,requests是第三方库。4、网页解析器:
网页解析器是从网页中提取有价值数据的工具。Python的网页解析器有两大类:分别是通过DOM树方式的结构化解析器和通过字符串模糊查找的正则表达式匹配的方式。2.2.3爬虫结构一、robots协议是国际互联网界通行的道德规范,基于以下原则建立:1、搜索技术应服务于人类,同时尊重信息提供者的意愿,并维护其隐私权;2、网站有义务保护其使用者的个人信息和隐私不被侵犯。符合Robots协议规范的爬虫才是一个合法的爬虫。2.3robots协议二、robots协议也叫robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络爬虫,此网站中的哪些内容是不应被获取,哪些是可以被爬虫获取的。三、robots.txt是搜索引擎访问网站时要查看的第一个文件。四、robots.txt文件常用的语法:User-agent:*这里的*代表的所有的搜索引擎种类,*是一个通配符Disallow:/htmlpage/这里定义是禁止爬取htmlpage目录下面的目录Allow:.htm$仅允许访问以".htm"为后缀的URL。Allow:.gif$允许抓取网页和gif格式图片如:禁止所有搜索引擎访问网站的任何内容:User-agent:*Disallow:/2.3robots协议1、Requests是用python语言编写的第三方库;2、Python中还提供了urllib模块,也可以实现网页的提取和下载的功能。但urllib模块使用相对复杂,3、扩展库requests模块是urllib3的下一代产品。4、requests模块不是Python自带的,所以必须先安装。2.4网页下载器Requests库的应用打开cmd窗口,如图进入到你的python安装目录:2.4.1安装接下来,做一个简单的测试,确保requests模块已经正确安装。打开python,在IDLE交互式环境中输入以下代码:>>>importrequests如果没有错误信息显示,requests模块就已经安装成功了。2.4.1安装例2-1:第一个爬虫程序--爬取首页的代码。importrequestsurl=""response=requests.get(url)#发出网页请求print(response.text)#输出相应信息的内容在这个实例中,url为爬取的目标网页的地址,requests.get(url)是网页请求方法,response变量是网页响应对象,response.text是响应对象的属性。2.4.1安装request对象:在爬虫中我们将客户端通过浏览器提交到web服务器的请求称为request对象;在requests库中通过提供对应于http协议中相应功能的请求方法实现自动请求。response对象:web服务器返回的响应信息称为response对象。通过提供响应对象response的属性和方法提取web服务器反馈的信息。2.4.2requests库的一些常用方法2.4.2requests库的一些常用方法requests.put()、requests.patch()、quests.delete(),这三个方法一般web服务器会禁止浏览器的访问。requests.request()是其他六个方法的基础方法,我们将重点介绍它的各个参数用法。requests.get()和requests.post()方法是网页请求使用最多的两个方法。2.4.2requests库的一些常用方法1、requests.request(method,url,**kwargs):method:新建Request对象要使用的HTTP方法,包括:get,post,put,delete等。url:新建Request对象的URL链接。**kwargs:13个控制访问的可选参数。params:字典或字节序列,作为参数增加到url中;data:作为Request对象body的内容;json:JSON格式的数据,作为Request对象body的内容;headers:字典格式,HTTP请求头,作为Request对象Header的内容;cookies:字典类型,Request中的cookie信息;proxies:字典类型,用于将协议映射为代理的URL;verify:T认证SSL证书开关;其他:Files、auth、timeout、allow_redirects、stream、cert2.4.2requests库的一些常用方法2、requests.get(url,params=None,**kwargs):等价于requests.request('get',url,**kwargs)。这是最常用的请求方法。get()请求的查询字符串以明码的形式在url中发送。传送的数据量有限,因为是明码传送,传送数据的安全性较低。
url:拟获取页面的url链接;
params:url中的额外参数,字典或字节流格式,可选,默认为None; **kwargs:12个控制访问的参数(除params)。可选。2.4.2requests库的一些常用方法例2-2:requests中get请求实现参数传递的方式。以百度搜索为例:百度的搜索关键字放在“wd”关键字中的,输入一个关键字,可以通过观察浏览器的url地址栏中的“wd关键字”确认。importrequestsurl='/'para={'wd':'get方法'}#将需要搜索的关键字定义为字典传给paramsr1=requests.get(url,params=para,headers=header)print("r1.url=",r1.url)lists=['get','post','put']#多参数的访问para1={'wd':''}#初始化参数键值对,值为空串forsinlists:para1['wd']=str(s)r=requests.get(url,params=para1,headers=header)print("r{}.url=".format({s}),r.url)2.4.2requests库的一些常用方法3、requests.post(url,data=None,json=None,**kwargs):等价于requests.request('post',url,**kwargs)。Post()请求的查询字符串是在请求的主体信息中发送的,可以发送大量的信息,同时安全性更高。url:拟更新页面的url链接;data:字典、字节序列或文件,Request的内容;json:JSON格式的数据,Request的内容;**kwargs:11个控制访问的参数(除data,json)。
post一般用于在请求中提供大量数据的请求,可以使用data参数、json参数进行数据传送;如果返回的是json数据,可以使用response.json()来将json字符串转换为字典或者列表。2.4.2requests库的一些常用方法例2-3:post方法传输数据访问百度翻译并解析成JSON格式。importrequestsheader={'User-Agent':'Mozilla/5.0',}url='/sug'#sug是打开f12以后重新输入需要翻译的词即可从Network中找到deffanyi(value):key={'kw':value}#key['kw']=value,也可以使用这种方法赋值
print('key=',key)r=requests.post(url,data=key,headers=header)result=r.json()returnresultif__name__=='__main__':word=input("输入要翻译的内容:")res=fanyi(word)print(res)
问题提出:我们在IDLE中输入下面的代码:>>>importrequestsasreqr=req.get("")>>>r.request.header:{'User-Agent':'python-requests/2.20.1','Connection':'keep-alive','Accept-Encoding':'gzip,deflate','Accept':'*/*'}。请求头中的User-Agent为“python-requests/2.20.1”这是爬虫程序的头部,不是浏览器的头部信息。2.4.3requests爬虫之定制请求头
这个头部信息对于禁止爬虫的网页来说,将爬取不到网页的内容。例2-4:下载知乎首页,并输出网页信息importrequestsurl=='/'r=requests.get(url)print("r=",r.url)print("type(r)=",type(r.url))r.encoding=r.apparent_encodingprint("r.内容=",r.text)2.4.3requests爬虫之定制请求头在运行程序,发现输出的结果是:>>>r=/type(r)=<class'str'>r.内容=<html><head><title>400BadRequest</title></head><bodybgcolor="white"><center><h1>400BadRequest</h1></center><hr><center>openresty</center></body></html>>>>输出结果中有一段信息:“400BadReques”,表明“r=requests.get(url)”方法没有能够爬取到正确的网页信息,返回的是一段错误的代码。爬虫程序告知服务器的头部信息为:User-Agent为“python-requests/2.20.1”这不是浏览器的信息。如果服务器设置了反爬虫,会导致requests库返回错误,一般状态码为400。我们可以通过设置请求头信息伪装成浏览器访问绕过web服务器对爬虫程序的识别。1、查找请求头Headers信息:在采用设置请求头信息伪装成浏览器访问绕过web服务器对爬虫程序的识别的方法时,我们需要先找到我们浏览器的http访问的请求头部信息。常用的有以下七个请求头信息:Host、Connection、Accept、User-Agent、Referrer、Accept-Encoding和Accept-Language。这七个头部信息的含义在前面html部分已做介绍。2.4.3requests爬虫之定制请求头以为例,从浏览器中打开网页,用F12或右键–>检查(或检查元素),打开开发者工具,选择“网络(network)”选项,在浏览器中“刷新”页面,在开发者页面中选取“名称(name)”为的页面,查看页面中右侧的头部的请求标头(Requestheaders)信息。2.4.3requests爬虫之定制请求头2、Requests设置请求头Headers:查找到请求头的信息后,可以将Requestheaders的信息复制到程序中,我们可以在在程序中添加一段代码:
header={"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/61.0.3163.100Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","accept-language":"zh-CN,zh;q=0.9"}r=requests.get(url,headers=header)#在请求时,加上headers参数简化设置为:header={'User-Agent':'Mozilla/5.0',}2.4.3requests爬虫之定制请求头在程序中可能有的浏览器伪装被封,可以寻找多个浏览器头部信息存储在列表中,采用随机函数在requests库请求时随机产生一个头部信息。例2-5:随机获取请求头信息(各个浏览器的信息可以在网上查找)。importrandomdefget_ua():#定义一个函数,可以在程序中调用
ua=["Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/61.0.3163.100Safari/537.36","Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50","Mozilla/5.0(WindowsNT10.0;WOW64;rv:38.0)Gecko/20100101Firefox/38.0","Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1)","Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv:2.0.1)Gecko/20100101Firefox/4.0.1","Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1","Opera/9.80(Macintosh;IntelMacOSX10.6.8;U;en)Presto/2.8.131Version/11.11","Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11","Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11","Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Maxthon2.0)","Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;360SE)","Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;AvantBrowser)","Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)","Opera/9.80(Android2.3.4;Linux;OperaMobi/build-1107180945;U;en-GB)Presto/2.8.149Version/11.10","Mozilla/5.0(Linux;U;Android3.0;en-us;XoomBuild/HRI39)AppleWebKit/534.13(KHTML,likeGecko)Version/4.0Safari/534.13","Mozilla/5.0(BlackBerry;U;BlackBerry9800;en)AppleWebKit/534.1+(KHTML,likeGecko)Version/37MobileSafari/534.1+"]returnrandom.choice(ua)#返回头信息header={'user-agent':get_ua()}print(header)前面的章节中我们学习了使用requests库中用于网页请求的各个方法和参数。下面打开IDLE交互界面,我们来实时的观察一下requests.get()方法下载一个网页时web服务器返回的“响应信息”:>>>importrequests>>>requests.get('')<Response[200]>>>>r=requests.get('')>>>type(r)<class'requests.models.Response'>>>>通过在requests.get()的返回值“r”上调用python的查看数据类型的函数type(),可以看到返回值“r”是一个Response对象,其中包含了Web服务器对requests的请求做出的响应。2.4.4requests库的响应信息属性说明r.status_codeHTTP请求的返回状态,200表示链接成功,其他状态码表示失败r.textHTTP响应的url对应的字符串形式的页面内容r.encoding从请求的url的头部header中猜测的响应内容编码方式r.apparent_encoding从内容中分析出的响应内容的编码方式r.contentHTTP响应内容的二进制形式,一般用于图形等内容的下载。r.raw原始响应体,也就urllibresponse对象,使用
r.raw.read()读取r.headers以字典对象存储服务器响应头,字典键不区分大小写,若键不存在则返回Noner.url获取请求的url信息r.cookies获取请求后的cookies信息r.historyr.history是一个
Response对象的列表,这个对象列表记录从最开始到最近的请求。方法说明r.json()requests中内置的json解码器,以json数据格式解析r.raise_for_status()请求失败,即状态码非200,抛出requests.HTTPError异常2.4.4requests库的响应信息表2-3Response对象的属性和方法1、r.headers与r.request.headersr.Headers:服务器返回的响应头部信息。r.request.headers:发送到服务器的请求的头部信息。例如:>>>importrequestsasreq>>>r=req.get("")>>>r.headers#百度服务器的响应头部>>>r.request.headers#请求头部2.4.4requests库的响应信息2、r.status_code与r.raise_for_status()方法r.status_code:状态码,状态码200或requests.codes.ok表示链接成功,其他状态码表示失败。在程序中用于判定请求是否成功。>>>r.status_code200>>>r.status_code==requests.codes.ok(或r.status_code==200)True>>>r.raise_for_status()方法:抛出异常的方式判定爬取程序是否正常运行。可以用try和except语句将raise_for_status()代码行包裹起来,处理网页下载中的错误,不让程序崩溃,保障程序的健壮性。2.4.4requests库的响应信息例2-6:网页下载的健壮程序。importrequestsheader={'User-Agent':'Mozilla/5.0',}url='/'try:r=requests.get(url,headers=header)r.raise_for_status()print(r.status_code)except:print('下载出错')2.4.4requests库的响应信息3、Requests库的异常信息Requests库在发出请求后,可能请求会产生错误,抛出异常。Requests库的异常如表2-4所示。2.4.4requests库的响应信息异常名称异常说明requests.ConnectionError网络连接异常错误requests.HTTPErrorHTTP错误异常,r.raise_for_status()如返回的不是200,即返回requests.HTTPErrorrequests.URLRequiredURL缺失异常requests.TooManyRedirects超出最大重定向异常requests.ConnectTimeout链接远程服务器超时异常requests.Timeout请求URL超时异常4、r.encoding和r.apparent_encoding响应信息的编码方式r.encoding:从HTTP的头信息headers中猜测的响应内容编码方式,如果headers中存在charset字段,说明访问的服务器对它的资源的编码方式是有要求的,可以使用r.encoding来获取。r.apparent_encoding:根据网页内容分析出的编码方式。如果headers中不存在charset字段,则认为默认编码为ISO-8859-1,但是这个编码不能解析中文,可以用r.apparent_encoding来解码。r.apparent_encoding是根据网页内容分析出的编码方式,比r.encoding更为准确。2.4.4requests库的响应信息5、r.text与r.content响应信息的内容r.text:是提取响应网页的HTML字符串形式,r.content:是HTTP响应内容的二进制形式,一般图形等响应信息采用该属性提取。r.text方式提取出来的文档有时会出现乱码情况,可以使用下列的方法正确的解码:(1)r.encoding='utf-8'#修改返回的头部编码信息(2)r.encoding=r.r.apparent_encoding#用正文中的编码代替头部的编码信息(3)r_str=r.content.decode('utf-8')#把相应的二进制字节流用'utf-8'解码为str类型爬取网页的通用代码框架一般为例2-6,我们可以将正确解码的html响应信息直接输出也可以写入文件中:改写的例2-6-1:
importrequestsdefget_text(url):try:r=requests.get(url,timeout=10)r.raise_for_status#如果状态不是200,引发HTTPError异常
r.encoding=r.apparent_encodingreturnr.textexcept:returnurl='/'print(get_text(url)[:250])withopen('baiduhtml.txt','w')asf:f.write(get_text(url))2.4.4requests库的响应信息例2-6-2:下载图片写入文件。importrequestsdefget_pic(url):try:r=requests.get(url,tim
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 档案内容审查标准试题及答案
- 2024年省考整体复习试题及答案
- 2024年多媒体考试创新技巧及试题答案
- 2024年珠宝鉴定师职业素养要求试题及答案
- 2024年税务师考试变化趋势试题与答案
- 向高分迈进:2024年珠宝鉴定师考试试题及答案
- 多媒体设计师实战技能备考策略试题及答案
- 深入探讨珠宝鉴定师考试试题和答案
- 权威咖啡师考试资料试题及答案
- 强化2024年公务员省考弱项复习试题及答案
- 《池塘养鱼学》第五章-鱼苗、鱼种的培育-教学课件
- 经典的咨询服务合同协议书2024年
- 模拟电子技术教程课后习题答案大全
- 中班音乐《粉刷匠》
- 2020年全国1卷-语文真题(解析版)
- 控告虚假诉讼书范文
- 省级行业产教融合共同体申报书、申报书、参与建设证明
- 北京市海淀区2023-2024学年八年级下学期期末考试英语试题(解析版)
- 第十三课 中望3D-装配系列2讲解
- 未被列入违法失信名单承诺书
- DL-T5394-2021电力工程地下金属构筑物防腐技术导则
评论
0/150
提交评论