Python网络爬虫快速入门PPT完整全套教学课件_第1页
Python网络爬虫快速入门PPT完整全套教学课件_第2页
Python网络爬虫快速入门PPT完整全套教学课件_第3页
Python网络爬虫快速入门PPT完整全套教学课件_第4页
Python网络爬虫快速入门PPT完整全套教学课件_第5页
已阅读5页,还剩263页未读 继续免费阅读

下载本文档

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

文档简介

Python网络爬虫快速入门第1章爬虫基础和开发环境的配置第2章网页前端基础第3章网络库urllib第4章网络库requests第5章正则表达式第6章XPath和lxml解析库第7章解析库BeautifulSoup4第8章多线程爬虫第9章文件存储第10章数据库存储第1章

爬虫基础和开发环境配置目录页01爬虫产生的背景和概念02爬虫的用途和分类03爬虫实现原理04爬虫爬取网页信息的主要流程05防爬虫应对策略06爬虫数据采集与挖掘的合规性07开发环境的配置思考?搜索引擎是如何查找网站的?

搜索引擎使用了网络爬虫不停地从互联网抓取网站数据,并将网站镜像保存在本地,这才能为大众提供信息检索的功能。结论爬虫产生背景目前的互联网已经迈入大数据时代,通过对海量的数据进行分析,能够产生极大的商业价值。爬虫产生背景数据采集数据分析应用反馈爬虫产生背景思考如果我们需要大量数据,有哪些获取数据的方式呢?爬虫产生背景政府/机构公开的数据纳斯达克爬虫产生背景企业产生的数据爬虫产生背景数据平台购买的数据数据堂贵阳大数据交易所爬虫产生背景爬取的网络数据爬虫产生背景无论是搜索引擎,还是个人或单位获取目标数据,都需要从公开网站上爬取大量数据,在此需求下,爬虫技术应运而生,并迅速发展成为一门成熟的技术。结论思考:什么是网络爬虫?

什么是爬虫如果说网络像一张网,那么爬虫就是网上的一只小虫子,在网上爬行的过程中遇到了数据,就把它抓取下来。什么是爬虫网络爬虫,又称为网页蜘蛛、网络机器人,是一种按照一定的规则,自动请求万维网网站并提取网络数据的程序或脚本。结论什么是爬虫这里的数据是指互联网上公开的并且可以访问到的网页信息,而不是网站的后台信息(没有权限访问),更不是用户注册的信息(非公开的)。爬虫的用途思考爬虫具体能做些什么呢?爬虫的用途用途通用爬虫和聚焦爬虫按照使用场景进行分类:通用爬虫聚焦爬虫又称主题网络爬虫,是指选择性地爬行那些与预先定义好的主题相关的页面的网络爬虫。又称全网爬虫,将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。累积式和增量式爬虫按照爬取形式进行分类:累积式爬虫增量式爬虫在具有一定量规模的网络页面集合的基础上,采用更新数据的方式选取已有集合中的过时网页进行抓取,以保证所抓取到的数据与真实网络数据足够接近。累积式爬虫是指从某一个时间点开始,通过遍历的方式抓取系统所能允许存储和处理的所有网页。表层爬虫和深层爬虫按照爬取数据的存在方式进行分类:表层爬虫深层爬虫爬取深层网页的爬虫就叫做深层爬虫。深层网页是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的Web页面。爬取表层网页的爬虫叫做表层爬虫。表层网页是指传统搜索引擎可以索引的页面,以超链接可以到达的静态网页为主构成的Web页面。通用爬虫工作原理通用爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫工作原理聚焦爬虫需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接,并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。爬虫抓取网页的详细流程爬虫抓取网页详细流程反爬虫技术很多网络爬虫对网页的爬取能力很差,现在的网站会采取一些反爬虫措施来阻止爬虫的不当爬取行为。防爬虫的应对策略对于采取了防爬虫措施的网站,爬虫程序需要采取相应的应对策略,才能成功地爬取到网站上的数据。防爬虫的应对策略伪装User-agentUser-agent表示用户代理,是HTTP协议中的一个字段,其作用是描述发出HTTP请求的终端信息。每个正规的爬虫都有固定的User-agent,只要将这个字段设为知名的用户代理,就能够成功伪装。防爬虫的应对策略使用代理IP代理IP就是介于用户和网站之间的第三者,即用户先将请求发送给代理IP,之后代理IP再发送到服务器。服务器会将代理IP视为爬虫的IP,同时用多个代理IP,可以降低单个IP地址的访问量,极有可能逃过一劫。防爬虫的应对策略降低访问频率如果没有找到既免费又稳定的代理IP,则可以降低访问网站的频率,防止对方从访问量上认出爬虫的身份,不过爬取效率会差很多。为了弥补这个缺点,我们可以基于这个思想适时调整具体的操作。例如,每抓取一个页面就休息若干秒,或者限制每天抓取的页面数量。爬虫数据采集与挖掘的合规性大数据技术与应用的合规性网络爬虫能够以什么方式爬取什么样的数据什么样的数据能够本地存储什么样的数据能够共享或出售给他人开发爬虫前建议阅读相关规范和法律条款,设计爬虫方案时要对合规性及采集性能进行适当的平衡。第2章

网页前端基础目录页01URL(统一资源定位符)02超文本03HTTP与HTTPS04HTTP网络请求原理05Robots协议06网页基础07Cookie与Session浏览网页过程思考?在浏览器的地址栏输入网址“”,按下回车后浏览器中显示了百度的首页。那么,这段网络访问过程中到底发生了什么?浏览网页过程浏览网页过程的示意图如下所示。Html

+

js

+

css

+

jpg浏览器渲染出来的页面和爬虫请求的页面并不一样当所有的文件都下载成功后,浏览器会根据HTML语法结构,将网页完整的显示出来。分析浏览器显示完整网页的过程统一资源定位符URLURL是互联网上标准资源的地址,它包含了文件的位置以及浏览器处理方式等信息。统一资源定位符URLURL地址由协议头、服务器地址、文件路径三部分组成。计算机域名系统DNSDNS

