




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Python爬虫大数据采集与挖掘(4)
--普通爬虫体系结构《Python爬虫大数据采集与挖掘》第二版.微课视频版(清华大学出版社,2025)
提纲普通爬虫体系结构Web服务器连接器超链接及域名提取与过滤异常处理爬行策略与实现爬虫多线程技术Web服务器连接器向指定的Web服务器发起连接请求,再建立爬虫和Web服务器之间的网络连接。该连接就作为后续发送URL和接收服务器返回信息的通路,直到爬虫或服务器断开该连接。在该连接上向Web服务器发送URL页面请求命令,并等待Web服务器的响应。对于一个新的网站,在发送URL请求之前,应当检查其根目录下是否有Robots.txt文件。如果有,则应当对该文件进行解析,建立服务器访问要求和URL许可列表。同时需要处理各种可能的网络异常、各种可能Web服务器异常,例如HTTP404错误等。对获取到的HTML文件进行URL提取和过滤,由页面解析器对HTML文本进行分析,提取其中的所包含的URL。进一步,根据Robots.txt的访问许可列表、是否已经爬行过等基本规则对提取出来的URL进行过滤,以排除掉一些不需要获取的页面。根据一定的爬行策略,将每个URL放入到URL任务中的适当位置。当某个URL对应的页面爬行完毕后,Web服务器连接器从URL爬行任务获得新的URL,上述过程不断地重复进行,直到爬行任务为空,或者用户中断为止。提纲普通爬虫体系结构Web服务器连接器超链接及域名提取与过滤异常处理爬行策略与实现爬虫多线程技术整体处理过程Web服务器连接器模块主要功能的实现,可以用如下的流程来描述。输入:URL,形式为:http(https)://域名部分:端口号/目录/文件名.文件后缀,或http(https)://域名部分:端口号/目录/其中,目录可以包含多层子目录。处理过程:(1)从URL中提取域名和端口号,如果端口号为空,则设置为默认的端口号,即80;(2)以域名和端口号为参数,创建Socket连接;(3)连接建立后,检查服务器的根目录是否存在robots.txt文件;(4)如果存在则解析robots.txt文件,生成许可列表和服务器对访问要求的参量;(5)根据许可列表和访问时间限定,如果允许的话,则向服务器发送URL请求;(6)等待服务器响应;(7)进行异常处理,针对各种已知的HTTP标准错误代码,做好预案;(8)接收服务器返回的数据,把数据保存到文件中;(9)断开网络连接。输出:页面的HTML文件DNS缓存DNS缓存是一种被高度封装、但又对爬虫性能有较大影响的处理模块。DNS缓存的实现可以在操作系统或虚拟机、解释器,以及应用层上进行。默认情况由操作系统自行管理缓存。在应用层实现DNS缓存,可以自己用Python的类来编写,也可以基于dnspython工具包来进行缓存管理的实现。importdns.resolvera=dns.resolver.resolver("")#将主机名转换为IP地址ip=a[0].address#获得相应的IP地址‘1'requests/response的使用方法函数名函数功能requests.request()用于构造一个请求requests.get()获取HTML网页的主要方法,对应HTTP的GETrequests.head()获取HTML网页头部的信息方法,对应HTTP的HEADrequests.post()向HTML网页提交POST请求方法,对应HTTP的POSTrequests.put()向HTML网页提交PUT请求的方法,对应HTTP的PUTrequests.patch()向HTML网页提交局部修改请求,对应于HTTP的PATCHrequests.delete()向HTML页面提交删除请求,对应HTTP的DELETErequests.Session()在不同次请求中,Web服务器保持某些参数requests的函数原型get(url,params=None,**kwargs)如,r=requests.get("/")然后通过r.text即可获得指定url的页面的HTML内容。get函数的返回结果,即这个例子中的r,是一个requests.Response对象属性说明status_codeHTTP请求的返回状态textHTTP响应内容的字符串形式,即页面内容encoding从HTTPheader中猜测的响应内容编码方式apparent_encoding从内容中分析出的响应内容编码方式contentHTTP响应内容的二进制形式Response对象属性函数get的参数**kwargs是用于控制请求的一些附属特性,包括headers,cookies,params,proxies等,总共有12个控制参数
。控制参数的使用如用于配置HTTP请求头信息http_headers={'User-Agent':'Mozilla/5.0’,#其他属性和属性值}r=requests.get("/",headers=http_headers)HTTP请求头属性及属性值,通过浏览器的F12查看页面的请求过程获得主要的控制参数及功能介绍如下:(1)headers:是Python中的字典型变量,可以用来模拟任何浏览器标识来发起url访问。(2)cookies:字典或CookieJar,指的是从http中解析cookie(3)timeout:用于设定超时时间,单位为秒,当发起一个get请求时可以设置一个timeout时间,如果在timeout时间内请求内容没有返回,将产生一个timeout的异常。(4)proxies:字典,用来设置访问代理服务器。(5)params:字典或字节序列,作为参数增加到url中,使用这个参数可以把一些键值对以?key1=value1&key2=value2的模式增加到url中例如:kv={‘key1:’values,‘key2’:values}r=requests.request(‘GET’,‘http:www.python123.io/ws’,params=kw)(6)data:字典,字节序或文件对象,重点作为向服务器提供或提交资源是提交,作为request的内容(7)json:json格式的数据,json合适在相关的html,http相关的web开发中非常常见,也是http最经常使用的数据格式,作为内容部分可以向服务器提交。为了正确地从get的返回结果中获得页面内容,一个很重要的步骤是需要检查页面的编码方式,然后设置requests.Response对象的encoding属性。r=requests.get("/",headers={'User-Agent':'Mozilla/5.0'},timeout=10)#同时指定了headers和timeoutr.encoding=’utf-8’#设定为页面的编码,即页面源码中charset的值r.text#此为页面的HTML文本信息提纲普通爬虫体系结构Web服务器连接器超链接及域名提取与过滤异常处理爬行策略与实现爬虫多线程技术Web页面中超链接有以下若干种分类方法。按照链接的形式不同,可以分为绝对链接、相对链接和书签。按照链接的路径指向不同,可以分为三种类型:内部链接,锚点链接和外部链接。按照超链接指向的资源不同,可以分为Web页面超链接、图片超链接、视频超链接、等等。按照链接的存在方式不同,可以分为动态超链接和静态超链接。提取方法与Web页面中正文等其他信息提取不同,超链接具有显著的特征模式,一般有:(1)Tag标签为a,属性为href(2)Tag标签为资源名称,例如img、audio,属性为scr由于具备一定模式,在程序设计中使用正则表达式就会更加容易。正则表达式是用一种用来标识具有一定信息分布规律的字符串,常用来进行字符串匹配。在页面内容中提取超链接的一种正则表达式是:"http://[a-zA-Z0-9/\.-]*",用于re.findall函数中,但这个表达式只能提取http://开始的超链接。对于图像等其他类型的资源超链接,需要根据相应的特征模式进行修改。对于相对链接需要转换成为绝对链接,转换的方法是根据当前页面的URL所对应的虚拟目录名称提取基准目录。此外,有的页面中会指出基准目录,可以直接提取。Robots协议robots.txt是网络爬虫采集某个网站Web内容之前应当读取并解析的文件。网络爬虫与Web服务器建立网络连接之后,应当按照以下流程建立访问许可。(1)检查虚拟根目录下是否存在robots.txt文件(2)如果服务器返回404错误,表明文件不存在,则转步骤(6)(3)如果存在,则将robots.txt文件读回到本地(4)解析robots.txt文件中的每个记录,如果爬虫的User-agent在这些记录中,则读取记录中的Disallow或Allow部分。如果是一个未知的User-agent,则定位到以“User-agent:*”为开始的记录,读取该记录的Disallow或Allow部分。(5)根据提取到的Disallow或Allow部分,构建许可列表。(6)结束可以使用python中的RobotFileParser类对robots.txt文件进行解析,并获得访问许可的判断,以下是对该类的说明。该类的主要方法有:set_url(url),设置指向robots.txt的URL。read(),读取robots.txt。can_fetch(useragent,url),指定useragent及url,判断useragent的爬虫是否可以访问url,返回值为True表示可以访问,False表示不允许访问。crawl_delay(useragent),返回指定useragent的爬虫,其抓取延时的值。如果robots.txt中没有为useragent指定相应的抓取延时,则返回None。request_rate(useragent),返回指定useragent的爬虫,其抓取频率的值。如果robots.txt中没有为useragent指定相应的抓取频率,则返回None。是否可以将自己的爬虫的User-agent设置为知名爬虫呢?从代码的角度看,没有人会限制你使用什么样的User-agent,就是上面的例子。实际上,不断变换User-agent的值也是很多不友好爬虫为了躲避服务器的检测的常用做法。但是这种做法是非常不可取的,它扰乱了Web服务器的正常判断,就可能使得某种知名爬虫被检测出来不遵守Robots协议而产生纠纷。访问网站的合规性使用RobotFileParser类对robots.txt文件进行解析can_fetch(useragent,url)检查指定的useragent是否可以访问urlcrawl_delay(useragent)获得爬虫所需要的抓取延时request_rate(useragent)获得爬虫的抓取频率要求提纲普通爬虫体系结构Web服务器连接器超链接及域名提取与过滤异常处理爬行策略与实现爬虫多线程技术错误和异常的处理在HTTP协议中规定了HTTP请求中的各种状态码,表示服务器处理的结果。正常的情况下服务端给出一个值为200的状态码,而错误和异常的情景很多种,是通过不同的HTTP状态码来标识。一些比较常见的、需要爬虫处理的错误状态码有:(1)404代表“NOTFOUND”,认为网页已经失效,因此,爬虫应当删除它,同时如果爬虫再次发现这条url也不要再抓取;(2)503代表“ServiceUnavailable”,认为网页临时不可访问,通常是网站临时关闭,带宽有限等会产生这种情况。短期内反复访问几次,如果网页已恢复,则正常抓取;如果继续返回503,那么这条url仍会被认为是失效链接,从爬行任务中删除。(3)403代表“Forbidden”,认为网页目前禁止访问,这条url也应当从爬行任务中删除。(4)301代表是“MovedPermanently”,认为网页重定向至新url。当遇到站点迁移、域名更换、站点改版的情况时,使用301返回码。另一种异常是超时,在爬虫获取Web页面时可能由于服务器负荷过大,导致响应延缓,因此,需要适当考虑超时处理,否则就容易使得爬虫一直处于等待状态。这也是爬虫程序需要处理的场景异常之一。try:req=requests.get('/',timeout=1)print(req.status_code)exceptReadTimeout:#超时异常print('Timeout')exceptConnectionError:#连接异常print('Connectionerror')exceptRequestException:#请求异常print('Error')else:ifreq.status_code==200:print('访问正常!')#将爬取的网页保存在本地fb=open("t.html","wb")fb.write(req.content)fb.close()ifreq.status_code==404:print('页面不存在!')ifreq.status_code==403:print('页面禁止访问!')#...提纲普通爬虫体系结构Web服务器连接器超链接及域名提取与过滤异常处理爬行策略与实现爬虫多线程技术爬行策略,是指对爬行过程中从每个页面解析得到的超链接进行安排的方法,即按照什么样的顺序对这些超链接进行爬行。合规性及高效性爬行策略的设计需要考虑以下限制:(1)不要对Web服务器产生太大的压力这些压力主要体现在:a,与Web服务器的连接需要占用其网络带宽b,每一次页面请求,需要从硬盘读取文件c,对于动态页面,还需要脚本的执行。如果启用Session的话,对于大数据量访问需要更多的内存消耗(2)不要占用太多的客户端资源爬虫程序建立与Web服务器的网络连接时,同样也要消耗本地的网络资源和计算资源。如果太多的线程同时运行,特别是一些长时间的连接存在,或者网络连接的超时参数设置不合适,很可能导致客户端有限的网络资源消耗。互联网上的WEB页面可以抽象化为一张有向图。图的遍历就是用来解决节点的访问顺序问题。图的遍历算法有两种,即深度优先算法DFS和宽度优先算法BFS。假如从节点A开始,则按照这两种遍历方法,页面的访问顺序分别是:深度优先:A–B–F–I–C–D–G–H–J–E宽度优先:A–B–C–D–E–F–G–H–I–J按照宽度优先的策略,可以使用队列作为存储结构。按照深度优先的策略,就不能使用队列了,需要采用堆栈。Python实现DFS和BFS具有高度的对称性,因此在Python实现时,并不需要将两种数据结构分开,只需要构建一个数据结构在UrlSequenceUrl中设置的未访问序列self.unvisited可以完成出队列和栈的操作,前者通过pop(0)来实现,后者通过pop()实现。UrlSequenceUrl类存放了所有和URL序列有关的函数,维护了两个序列visited和unvisited,并实现了对URL的元素增加、删除、计数等操作,可以为爬虫的其他模块提供完整的封装,具体实现时选择一种遍历方式即可。PageRank重要性排序每个网站都有一个首页,从链接的角度来看,首页的最主要特征就是链接数量大。在大规模分布式的情况下。分布式系统中每个机器的性能好坏不一,设计者总是希望把重要页面的爬行分配给性能好的机器,以提高爬虫的整体性能,因此,就需要有一种方法来量化页面的重要性。PageRank算法是一个经典算法,出身于google搜索引擎,是一种根据网页之间相互的超链接计算页面级别的方法。它由LarryPage和SergeyBrin在20世纪90年代后期发明。由于它解决了网络图中每个节点重要性的量化计算方法,因此在许多可以抽象为网络连接图的应用中得到广泛采用。计算Web页面的重要性社交网络中的重要人物识别文本中的关键词提取假如有四位小朋友分糖果,并假设糖果可以任意分,分糖果的规则如下:(1)A把自己的糖果平均分给B、C(2)B把自己的糖果全部给D(3)C把自己的糖果的一半分给D,另一半自己留着(4)D把自己的糖果平均分给A、B、C要求计算每轮结束后每个小朋友的糖果数量,并判断按照这样的规则不断分下去的话,最终每个小朋友的糖果数量是否会不再变化。构图在每轮分配结束之后,每个人拥有的苹果数量分别是:
p(A)=1/3*p(D)(4-2)p(B)=1/2*p(A)+1/3*p(D)(4-3)p(C)=1/2*p(A)+1/2*p(C)+1/3*p(D)(4-4)p(D)=p(B)+1/2*p(C)(4-5)写成矩阵形式这是一个典型的Markov链模型。根据Markov链的性质,在总数40变的情况下,每个人初始的糖果数即使不同,最终经过若干轮重新分配后,每个人的糖果数都会收敛到上述值。这就是这个Markov链的第二个特征,即收敛值与初始值无关。将这个实例的思想引入到Web页面中,并假设某个页面的重要性平均分配给它所指向的每个页面。引入到Web页面的链接图分析中,需要考虑到一些具体情况:(1)用户可能在浏览B页面时,可以直接输入C的网址,虽然B没有指向C的超链接。(2)某个页面除了可以通过指向它的超链接进入该页面外,还有其他途径可以直接访问该页面,例如通过浏览器提供的收藏夹。一个页面被访问的随机性应当来自其他所有页面理论上,PR算法的收敛性证明是基于Markov链,要求它的状态转移矩阵A需要满足三个条件:(1)A为随机矩阵:A矩阵所有元素都大于等于0,并且
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖北省松滋市2026届中考语文最后冲刺模拟试卷含解析
- 无菌操作室设备管理制度
- 师德培训课件图片
- 2025年全国禁毒知识竞赛培训试题库及答案
- 手术室内消毒及无菌护理的落实
- 注射实施中的无菌操作安全护理
- 短视频公司合规管理制度
- 历年司法考试试题及答案
- 新疆伊犁州重点达标名校2026届中考五模语文试题含解析
- 二零二五年度会展租赁服务与品牌推广合同
- 恩施州咸丰县社区专职工作者招聘考试真题2024
- 浙江省民工工资管理办法
- 《PLC应用技术(S7-1200)微课版》全套教学课件
- DBJ50-T-157-2022房屋建筑和市政基础设施工程施工现场从业人员配备标准
- 人教版高一下学期期末考试数学试卷与答案解析(共五套)
- 《干部履历表》(电子版)
- 公制螺纹量规尺寸标准对照表
- 仪表安装工程监理实施细则
- 机械制图识读零件图(课堂PPT)
- 领导力课程教材培训师手册
- R410A物性表(最新整理)
评论
0/150
提交评论