版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章抓取静态网页数据《Python网络爬虫基础教程》学习目标/Target了解抓取静态网页的实现技术,能够说出每种实现技术的特点掌握Requests中基本请求的发送方式,能够向服务器发送GET请求和POST请求掌握Requests中响应内容的处理方式,能够根据需要获取响应内容学习目标/Target掌握Requests中请求头的定制方式,能够为GET请求和POST请求定制请求头掌握Requests中代理服务器的设置方式,能够为请求设置代理服务器掌握Requests中异常的处理方式,能够处理请求超时异常章节概述/Summary静态网页是早期网站中经常用到的页面,这类网页的特点是所有数据都直接呈现在网页源代码中,对于网络爬虫来说,只要获取了静态网页的源代码,就相当于抓取了静态网页的数据。本章将针对抓取静态网页数据的相关内容进行详细地讲解。目录/Contents3.13.23.3抓取静态网页的实现技术发送基本请求处理复杂请求目录/Contents3.43.53.6设置代理服务器处理异常实践项目:抓取黑马程序员论坛的数据抓取静态网页的技术3.1了解抓取静态网页的实现技术,能够说出每种实现技术的特点学习目标3.1抓取静态网页的技术静态网页是HTML格式的网页,这种网页在浏览器中呈现的内容都会体现在源代码中,此时我们若要抓取静态网页的数据,只需要获得网页的源代码即可。网络爬虫抓取静态网页数据的过程就是获得网页源代码的过程,这个过程模仿用户通过浏览器访问网页的过程,包括向Web服务器发送HTTP请求、服务器对HTTP请求做出响应并返回网页源代码。3.1抓取静态网页的技术为帮助开发人员抓取静态网页数据,减少开发人员的开发时间,Python提供了一些功能齐全的库,包括urllib、urllib3和Requests,其中urllib是Python内置库,无须安装便可以直接在程序中使用;urllib3和Requests都是第三方库,需要另行安装后才可以在程序中使用。urlliburllib是Python最早内置的HTTP客户端库,它涵盖了基础的网络请求功能。urllib3urllib3是一个强大的、用户友好的Python的HTTP客户端库,包括线程安全、连接池、客户端TLS/SSL验证、压缩编码等功能。RequestsRequests基于urllib3编写,该库会在请求完后重复使用Socket套接字,不会与服务器断开连接,而urllib库会在请求完之后与服务器断开连接。3.1抓取静态网页的技术本书后续选择用Requests库进行开发,截至2021年9月,Requests库的最新版本是2.25.1。值得一提的是,Requests库是第三方库,它可以通过pip工具进行安装,如此便可以在导入程序后直接使用。Requests库的安装命令如下。pipinstallrequests3.1抓取静态网页的技术发送基本请求3.2掌握Requests中基本请求的发送方式,能够向服务器发送GET请求学习目标3.2.1发送GET请求在Requests库中,GET请求通过调用get()函数发送,该函数会根据传入的URL构建一个请求(每个请求都是Request类的对象),将该请求发送给服务器。get()函数的声明如下:3.2.1发送GET请求get(url,params=None,headers=None,cookies=None,verify=True,proxies=None,timeout=None,**kwargs)url:必选参数,表示请求的URL。params:可选参数,表示请求的查询字符串。headers:可选参数,表示请求的请求头,该参数只支持字典类型的值。cookies:可选参数,表示请求的Cookie信息,该参数支持字典或CookieJar类对象。verify:可选参数,表示是否启用SSL证书,默认值为True。proxies:可选参数,用于设置代理服务器,该参数只支持字典类型的值。timeout:可选参数,表示请求网页时设定的超时时长,以秒为单位。3.2.1发送GET请求
不携带url参数的GET请求importrequests#准备URLbase_url='/'#根据URL构造请求,发送GET请求,接收服务器返回的响应信息response=requests.get(url=base_url)#查看响应码print(response.status_code)使用get()函数可以发送不携带url参数和携带url参数的GET请求。若GET请求的URL中不携带参数,我们在调用get()函数发送GET请求时只需要给url参数传入指定的URL即可。3.2.1发送GET请求
携带url参数的GET请求使用get()函数可以发送不携带url参数和携带url参数的GET请求。若GET请求的URL中携带参数,在调用get()函数发送GET请求时只需要给url参数传入指定的URL即可。importrequestsbase_url='/s'param='wd=python'full_url=base_url+'?'+param#拼接完整的URL#根据URL构造请求,发送GET请求,接收服务器返回的响应信息response=requests.get(full_url)#查看响应码print(response.status_code)方式一3.2.1发送GET请求
携带url参数的GET请求importrequestsbase_url='/s'wd_params={'wd':'python'}#根据URL构造请求,发送GET请求,接收服务器返回的响应response=requests.get(base_url,params=wd_params)#查看响应码print(response.status_code)使用get()函数可以发送不携带url参数和携带url参数的GET请求。方式二若GET请求的URL中携带参数,在调用get()函数发送GET请求时只需要给url参数传入指定的URL即可。掌握Requests中基本请求的发送方式,能够向服务器发送POST请求学习目标3.2.2发送POST请求3.2.2发送POST请求如果网页上form表单的method属性的值设为POST,那么当用户提交表单时,浏览器将使用POST方法提交表单内容,并将各个表单元素及数据作为HTTP请求信息中的请求数据发送给服务器。例如,登录美多商城时发送的请求是POST请求。此时,我们使用Fiddler工具捕获该请求后,可以看到发送该请求时的请求数据。在Requests中,POST请求可以通过调用post()函数发送,post()函数会根据传入的URL构建一个请求,将该请求发送给服务器,并接收服务器成功响应后返回的响应信息。post()函数的声明如下:post(url,data=None,headers=None,cookies=None,verify=True,proxies=None,timeout=None,json=None,**kwargs)3.2.2发送POST请求data:可选参数,表示请求数据。该参数可以接收3种类型的值,分别为字典、字节序列和文件对象。当参数值是一个字典时,字典的键为请求数据的字段,字典的值为请求数据中该字段对应的值,例如{"ie":"utf-8","wd":"python"}。json:可选参数,表示请求数据中的JSON数据。以美多商城网站为例,为大家演示如何使用post()函数请求美多商城网站首页,具体代码如下。importrequestsbase_url='/login/'#准备请求数据form_data={'csrfmiddlewaretoken':'FDb8DNVnlcFGsjIONtwiQoi6PtmCLeBsRgyjx2o2nsZ4MXDEGDeM2dUImEkj9O7t','username':'admin','pwd':'admin','remembered':'on'}response=requests.post(base_url,data=form_data)#根据URL构造请求,发送POST请求print(response.status_code)#查看响应信息的状态码3.2.2发送POST请求在Requests库中,Response类的对象中封装了服务器返回的响应信息,包括响应头和响应内容等。除了前面介绍的status_code属性之外,Response类中还提供了一些其他属性。3.2.3处理响应属性说明status_code获取服务器返回的状态码text获取字符串形式的响应内容content获取二进制形式的响应内容url获取响应的最终URLrequest获取请求方式headers获取响应头encoding设置或获取响应内容的编码格式,与text属性搭配使用cookies获取服务器返回的Cookie通过访问Response类对象的text属性可以获取字符串形式的网页源代码。3.2.3处理响应importrequestsbase_url='/'#根据URL构造请求,发送GET请求,接收服务器返回的响应信息response=requests.get(url=base_url)#查看响应内容print(response.text)
获取网页源代码为了保证获取的源代码中能够正常显示中文,这里需要通过Response对象的encoding属性将编码格式设置为UTF-8。3.2.3处理响应importrequestsbase_url='/'#根据URL构造请求,发送GET请求,接收服务器返回的响应信息response=requests.get(url=base_url)#设置响应内容的编码格式response.encoding='utf-8'#查看响应内容print(response.text)
获取网页源代码百度首页上除了文字信息之外,还包含一个百度Logo图片。若希望获取百度Logo的图片,我们需要先根据该图片对应的请求URL发送请求,再使用content属性获取该图片对应的二进制数据,并将数据写入到本地文件中。3.2.3处理响应importrequestsbase_url='/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'response=requests.get(base_url)#获取百度Logo图片对应的二进制数据print(response.content)#将二进制数据写入程序所在目录下的baidu_logo.png文件中withopen('baidu_logo.png','wb')asfile:file.write(response.content)
获取图片处理复杂请求3.33.3处理复杂请求在互联网中,网页中的内容是千变万化的,如果只根据请求URL发送基本请求有可能无法获取网站的响应,此时需要根据网站接收请求的要求完善请求。例如,在访问登录后的页面时需要给请求头带上Cookies,在遇到403错误时需要给请求头添加User-Agent。掌握Requests中请求头的定制方式,能够为GET请求和POST请求定制请求头学习目标3.3.1定制请求头打开Fiddler工具,在Chrome浏览器中加载知乎网登录页面,加载完成后切换至Fiddler工具,在窗口左侧选中刚刚发送的HTTP请求,并在窗口右侧查看该请求对应的请求头信息。3.3.1定制请求头定制请求头分为两步,分别是查看请求头和设置请求头。查看请求头importrequestsbase_url='/signin'header={'User-Agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64''AppleWebKit/537.36(KHTML,likeGecko)Chrome/92.0.4515.131Safari/537.36'}#根据URL和请求头构造请求,发送GET请求,接收服务器返回的响应response=requests.get(base_url,headers=header)response.encoding='utf-8'#查看响应内容print(response.text)3.3.1定制请求头在requests中,设置请求头的方式非常简单,只需要在调用请求函数时为headers参数传入定制好的请求头即可,一般是将请求头中的字段与值分别作为字典的键与值,以字典的形式传给headers参数。设置请求头掌握Requests中请求头的定制方式,能够为GET请求和POST设置Cookie学习目标3.3.2验证CookieCookie(有时也用其复数形式Cookies)是指某些网站为了辨别用户身份、进行会话跟踪,而暂时存储在客户端的一段文本数据(通常经过加密)。在Requests库中,发送请求时可以通过两种方式携带Cookie,一种方式直接将包含Cookie信息的请求头传入请求函数的headers参数;另一种方式是将Cookie信息传入请求函数的cookies参数。不过,cookies参数需要接收一个RequestsCookieJar类的对象,该对象类似一个字典,它会以名称(Name)与值(Value)的形式存储Cookie。3.3.2验证Cookieimportrequestsheaders={'Cookie':'此处填写登录百度网站后查看的Cookie信息',#设置字段Cookie'User-Agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_11_4)''AppleWebKit/537.36(KHTML,likeGecko)''Chrome/53.0.2785.116Safari/537.36',}#设置字段User-Agentresponse=requests.get('/',headers=headers)print(response.text)3.3.2验证Cookie以登录后的百度首页为例,使用两种方式演示如何使用Requests实现Cookie登录。方式一importrequestsheader={'User-Agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_11_4)''AppleWebKit/537.36(KHTML,likeGecko)Chrome/53.0.2785.116Safari/537.36'}cookie='此处填写登录百度网站后查看的Cookie信息‘#准备Cookiejar_obj=requests.cookies.RequestsCookieJar()#创建RequestsCookieJar类对象fortempincookie.split(';'):#以逗号为分隔符分割cookie,并将获得的键和值保存至jar_obj中key,value=temp.split('=',1)jar_obj.set(key,value)response=requests.get('/',headers=header,cookies=jar_obj)print(response.text)3.3.2验证Cookie方式二以登录后的百度首页为例,使用两种方式演示如何使用Requests实现Cookie登录。掌握Requests中的保持会话,能够通过Session类管理会话学习目标3.3.3保持会话importrequests#创建会话sess_obj=requests.Session()sess_obj.get('/cookies/set/sessioncookie/123456789')response=sess_obj.get("/cookies")print(response.text)在Requests中,Session类负责管理会话,通过Session类的对象不仅可以实现在同一会话内发送多次请求的功能,还可以在跨请求时保持Cookie信息。使用Session类的对象先在请求一个测试网站时设置Cookie信息,然后在请求另一个网站时获取Cookie信息,具体代码如下。3.3.3保持会话{"cookies":{"sessioncookie":"123456789"}}在上页代码中,首先创建了一个Session类对象sess_obj,然后基于sess_obj对象发送了一个GET请求到测试网站,并且在请求该测试网站时设置了Cookie信息,其中Cookie的名称设置为sessioncookie,内容为123456789,最后基于sess_obj对象请求另一个网站,获取上次请求时设置的Cookie信息。3.3.3保持会话importrequestsrequests.get('/cookies/set/sessioncookie/123456789')response=requests.get("/cookies")print(response.text)若不使用Session类对象请求测试网站,而是直接使用Requests库请求测试网站。3.3.3保持会话运行程序,结果如下所示。{"cookies":{}}掌握SSL证书验证,能够通过Requests实现SSL证书验证学习目标3.3.4SSL证书验证SSL证书是一种数字证书,类似于驾驶证、护照和营业执照的电子副本,由受信任的数字证书颁发机构CA在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。3.3.4SSL证书验证当使用Requests调用请求函数发送请求时,由于请求函数的verify参数的默认值为True,所以每次请求网站时默认都会进行SSL证书的验证。不过,有些网站可能没有购买SSL证书,或者SSL证书失效,当程序访问这类网站时会因为找不到SSL证书而抛出SSLError异常。例如,使用Requests请求国家数据网站,具体代码如下。3.3.4SSL证书验证importrequestsbase_url='/'header={'User-Agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64''AppleWebKit/537.36(KHTML,likeGecko)''Chrome/90.0.4430.212Safari/537.36'}response=requests.get(base_url,headers=header)print(response.status_code)运行上页代码,程序抛出SSLError异常,具体如下所示。3.3.4SSL证书验证requests.exceptions.SSLError:HTTPSConnectionPool(host='',port=443):Maxretriesexceededwithurl:/(CausedbySSLError(SSLCertVerificationError(1,'[SSL:CERTIFICATE_VERIFY_FAILED]certificateverifyfailed:selfsignedcertificateincertificatechain(_ssl.c:1108)')))这时需要主动关闭SSL验证,即在调用get()函数时将verify参数设置为False,代码如下所示。response=requests.get(base_url,headers=header,verify=False)再次运行代码,控制台没有输出SSLError异常,而是输出了如下警告信息:3.3.4SSL证书验证C:\Users\admin\AppData\Roaming\Python\Python38\site-packages\urllib3\connectionpool.py:981:InsecureRequestWarning:UnverifiedHTTPSrequestisbeingmadetohost''.Addingcertificateverificationisstronglyadvised.See:https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings这时,如果不希望收到警告信息,可以采用如下方式消除警告信息。importurllib3urllib3.disable_warnings()设置代理服务器3.4了解代理服务器,能够代理服务器的工作原理以及代理服务器的分类学习目标3.4.1代理服务器简介设置代理服务器是网络爬虫应对防爬虫的策略之一,这种策略会为网络爬虫指定一个代理服务器,借用代理服务器IP地址访问网站,掩盖网络爬虫所在主机的真实IP地址,从而达到伪装IP地址的目的。3.4.1代理服务器简介网络爬虫在抓取网页的数据时,可能会出现这样的情况:起初可以正常抓取网页的数据,一段时间后便不能继续抓取了,可能会收到403错误及提示信息“您的IP访问频率过高”。之所以出现这种现象是因为网站采取了防爬虫措施,该网站会检测某个IP地址在单位时间内访问的次数,如果超过其设定的阈值,就会直接拒绝为拥有该IP地址的客户端服务,这种情况称为封IP。3.4.1代理服务器简介为避免网络爬虫被封IP,我们可以利用某种技术伪装IP地址,让服务器识别不出由哪台设备发起的请求,这种技术就是代理服务器,代理服务器(ProxyServer)用于代理客户端用户去服务器端获得网络信息。3.4.1代理服务器简介代理服务器介于客户端和服务器之间。没有代理服务器之前,客户端会直接将请求发送给Web服务器,然后Web服务器将响应信息返回给客户端;有了代理服务器之后,客户端不再直接向Web服务器发送请求,而是先将这个请求发送到代理服务器,由代理服务器转发给Web服务器,之后由代理服务器将收到的响应信息返回给客户端。并非所有的代理服务器都适合网络爬虫,我们在使用代理服务器时,主要考虑代理服务器的匿名程度。根据代理服务器的匿名程度,代理服务器可以分为3类,分别是高度匿名代理、普通匿名代理和透明代理。3.4.1代理服务器简介会将数据包原封不动地转发给服务器,让服务器认为当前访问的用户只是一个普通客户端,而不是代理服务器,并记录代理服务器的IP地址。会对数据包进行一些改动,这时服务器可能会发现当前访问的用户是代理服务器,也可能会追查到客户端的真实IP地址。不仅会改动数据包,还会暴露当前访问客户端的真实IP地址。代理服务器高度匿名代理服务器普通匿名代理服务器透明代理服务器使用高度匿名代理服务器,对方服务器完全不知道客户端使用了代理,更不知道客户端的真实IP地址,代理的信息完全替代了客户端的所有信息;使用普通匿名代理服务器,虽然对方服务器可以知道客户端使用了代理,但并不知道客户端的真实IP地址;使用透明代理服务器,对方服务器可以知道客户端使用了代理,并且也知道客户端的真实IP地址。因此,高度匿名代理服务器是最理想的选择。3.4.1代理服务器简介掌握设置代理服务器,能够在requests中设置代理服务器学习目标3.4.2设置代理服务器设置代理服务器一般分为两步,分别是获取代理IP和设置代理IP。3.4.2设置代理服务器获取免费代理IP免费代理IP基本没有成本,我们可以从免费代理网站上。互联网上存在许多代理商,用户付费后便可以获得一些高质量的代理IP。ADSL拨号ADSL通过拨号的方式上网,需要输入ADSL账号和密码,每次拨号都会更换一个新的IP地址。获取付费代理IP
获取代理IP设置代理服务器一般分为两步,分别是获取代理IP和设置代理IP。3.4.2设置代理服务器
设置代理IP在Requests中,设置代理IP的方式非常简单,我们只需要在调用请求函数时为proxies参数传入一个字典,该字典中包含了所需要的代理IP,其中字典的键为代理类型(http或https),字典的值为“代理类型://IP地址:端口号”格式的字符串。proxies={'http':'0:3128','https':'0:1080',}通过一个示例来演示如何从IP地址列表中随机选择一个IP地址,将该IP地址设置为代理IP,基于该代理IP请求小兔鲜儿网首页。3.4.2设置代理服务器importrequests,randomproxy_list=[{"http":"49:3129"},{"http":":3256"},{"http":"6:3000"},{"http":"02:3256"},{"http":"63:3256"}]base_url='/#/'header={'User-Agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64AppleWebKit/537.36(KHTML,likeGecko)Chrome/90.0.4430.212Safari/537.36'}#发送GET请求,将proxy_list中任意一个IP地址设为代理response=requests.get(base_url,headers=header,proxies=random.choice(proxy_list))print(response.status_code)程序中使用的代理IP是免费的,由于这些代理IP的使用时间不固定,一旦超出使用时间范围就会失效,此时再运行上述程序会出现ProxyError异常。因此,这里建议大家换成自己查找的代理IP。3.4.2设置代理服务器掌握检测代理IP,能够通过Requests检测代理IP是否有效学习目标3.4.3检测代理IP的有效性互联网上有很多免费的代理IP,这些IP地址并不都是有效的,为此我们需要对获取的免费IP地址进行检测,确定这个IP地址是否有效。检测代理IP的过程比较简单,我们需要先遍历收集的所有代理IP,分别将取出来的每个代理IP依次设为代理,再通过该IP地址向网站发送请求,如果请求成功,则说明该IP地址是有效的;如果请求失败,则说明该IP地址是无效的,需将该IP地址进行剔除。3.4.3检测代理IP的有效性3.4.3检测代理IP的有效性importrequestsproxy_list=[{"http":"49:3129"},{"http":":3256"},{"http":"6:3000"},{"http":"02:3256"},{"http":"63:3256"}]base_url='/#/'header={'User-Agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64AppleWebKit/537.36(KHTML,likeGecko)''Chrome/90.0.4430.212Safari/537.36'}forper_ipinproxy_list.copy():try:#发送GET请求,将获取的每个IP地址设置为代理
response=requests.get(base_url,headers=header,proxies=per_ip,timeout=3)except:#失败则输出IP地址无效,并将该IP地址从proxy_list列表中移除
print(f'IP地址:{per_ip.get("http")}无效')proxy_list.remove(per_ip)else:
print(f'IP地址:{per_ip.get("http")}有效')#成功则输出IP地址有效下面演示如何检测代理IP的有效性,具体代码如下。处理异常3.5掌握Requests中异常的处理方式,能够处理请求超时异常学习目标3.5处理异常3.5处理异常每个程序在运行过程中可能会遇到各种各样的问题,网络爬虫自然也不例外。网络爬虫访问网站离不开网络的支撑。由于网络环境十分复杂,具有一定的不可控性,所以每次访问网站后不一定能够成功地获得从服务器返回的数据。网络爬虫一旦在访问过程中遇到一些网络问题(如DNS故障、拒绝连接等),就会导致程序引发异常并停止运行。3.5处理异常requests.exceptions模块中定义了很多异常类型,常见的异常类型如下表。异常类型说明RequestException请求异常ConnectionError连接错误HTTPError发生HTTP错误URLRequired发出请求需要有效的URLTooManyRedirects请求超过配置的最大重定向数ConnectTimeout尝试连接到远程服务器时请求超时ReadTimeout服务器在规定的时间内没有发送任何数据Timeout请求超时Timeout继承自RequestException,而ConnectTimeout和ReadTimeout又继承自Timeout。3.5处理异常为保证程序能够正常终止,我们可以使用try-except语句捕获相应的异常,并对异常进行相应的处理。由于谷歌网站服务器的原因,访问该网站必定会出现连接超时的问题。下面以访问谷歌网站为例,为大家演示如何使用try-except语句捕获RequestException异常。importtime,requestsprint(time.strftime('开始时间:%Y-%m-%d%H:%M:%S'))#记录请求的发起时间try:#捕获RequestException异常html_str=requests.get('').textprint('访问成功')exceptrequests.exceptions.RequestExceptionaserror:print(error)#记录请求的终止时间print(time.strftime('结束时间:%Y-%m-%d%H:%M:%S'))3.5处理异常为了减少无意义的等待,我们在发送HTTP请求时可以设置超时时长,即调用get()函数时传入timeout参数,并给该参数指定代表超时时长的值,如果超过该时长,服务器仍然没有返回任何响应内容,就让程序立即引发一个超时异常。在以上示例中,为请求设置超时时长为5秒。html_str=requests.get('',timeout=5).text#发送GET请求,设置超时时长实践项目:抓取黑马程序员论坛的数据3.6掌握抓取黑马程序员论坛网的数据,能够通过Requests抓取网站指定页面数据学习目标3.6抓取黑马程序员论坛网的数据黑马程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年苏教版九年级地理下册阶段测试试卷
- 2025年牛津译林版七年级数学下册阶段测试试卷含答案
- 2024机械租赁合同协议书模板
- 2025年华师大新版八年级生物上册阶段测试试卷
- 普洱2024年第四次云南普洱孟连县人民医院招聘编外合同制人员10人笔试历年典型考点(频考版试卷)附带答案详解
- 部编版七年级下册语文同步教学设计《第五单元写作 文从字顺》
- 二零二五年度云计算数据中心租赁合同6篇
- 二零二五年度环保设施三方付款合同范本3篇
- 二手摩托车交易协议范本版
- 2025年度城市综合体停车场租赁与运营管理合同3篇
- 关于斗争精神不足的整改措施【三篇】
- 初三物理寒假课程
- 如何预防心脑血管病
- LY/T 3321-2022草原生态价值评估技术规范
- 《新媒体文案创作与传播》期末试卷1
- 人感染H7N9禽流感流行病学调查和处置
- 高等院校内部控制多模型决策方法研究
- 木栈道专项施工方案(同名3601)
- GB/T 11957-2001煤中腐植酸产率测定方法
- 浙江省普通高中通用技术学科教学指导意见
- HRB500级钢筋施工要点ppt课件
评论
0/150
提交评论