是计算机域名系统(DomainNameSystem或DomainNameService)的缩写,由解析器和域名服务器组成。HTTP网络请求原理HTTP是一套计算机通过网络进行通信的规则,它由两部分组成:客户端请求消息和服务器端响应消息。客户端HTTP请求格式客户端发送一个HTTP请求到服务器的请求消息,由请求行、请求头部、空行、以及请求数据这四个部分组成。GET/HTTP/1.1Host:Connection:keep-aliveUpgrade-Insecure-Requests:1User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/54.0.2840.99Safari/537.36Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Referer:/Accept-Encoding:gzip,deflate,sdch,brAccept-Language:zh-CN,zh;q=0.8,en;q=0.6Cookie:BAIDUID=04E4001F34EA74AD4601512DD3C41A7B:FG=1;BIDUPSID=04E4001F34EA74AD4601512DD3C41A7B;PSTM=1470329258;MCITY=-343%3A340%3A;H_PS_PSSID=1447_18240_21105_21386_21454_21409_21554;BD_UPN=12314753;sug=3;sugstore=0;ORIGIN=0;bdime=0;H_PS_645EC=7e2ad3QHl181NSPbFbd7PRUCE1LlufzxrcFmwYin0E6b%2BW8bbTMKHZbDP0g;BDSVRTM=0客户端请求消息示例客户端HTTP请求格式不同的HTTP版本下使用的请求方法也不同。HTTP版本描述HTTP0.9只有基本的文本GET功能HTTP1.0定义了三种请求方法:GET,POST和HEAD方法HTTP1.1在1.0基础上进行更新,新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。HTTP2.0所有首部键必须全部小写,而且请求行要独立为:method、:scheme、:host、:path这些键值对。客户端HTTP请求格式最常用的请求方法是GET和POST,两者的区别在于:GET请求--参数都显示在URL上,服务器根据该请求所包含URL中的参数来产生响应内容。

由于请求参数都暴露在外,所以安全性不高。POST请求--参数在请求体当中,消息长度没有限制而且采取隐式发送,通常用来向HTTP服务器提交量比较大的数据。

POST请求的参数不在URL中,而在请求体中,所以安全性也高,使用场合也比GET多。客户端HTTP请求格式Host(主机和端口号)指定被请求资源的Internet主机和端口号,对应网址URL中的Web名称和端口号,通常属于URL的Host部分。Connection(连接类型)表示客户端与服务器的连接类型。客户端HTTP请求格式Upgrade-Insecure-Requests(升级为HTTPS请求)表示升级不安全的请求,意思是会在加载HTTP资源时自动替换成HTTPS请求,让浏览器不再显示HTTPS页面中的HTTP请求警报。User-Agent(浏览器名称)标识客户端身份的名称,通常页面会根据不同的User-Agent信息自动做出适配,甚至返回不同的响应内容。客户端HTTP请求格式Accept(传输文件类型)指浏览器或其他客户端可以接受的MIME(MultipurposeInternetMailExtensions,多用途互联网邮件扩展)文件类型,服务器可以根据它判断并返回适当的文件格式。Referer(页面跳转来源)表明产生请求的网页来自于哪个URL,用户是从该Referer页面访问到当前请求的页面。客户端HTTP请求格式Accept-Encoding(文件编解码格式)指出浏览器可以接受的编码方式。编码方式不同于文件格式,它的作用是压缩文件并加速文件传递速度。Accept-Language(语言种类)指出浏览器可以接受的语言种类,如en或en-us指英语,zh或者zh-cn指中文,当服务器能够提供一种以上的语言版本时要用到。客户端HTTP请求格式Accept-Charset(字符编码)指出浏览器可以接受的字符编码。Cookie(Cookie)浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现模拟登陆。客户端HTTP请求格式Content-Type(POST数据类型)指定POST请求里用来表示的内容类型。客户端HTTP请求格式服务端HTTP响应格式HTTP响应由四个部分组成,分别是:状态行、响应报头、空行、以及响应正文。HTTP/1.1200OKServer:TengineConnection:keep-aliveDate:Wed,30Nov201607:58:21GMTCache-Control:no-cacheContent-Type:text/html;charset=UTF-8Keep-Alive:timeout=20Vary:Accept-EncodingPragma:no-cacheX-NWS-LOG-UUID:bd27210a-24e5-4740-8f6c-25dbafa9c395Content-Length:180945<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"....服务端响应消息示例服务端HTTP响应格式响应状态代码由三位数字组成,其中第1位数字定义了响应的类别,有五种可能取值。服务端HTTP响应格式响应码描述100~199表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程200~299表示服务器成功接收请求并已完成整个处理过程。常用状态码为200300~399为完成请求,客户需进一步细化请求400~499客户端的请求有错误,常用状态码包括404和403500~599服务器端出现错误,常用状态码为500常用的响应报头和取值这个报头值告诉客户端,服务端不希望客户端缓存资源,在下次请求资源时,必须要重新请求服务器,不能从缓存副本中获取资源。Cache-Control:must-revalidate,no-cache,private服务端HTTP响应格式常用的响应报头和取值该报头回应客户端的Connection:keep-alive,告诉客户端服务器的TCP连接也是一个长连接,客户端可以继续使用这个TCP连接发送HTTP请求。Connection:keep-alive服务端HTTP响应格式常用的响应报头和取值该报头的取值告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。Content-Encoding:gzip服务端HTTP响应格式常用的响应报头和取值这个报头值告诉客户端,资源文件的类型,还有字符编码。客户端需要使用UTF-8格式对资源进行解码,然后对资源进行HTML解析。通常我们会看到有些网站出现乱码,往往就是服务器端没有返回正确的编码。Content-Type:text/html;charset=UTF-8服务端HTTP响应格式常用的响应报头和取值该报头表示服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。HTTP协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源时的时间混乱问题。Date:Sun,21Sep201606:18:21GMT服务端HTTP响应格式常用的响应报头和取值这个响应报头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本。Expires:Sun,1Jan200001:00:00GMT服务端HTTP响应格式常用的响应报头和取值这个报头的含义与Cache-Control等同。Pragma:no-cache这个报头表示服务器对应的版本,仅用于告诉客户端服务器的信息。Server:Tengine/1.4.6服务端HTTP响应格式常用的响应报头和取值该响应报头告诉客户端,服务器发送资源的方式是分块发送的。Transfer-Encoding:chunked服务端HTTP响应格式常用的响应报头和取值该报头告诉缓存服务器,缓存压缩文件和非压缩文件两个版本。如今这个报头的用处并不大,因为现在的浏览器都是支持压缩的。Vary:Accept-Encoding服务端HTTP响应格式HTML标签Html标签很多,从闭合的角度可以分为闭合标签与空标签。Html标签还可以按照在文档中的位置特性进行分类,主要分为块级标签、行内(内嵌)标签和行内-块级(内嵌-块级)标签块级标签是独占一行的标签,并且标签间元素能随时设置宽度、高度、顶部和底部边距等。行内标签的元素和其他元素在同一行上,而元素的宽度、高度、顶部和底部边距不可设置。多个行内-块级标签的元素可以显示在同一行,并且可以设置元素的宽度、高度、顶部和底部边距可以随时设置。HTML整体结构HTML文档都具有一个基本的整体结构,包括头部(Head)和主体(Body)两大部分,其中头部描述浏览器所需的信息,主体包含网页所要展示的具体内容。

CSS层叠样式表单,CascadingStyleSheet定义如何显示html元素。即使是相同的html文档,应用的CSS不同,从浏览器看到的页面外观也会不同。内联样式内部样式表

在头部通过

标签定义内部样式表外部引用

当样式需要被很多页面引用时,可以使用独立的外部CSS文件,这样可以简单页面模式的设计。与爬虫程序设计相关常用标签(1)<meta>最重要的是字符编码,它使用<meta>的charset属性声明Web文档的字符编码。(2)<p><p>标签定义段落。可以将要显示的文章内容放在<p>与</p>标签之间。该标签会自动在段落前后添加一些空白,可以使用CSS来进行调整。通常在Web页面中正文部分的各个段落都是通过该标签来表示。(3)<div><div>用来定义文档中的分区或节,把文档分割成为独立的部分,经常用于网页布局。该标签通常会使用id或class属性设计额外的样式,其中,class用于元素组,而id用于标识单独的唯一的元素。(4)<table><table>定义页面的表格,在很多页面中数据以表格形式展现,因此也是爬虫程序需要处理的重要标签之一。html页面中的简单表格由table元素以及一个或多个tr、th、td元素组成。其中,tr元素定义表格行,td元素定义表格单元,th元素定义表格标题列;同时,th默认加粗并居中显示。<table>的常用属性为表格边框属性border,当使用border="1"设置边框时,会在所有表格单元以及表格上嵌套边框。(5)<a><a>标签定义超链接,用于从一张页面链接到另一张页面,其最重要的属性是href,它指示链接的目标。爬虫在采集到一个Web页面之后,就需要在页面中寻找该标签,并提取出超链接作为新的爬行任务。(6)<form><form>可以把用户输入的数据传送到服务器端,这样服务器端程序就可以处理表单传过来的数据。(7)<base>为了简化包含相对路径的超链接的转换过程,HTML语言提供了<base>标签,用来指定页面中所有超链接的基准路径。例如,如果在p.html中有如下的<base>标签,<basehref="http://www.a.b.c/aaa/"/>那么,<imgsrc="images/p2.gif">表示从http://www.a.b.c/aaa/images/p2.gif获得图片文件。(8)<script><script>用于在html页面内插入脚本。其type属性为必选的属性,用来指示脚本的MIME类型。第3章

网络库urllib目录页01发送请求与获得响应02异常处理03解析链接04解析robots.txt文件什么是urllib库urllib库是Python内置的HTTP请求库,它可以看做是处理URL的组件集合。模块名称描述urllib.request请求模块urllib.error异常处理模块urllib.parseurl解析模块urllib.robotparserrobots.txt解析模块urlopen方法urlopen方法可以接收多个参数,定义格式如下:urllib.request.urlopen(url,

data=None,

[timeout,

]*,

cafile=None,

capath=None,

cadefault=False,

context=None)参数如下:url--表示目标资源在网站中的位置。data--用来指明向服务器发送请求的额外信息。timeout--该参数用于设置超时时间,单位是秒。

context--实现SSL加密传输,该参数很少使用。使用HTTPResponse对象使用urlopen方法发送HTTP请求后,服务器返回的响应内容封装在一个HTTPResponse类型的对象中。importurllib.requestresponse=urllib.request.urlopen('')print(type(response))例如:<class'http.client.HTTPResponse'>HTTPResponse类属于http.client模块,该类提供了获取URL、状态码、响应内容等一系列方法。geturl()--用于获取响应内容的URL,该方法可以验证发送的HTTP请求是否被重新调配。info()--返回页面的元信息。getcode()--返回HTTP请求的响应状态码。使用HTTPResponse对象示例importurllib.requestresponse=urllib.request.urlopen('')#获取响应信息对应的URLprint(response.geturl())#获取响应码print(response.getcode())#获取页面的元信息print(())/200Server:nginxContent-Type:text/html;charset=utf-8X-Frame-Options:SAMEORIGINX-Clacks-Overhead:GNUTerryPratchettContent-Length:48729Accept-Ranges:bytesDate:Wed,23Aug201703:29:51GMTVia:1.1varnishAge:2915Connection:closeX-Served-By:cache-nrt6129-NRTX-Cache:HITX-Cache-Hits:29X-Timer:S1503458991.290683,VS0,VE0Vary:CookieStrict-Transport-Security:max-age=63072000;includeSubDomains示例结果使用HTTPResponse对象分析urlopen方法urlopen方法可以接收多个参数,定义格式如下:urllib.request.urlopen(url,

data=None,

[timeout,

]*,

cafile=None,

capath=None,

cadefault=False,

context=None)参数如下:url--表示目标资源在网站中的位置。data--用来指明向服务器发送请求的额外信息。

timeout--该参数用于设置超时时间,单位是秒。

context--实现SSL加密传输,该参数很少使用。超时设置假设我们要爬取1000个网站,如果其中有100个网站需要等待30s才能返回数据,则要返回所有的数据,至少需要等待3000秒。网页网页网页网页...30s...下个网页当向服务器发送HTTP请求时,通常很快会得到响应,但由于某些原因,服务器端可能迟迟没有响应,这些HTTP链接就会一直等待,直到超过预设的等待时间,这个等待时间就是请求超时。请求超时超时设置我们可以为HTTP请求设置超时时间,一旦超过这个时间,服务器还没有返回响应内容,那么就会抛出一个超时异常,这个异常需要使用try语句来捕获。try:url='57:8080'#timeout设置超时的时间

file=urllib.request.urlopen(url,timeout=1)

result=file.read() print(result)exceptExceptionaserror: print(error)<urlopenerrortimedout>分析urlopen方法urlopen方法可以接收多个参数,定义格式如下:urllib.request.urlopen(url,

data=None,

[timeout,

]*,

cafile=None,

capath=None,

cadefault=False,

context=None)参数如下:url--表示目标资源在网站中的位置。

data--用来指明向服务器发送请求的额外信息。timeout--该参数用于设置超时时间,单位是秒。

context--实现SSL加密传输,该参数很少使用。URL编码转换当传递的URL中包含中文或者其它特殊字符(如空格等)时,需要使用urllib.parse库中的urlencode方法将URL进行编码data={

‘a’:‘计算机’,

‘b’:‘程序员’}a=%E8%AE%A1%E7%AE%97%E6%9C%BA&b=%E7%A8%8B%E5%BA%8F%E5%91%98转码它可以将“key:value”这样的键值对转换成“key=value”这样的字符串。URL编码转换解码使用的是url.parse库的unquote方法。urljoin用法完成链接的合并,第二个参数如果不是完整的url,那么会自动加在第一个参数后,并自动添加“/”;如果第二个参数是完整URL,那么返回第二个URL构造Request对象如果希望对请求执行复杂操作,则需要创建一个Request对象来作为urlopen方法的参数。#将url作为Request方法的参数,构造并返回一个Request对象request=urllib.request.Request('')#将Request对象作为urlopen方法的参数,发送给服务器并接收响应response=urllib.request.urlopen(request)在使用urllib库发送URL的时候,我们推荐大家使用构造Request对象的方式。构造Request对象在构建请求时,除了必须设置的url参数外,还可以加入很多内容,例如下面的参数:参数如下:data

--默认为空,该参数表示提交表单数据,同时HTTP请求方法将从默认的GET方式改为POST方式。

headers--默认为空,该参数是一个字典类型,包含了需要发送的HTTP报头的键值对。添加特定Headers—请求伪装如果不是从浏览器发出的请求,我们是不能获得响应内容的。针对这种情况,我们需要将爬虫程序发出的请求伪装成一个从浏览器发出的请求。伪装或......添加特定Headers—请求伪装伪装浏览器需要自定义请求报头,也就是在发送Request请求时,加入特定的Headers。user_agent={"User-Agent":"Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0)"}request=urllib.request.Request(url,headers=user_agent)request.add_header("Connection","keep-alive")处理GET请求GET请求一般用于向服务器获取数据,比如说,我们用百度搜索北京大学。处理GET请求此时,如果查看HTTP请求,发现有个GET请求的格式如下:/s?wd=%E5%8C%97%E4%BA%AC%E5%A4%A7%E5%AD%A6在这个请求中,“?”后面的字符串就包含了我们要查询的关键字“北京大学”。urlparse()urlunparse()urlsplit()urlunsplit()parse_qs()parse_qsl()quote()unquote()urllib.parse模块(处理url的标准接口)urllib.request模块-高级应用BaseHandler类,所有Handler的父类:HTTPDefaultErrorHandlerHTTPRedirectHandlerProxyHandlerHTTPPasswordMgrHTTPCookieProcessorOpenerDirector类利用Handler来构建Opener处理COOKIES声明一个CookieJar对象,利用HTTPCookieProcessor来构建一个Handler,利用build_opener()方法构建出Opener,执行open()函数即可处理COOKIESCOOKIES以文本形式保存,需要把CookieJar换成MozillaCookieJar,MozillaCookieJar是CookieJar子类,可以用来处理Cookies和文件相关事件。另外,LWPCookieJar同样可以读取和保存,但格式不同,会保存成(LWP)格式的Cookies文件。处理COOKIES调用load()方法读取本地的Cookies文件,获取到了Cookies的内容。然后读取Cookies之后使用了同样的方法构建Handler和Opener即可。RobotFileParser类在构造方法中传入robots.txt链接set_url()用来设置robots.txt文件链接read()读取文件并进行分析parse()解析robots.txt文件can_fetch()传入2个参数,返回是否可抓取这个URLURLError异常和捕获URLError产生的原因主要有:没有连接网络服务器连接失败找不到指定服务器URLError异常和捕获HTTPError是URLError的子类,它的对象拥有一个整型的code属性,表示服务器返回的错误代码。request=urllib.request.Request('http://www.baidu.com/net')try:urllib.request.urlopen(request)excepturllib.error.HTTPErrorase:print(e.code)404上述输出了404的错误码,其含义是没有找到这个页面。第4章

抓取网页数据requests目录页01基本用法02高级应用什么是requests库requests是基于Python开发的HTTP库,与urllib标准库相比,它不仅使用方便,而且能节约大量的工作。模块名称描述requests.Request表示请求对象,用于准备一个请求发送到服务器。requests.Response表示响应对象,其中包含服务器对HTTP请求的响应。requests.Session表示请求会话,提供Cookie持久性、连接池和配置。什么是requests库其中,Request类的对象表示一个请求,它的生命周期针对一个客户端请求,一旦请求发送完毕,该请求包含的内容就会被释放掉。而Session类的对象可以跨越多个页面,它的生命周期同样针对的是一个客户端。requests库初体验无须再转换为URL路径编码格式,拼接完整的URL路径。无须再频繁地为中文转换编码格式。从发送请求的函数名称,可以很直观地判断发送到服务器的方式。接下来,我们再从细节上体会一下requests库的便捷之处,具体如下:发送请求requests库中提供了很多发送HTTP请求的函数。函数功能说明requests.request()构造一个请求,支撑以下各方法的基础方法requests.get()获取HTML网页的主要方法,对应于HTTP的GET请求方式requests.head()获取HTML网页头信息的方法,对应于HTTP的HEAD请求方式requests.post()向HTML网页提交POST请求的方法,对应于HTTP的POST请求方式requests.put()向HTML网页提交PUT请求的方法,对应于HTTP的PUT请求方式requests.patch()向HTML网页提交局部修改请求,对应于HTTP的PATCH请求方式requests.delete()向HTML网页提交删除请求,对应于HTTP的DELETE请求方式发送请求这些函数都会做两件事情,一件是构建一个Request类的对象,该对象将被发送到某个服务器上请求或者查询一些资源;另一件是一旦得到服务器返回的响应,就会产生一个Response对象,该对象包含了服务器返回的所有信息,也包括原来创建的Request对象。返回响应Response类用于动态地响应客户端的请求,控制发送给用户的信息,并且将动态地生成响应,包括状态码、网页的内容等。属性说明status_codeHTTP请求的返回状态,200表示连接成功,404表示失败textHTTP响应内容的字符串形式,即URL对应的页面内容encoding从HTTP请求头中猜测的响应内容编码方式apparent_encoding从内容中分析出的响应编码的方式(备选编码方式)contentHTTP响应内容的二进制形式高级应用处理COOKIE使用同一个会话(session)第5章

正则表达式目录页01了解正则表达式02re库概述03使用正则表达式抓取数据正则表达式正则表达式就是规定了一组文本模式匹配规则的符号语言,一条正则表达式也称为一个模式,使用这些模式可以匹配指定文本中与表达式模式相同的字符串。元字符元字符指在正则表达式中具有特殊含义的专用字符,可以用来规定其前导字符在目标对象中出现的模式。元字符点字符“.”可匹配包括字母、数字、下划线、空白符(除换行符\n)等任意的单个字符。点字符“.”元字符脱字符“^”和美元符“$”分别用于匹配行头和行尾。脱字符“^”和美元符“$”元字符“|”可将多个不同的子表达式进行逻辑连接,可简单地将“|”理解为逻辑运算符中的“或”运算符,匹配结果为与任意一个子表达式模式相同的字符串。连接符“|”元字符正则表达式中使用一对中括号“[]”标记字符组,字符组的功能是匹配其中的任意一个字符。字符组“[]”元字符连字符“-”一般在字符组中使用,表示一个范围。连字符“-”元字符元字符“?”表示匹配其前导元素0次或1次。匹配符“?”元字符正则表达式中使用“*”、“+”和“{}”符号来限定其前导元素的重复模式。重复模式元字符正则表达式中使用“()”可以对一组字符串中的某些字符进行分组。子组预定义字符集正则表达式中预定义了一些字符集,使用字符集能以简洁的方式表示一些由元字符和普通字符表示的匹配规则。贪婪匹配正则表达式中有两种匹配方式:贪婪匹配和非贪婪匹配。贪婪匹配在条件满足的情况下,尽量多地进行匹配。非贪婪匹配在条件满足的情况下,尽量少地进行匹配。贪婪匹配贪婪匹配方式也称为匹配优先,即在可匹配可不匹配时,优先尝试匹配;非贪婪匹配方式也称忽略优先,即在可匹配可不匹配时,优先尝试忽略。重复匹配中使用的元字符(“?”、“*”、“+”、“{}”)默认为匹配优先,但当其与“?”搭配,即以“??”、“*?”、“+?”、“{}?”这些形式出现时,则为忽略优先。re模块Python中的re模块是正则表达式模块,该模块提供了文本匹配查找、文本替换、文本分割等功能。re模块正则对象的方法大多在re模块中也有对应的函数实现,因此用户可通过“正则对象.方法”的方式或“re.函数”的方式使用。预编译如果需要重复使用一个正则表达式,那么可以使用compile()函数对其进行预编译,以避免每次编译正则表达式的开销。compile(pattern,flags=0)pattern

--表示一个正则表达式。flags--用于指定正则匹配的模式。预编译参数flags的常用取值如下表所示。使用match()函数进行匹配match()函数检测目标文本的开始位置是否符合指定模式,若匹配成功返回一个匹配对象,否则返回None。match(pattern,string,flags=0)pattern

--表示要传入的正则表达式。string--表示待匹配的目标文本。flags--表示使用的匹配模式。使用match()函数进行匹配使用match()函数对指定的字符串进行匹配搜索,示例如下:importredate_two="28March2019"print(re.match(r"\d",date_two))match()函数匹配成功会返回一个Match对象,该对象包括匹配信息span和match,其中span表示匹配对象在目标文本中出现的位置,match表示匹配对象本身的内容。<_sre.SRE_Matchobject;span=(0,1),match='2'>使用search()函数进行匹配大部分情况下,我们需要匹配的是出现在文本任意位置的字符串,这项功能由re模块中的search()函数实现。若调用search()函数匹配成功会返回一个匹配对象,否则返回None。search(pattern,string,flags=0)匹配对象使用match()函数和search()函数进行正则匹配时,返回的是如下形式的字符串:以上字符串表明返回结果是一个Match对象,其中包含两项内容span和match,span表示本次获取的匹配对象在原目标文本中所处的位置,目标文本的下标从0开始;match表示匹配对象的内容。<_sre.SRE_Matchobject;span=(2,4),match='ow' 匹配对象span属性是一个元组,元组中有两个元素,第一个元素表示匹配对象在目标文本中的开始位置,第二个元素表示匹配对象在目标文本中的结束位置。<_sre.SRE_Matchobject;span=(2,4),match='ow' 开始位置结束位置匹配对象re模块中提供了一些与Match对象相关的方法,用于获取匹配结果中的各项数据。匹配对象当正则表达式中包含子组时,Python解释器会将每个子组的匹配结果临时存储到缓冲区中。若用户想获取子组的匹配结果,可使用Match对象的group()方法。words=re.search("(h)(e)",'helloheooo')print(words.group(1))h匹配对象Match对象还有一个groups()方法,使用该方法可以获取一个包含所有子组匹配结果的元组。words=re.search("(h)(e)",'helloheooo')print(words.groups())('h','e')匹配对象若正则表达式中不包含子组,则groups()方法返回一个空元组。findall()函数findall()函数可以获取目标文本中所有与正则表达式匹配的内容,并将所有匹配的内容以列表的形式返回。findall(pattern,string,flags=0)finditer()函数finditer()函数同样可以获取目标文本中所有与正则表达式匹配的内容,但该函数会将匹配到的子串以迭代器的形式返回。finditer(pattern,string,flags=0)检索替换re模块中提供的sub()、subn()函数用于替换目标文本中的匹配项。sub(pattern,repl,string,count=0,flags=0)subn(pattern,repl,string,count=0,flags=0)count--表示替换的次数,默认值0表示替换所有的匹配项。flags--表示使用的匹配模式。检索替换sub()与sunb()函数的参数及功能相同,不同的是调用成功后,sub()函数会返回替换后的字符串,subn()函数会返回包含替换结果和次数的元组。words='DistantPlacesandPoems'result_one=re.sub(r'\s','-',words)print(result_one)result_two=re.subn(r'\s','-',words)print(result_two)Distant-places-and-Poems('Distant-places-and-Poems',3)文本分割re模块中提供的split()函数可使用与正则表达式模式相同的字符串分割指定文本。split(pattern,string,maxsplit=0,flags=0)maxsplit--用于指定分隔的次数,默认值为0,表示匹配指定模式并全部进行分割。flags--表示使用的匹配模式。第6章Xpath和lxml解析库目录页01lxml基础02Xpath语法03lxml库的基本使用数据解析技术Python支持一些解析网页的技术,分别为正则表达式、XPath、BeautifulSoup。针对文本的解析,有正则表达式;针对HTML/XML的解析,有XPath、BeautifulSoup、正则表达式;数据解析技术正则表达式是基于文本的特征来匹配或查找指定的数据,它可以处理任何格式的字符串文档。数据解析技术XPath和BeautifulSoup基于HTML/XML文档的层次结构来确定到达指定节点的路径,所以它们更适合处理层级比较明显的数据。<!--Copyright--><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don'tforgetthemeeting!</body></note>什么是XPath我们借用网上一个很形象的比喻,用于区分正则表达式和XPath。把提取数据比作找建筑。如果使用正则表达式进行查找,则它会告诉你这个建筑本身有哪些特征,以及它的左边是什么,右边是什么。这样的描述限定查找的范围较大,不易于找到。而XPath会直接告诉你这个建筑位于“中国-陕西-西安-莲湖区-建设西路-隆隆隆办公楼一层”,相比较而言,这种描述更加具体,易于找到。什么是XPathXPath即为XML路径语言,用于确定XML树结构中某一部分的位置。XPath技术基于XML的树结构,能够在树结构中遍历节点(元素、属性等)。关于XML技术,可参照/xml/进行完整学习什么是XPathXPath使用路径表达式选取XML文档中的节点或者节点集,这些路径表达式代表着从一个节点到另一个或者一组节点的顺序,并以“/”字符进行分隔。什么是XPathXPath不仅能够查询XML文档,而且能够查询HTML文档。不过,它需要先借用lxml库技术将HTML文档转换为XML文档树对象,之后可以使用XPath语法查找此结构中的节点或元素。什么是lxml库lxml是以Python语言编写的库,主要用于解析和提取HTML或者XML格式的数据,可以利用XPath语法快速地定位特定的元素或节点。lxml库中大部分的功能都位于lxml.etree模块中,导入lxml.etree模块的常见方式如下:fromlxmlimportetree什么是lxml库lxml库的一些相关类如下:类说明Element可以理解为XML的节点ElementTree可以理解为一个完整的XML文档树ElementPath可以理解为XPath,用于搜索和定位节点什么是lxml库Element类是XML处理的核心类,它可以理解为XML的节点,大部分XML节点的操作都是围绕着该类进行的。什么是lxml库关于Element类的相关操作,主要可分为三个部分,分别是节点操作、节点属性的操作、节点内文本的操作。若要获取节点的名称,则可以通过tag属性获取,示例如下:print(root.tag)root什么是lxml库为了能够将XML文件解析为树结构,etree模块中提供了如下函数:fromstring()函数:从字符串中解析XML文档或片段,返回根节点(或解析器目标返回的结果)。HTML()函数:从字符串常量中解析HTML文档或片段,返回根节点(或解析器目标返回的结果)。什么是lxml库除了上述函数之外,还可以调用parse()函数从XML文件中直接解析。html=etree.parse('./hello.html')result=etree.tostring(html,pretty_print=True)print(result)在调用函数时,如果没有提供解析器,那么就使用默认的解析器,函数会返回一个ElementTree

类型的对象。lxml库的基本使用(1)可以直接使用“//”从任意位置选取节点li,路径表达式如下://lilxml库的基本使用(2)在上个表达式的末尾,使用“/”向下选取节点,并使用“@”选取class属性节点,表达式如下://li/@classlxml库的基本使用(3)从任意位置开始选取倒数第二个<li>标签,再向下选取标签<a>。如果要获取该标签中的文本,可以使用如下表达式://li[last()-1]/a//li[last()-1]/a]/text()或XPath语法XPath使用路径表达式在文档中进行导航,它从某个节点开始,之后顺着文档树结构的节点进一步查找。XPath的语法可按照如下情况进行划分:选取节点谓语选取未知节点选取若干路径XPath语法选取节点:节点是沿着路径选取的,既可以从根节点开始,也可以从任意位置开始。表达式说明nodename最快/快//慢.选取当前节点..选取当前节点的父节点@选取属性XPath语法这些条件都写在方括号中,表示对节点进行进一步筛选,用于查找某个特定节点或者包含某个指定值的节点。元素[表达式]谓语:指路径表达式的附加条件。XPath语法选取未知节点:XPath可以使用通配符来选取未知的节点。例如,使用“*”匹配任何元素节点。通配符说明*匹配任何元素节点。@*匹配任何属性节点。node()匹配任何类型的节点。XPath语法选取若干路径:在路径表达式中可以使用“|”运算符,以选取若干个路径。上述表达式用于选取book元素中包含的所有title和price子元素//book/title|//book/price第7章

解析库BeautifulSoup4目录页01BeautifulSoup4概述02BeautifulSoup对象03方法和CSS选择器什么是BeautifulSoup官网推荐现在的项目使用BeautifulSoup(BeautifulSoup4版本,简称为bs4)开发。bs4是一个HTML/XML的解析器,主要的功能是解析和提取HTML/XML数据。结

什么是BeautifulSoupbs4不仅支持CSS选择器,而且支持Python标准库中的HTML解析器,以及lxml的XML解析器。通过使用这些转化器,实现了惯用的文档导航和查找方式,节省了大量的工作时间,提高了开发项目的效率。构建BeautifulSoup对象通过一个字符串或者类文件对象可以创建BeautifulSoup类的对象。例如,根据字符串html_doc创建一个BeautifulSoup对象:frombs4importBeautifulSoupsoup=BeautifulSoup(html_doc,'lxml')在创建BeautifulSoup实例时共传入了两个参数。其中,第一个参数表示包含被解析HTML文档的字符串,第二个参数表示使用lxml解析器进行解析。构建BeautifulSoup对象目前,bs4支持的解析器包括Python标准库、lxml和html5lib,它们的优势和劣势的比较如下。解析器使用方法优势劣势Python标准库BeautifulSoup(markup,"html.parser")1)Python的内置标准库2)执行速度适中3)文档容错能力强Python2.7.3或3.2.2之前的版本中文档容错能力差lxmlHTML解析器BeautifulSoup(markup,"lxml")1)速度快2)文档容错能力强需要安装C语言库lxmlXML解析器BeautifulSoup(markup,

["lxml-xml"])1)速度快2)唯一支持XML的解析器需要安装C语言库html5libBeautifulSoup(markup,"html5lib")1)最好的容错性2)以浏览器的方式解析文档3)生成HTML5格式的文档1)速度慢2)不依赖外部扩展构建BeautifulSoup对象在创建BeautifulSoup对象时,如果没有明确地指定解析器,那么BeautifulSoup对象会根据当前系统安装的库自动选择解析器,解析器的选择顺序为:lxmlhtml5libPython标准库什么是BeautifulSoupbs4库将复杂的HTML文档转换成树结构(HTMLDOM),这个结构中的每个节点都是一个Python对象,这些对象可以归纳为如下四种:类说明bs4.element.Tag表示HTML中的标签,最基本的信息组织单元。bs4.element.NavigableString表示HTML中标签的文本(非属性字符串)bs4.BeautifulSoup表示HTMLDOM中的全部内容,支持遍历文档树和搜索文档树的大部分方法。bs4.element.Comment表示标签内字符串的注释部分,是一种特殊的NavigableString对象。什么是BeautifulSoup第1步根据HTML或者XML文件创建BeautifulSoup对象。第2步根据DOM树进行各种节点的搜索,只要获得了一个节点,就可以访问节点的名称、属性和文本。第3步在搜索节点的时候,我们也可以按照节点的名称、节点的属性或者节点的文字进行搜索。使用bs4的一般流程如下:什么是BeautifulSoup使用bs4的一般流程通过操作方法进行解读搜索为了能获得这些有用的网页信息,可以通过一些查找方法获取文本或者标签属性。因此,

bs4库内置了一些查找方法,其中常用的两个方法功能如下:find()方法:用于查找符合查询条件的第一个标签节点。find_all()方法:查找所有符合查询条件的标签节点,并返回一个列表。上述两个方法用到的参数是一样的,以find_all()方法为例,find_all()方法的定义如下:通过操作方法进行解读搜索find_all(name=None,attrs={},text=None)name参数:查找所有名字为name的标签,不过字符串会被自动忽略掉。传入字符串传入正则传入列表soup.find_all('b')fortaginsoup.find_all(pile("^b")):print()soup.find_all(["a","b"])通过操作方法进行解读搜索attrs参数:若指定名字的参数不是搜索方法中内置的参数名,则会把该参数当作指定名称的标签中的属性来搜索。传入属性标签传入多个属性传入class标签soup.find_all(id='link2')importresoup.find_all(href=pile("elsie"),id='link1')soup.find_all("a",class_="sister")通过操作方法进行解读搜索text参数:跟name参数的可选值一样,text参数也可以接受字符串、正则表达式和列表等。soup.find_all(text="Elsie")#结果为[u'Elsie']soup.find_all(text=["Tillie","Elsie","Lacie"])#结果为[u'Elsie',u'Lacie',u'Tillie']通过操作方法进行解读搜索limit参数:限制返回结果的数量,其效果跟SQL语句中的limit关键字所产生的效果类似。soup.find_all("a",limit=2)一旦搜索到结果的数量达到了limit的限制时,就会停止搜索。通过操作方法进行解读搜索recursive参数:如果只想搜索当前节点的直接子节点,那么就可以使用参数recursive=False。soup.html.find_all("title")#[<title>TheDormouse'sstory</title>]soup.html.find_all("title",recursive=False)#[]通过操作方法进行解读搜索通过CSS选择器进行搜索CSS即层叠样式表,是一种用来表现HTML或XML等文件样式的计算机语言。要想使用CSS对HTML页面中的元素实现一对一、一对多或多对一的控制,就需要用到CSS选择器。通过CSS选择器进行搜索每一条CSS样式定义均由两部分组成,形式如下:[code]选择器{样式}[/code]其中,在{}之前的部分就是“选择器”。选择器指明了{}中样式的作用对象,也就是“样式”作用于网页中的哪些元素。通过CSS选择器进行搜索BeautifulSoup类中提供了一个select()方法,该方法会将CSS选择器搜索到的结果放到列表中。通过标签查找通过类名查找通过id名查找通过组合查找通过属性查找第8章

多线程爬虫目录页01进程和线程02Python与线程03高级线程模块04多进程什么是进程程序是一个没有生命的实体,它包含许多由程序设计语言编写的、但未被执行的指令,这些指令经过编译和执行才能完成指定动作。什么是进程程序被执行后成为了一个活动的实体,这个实体就是进程。操作系统调度并执行程序,这个“执行中的程序”称为进程。进程是操作系统进行资源分配和调度的基本单位。什么是进程每个进程都在内存中占据一定空间,进程占据的内存空间一般由控制块、程序段和数据段三个部分组成。控制块系统为管理进程专门设置的数据结构,常驻于内存中,用于记录进程的外部特征与进程的运动变化过程。程序段用于存放程序执行代码的一块内存区域。数据段存储变量和进程执行期间产生中间或最终数据的一块内存区域。什么是进程随着外界条件的变化,进程的状态会发生变化。在五态模型中,进程有新建态、就绪态、运行态、阻塞态和终止态这五个状态。新建态就绪态运行态阻塞态终止态什么是进程除了以上五种状态之外,进程还有一个挂起态。挂起态是一种主动行为,它是在计算机内存资源不足、处理器空闲、用户主动挂起、系统检查资源使用情况等条件下将进程暂时调离出内存形成的,在条件允许时可再次被调回内存。与挂起态相比,阻塞态是一种被动行为,它是在等待事件或者获取不到资源而引发的等待表现。什么是进程下面通过一张图来描述进程状态间的转换关系。什么是进程进程具有以下一些特点:动态性并发性异步性独立性什么是线程思考:什么是线程?什么是线程线程是系统进行运算调度的最小单位,也被称为轻量级进程,它包含在进程之中,是进程的实际运作单位。进程中可以包含多个线程,每个线程是进程中单一顺序的控制流,可以并行执行不同的任务。什么是线程线程一般可分为以下几种类型:主线程程序启动时,操作系统在创建进程,的同时会立即运行一个线程,该线程通常被称为主线程。子线程程序中创建的其它线程。守护线程守护线程是在后台为其它线程提供服务的线程,它独立于程序,不会因程序的终止而结束。前台线程相对于守护线程的其它线程称为前台线程。什么是线程线程与进程相似,也具有五个状态,分别是新建态、就绪态、运行态、阻塞态和消亡态。什么是线程线程因某些条件发生时会由运行态转换为阻塞态,这些条件可能为以下任意一种:线程主动调用sleep()函数进入休眠状态;线程试图获取同步锁,但是该锁正被其它线程持有;线程等待一些I/O操作完成;线程等待某个条件触发。使用多线程执行程序Python提供了很多内建模块用于支持多线程,使用_thread模块中的start_new_thread函数会直接开启一个线程。线程和锁通过锁可以让程序了解是否还有线程函数没执行完,而可以做到当所有的线程函数执行完后,程序会立即退出,而无须任何等待。高级线程模块多线程模块threading支持守护线程,其工作方式是:如果没有客户端请求,守护线程就是空闲的;如果把一个线程设置为守护线程,就表示此刻这个线程是不重要的,其他进程退出时不需要等待这个守护线程执行完成。多进程

尽管多线程可以实现并发执行,不过多个线程之间时共享当前进程的内存的,也就是说,线程可以申请到的资源有限。要想充分利用多核CPU资源,进一步发挥并发的作用,可以考虑使用多进程。第9章

文件存储目录页01操作文件02读写XML文件03读写JSON文件04读写CSV文件爬虫在爬取WEB数据后,需要对这些抓取到的数据进行分析,分析完后需要将分析的成果保存起来。打开文件计算机中的文件能够持久保存程序运行时产生的数据。打开文件open()函数用于打开文件,该函数调用成功会返回一个文件对象。open(file,mode='r',encoding=None)file:表示待打开文件的文件名。encoding:表示文件的编码格式。mode:表示文件的打开模式。打开文件常用的文件打开模式有r、w、a、b、+,这些模式的含义分别如下:文件打开模式含义r以只读的方式打开文件,默认值。w以只写的方式打开文件。a以追加的方式打开文件。b以二进制方式打开文件。+以更新的方式打开文件。打开文件文件打开模式可搭配使用,如下表所示为常用的搭配。关闭文件close()方法用于关闭文件,该方法没有参数,直接调用即可。文件对象.close()关闭文件程序执行完毕后,系统会自动关闭由该程序打开的文件,但计算机中可打开的文件数量是有限的,每打开一个文件,可打开文件数量就减一;打开的文件占用系统资源,若打开的文件过多,会降低系统性能。因此,编写程序时应使用close()方法主动关闭不再使用的文件。文件的读取文件对象.read([size])参数size表示设置的读取数据的字节数,若该参数缺省,则一次读取指定文件中的所有数据。read()方法可以从指定文件中读取指定数据,其语法格式如下:文件的读取文件对象.readline()每执行一次readline()方法便会读取文件中的一行数据。readline()方法可以从指定文件中读取一行数据,其语法格式如下:文件的读取文件对象.readlines()readlines()方法在读取数据后会返回一个列表,该列表中的每个元素对应着文件中的每一行数据。readlines()方法可以一次读取文件中的所有数据,其语法格式如下:文件的读取read()(参数缺省时)和readlines()方法都可一次读取文件中的全部数据,但这两种操作都不够安全。因为计算机的内存是有限的,若文件较大,read()和readlines()的一次读取便会耗尽系统内存。为了保证读取安全,通常多次调用read()方法,每次读取size字节的数据。数据写入通过write()方法向文件中写入数据,其语法格式如下。文件对象.write(str)参数str表示要写入的字符串。若字符串写入成功,write()方法返回本次写入文件的长度。数据写入writelines()方法用于向文件中写入字符串序列,其语法格式如下:文件对象.writelines([str])文件的拷贝文件拷贝即创建文件的副本,此项操作的本质仍是文件的打开、关闭与读写,基本逻辑如下:第1步打开文件第2步读取文件内容创建新文件,将数据写入到新文件中。第3步关闭文件,保存数据。第4步文件的重命名Python提供了用于更改文件名的函数——rename(),该函数存在于os模块中,其语法格式如下:rename(原文件名,新文件名)文件的重命名待重命名的文件必须已存在,否则解释器会报错。创建目录os模块中的mkdir()函数用于创建目录,其语法格式如下:os.mkdir(path,mode)

p

温馨提示

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

评论

0/150

提交评论