Requests-Cache安装与测试Requests-Cache模块是requests模块的扩展功能,用于为requests模块提供持久化缓存支持。如果requests模块向一个URL发送重复请求,Requests-Cache模块会自动判断当前网络请求是否产生缓存。如果已经生成缓存,则从缓存中读取数据作为响应内容。如果没有缓存,则会向服务器发送网络请求,获取服务器返回的响应内容。使用Requests-Cache模块可以减少网络资源的数量,避免重复请求,可以变相的避开一些反爬虫机制。注意无论是否使用Anaconda,都需要单独安装Requests-Cache模块,因为Anaconda中不包含该模块。Python3.9.9(v3.9.9:ccb0e6a345,Nov152021,13:29:20)[Clang6.0(clang-600.0.57)]ondarwin>>>importrequests_cache>>>version=requests_cache.__version__>>>print(version)0.9.1的缓存应用调用install_cache()函数实现Requests-Cache请求。语法格式如下:install_cache(cache_name='cache',backend=None,expire_after=None,allowable_codes=(200,),allowable_methods=('GET',),session_factory=,**backend_options)install_cache()函数包含多个参数,各参数含义如下:§cache_name:表示缓存文件名Name,默认为cache§backend:表示设置缓存的存储机制,默认为None,表示默认使用sqlite存储§expire_after:表示设置缓存的有效时间,默认为None,表示永久有效§allowable_codes:表示设置状态码,默认为200§allowable_methods:表示设置请求方式,默认为GET,表示只有GET请求才能产生缓存§session_factory:表示设置缓存执行的对象,需要实现CachedSession类§**backend_options:如果缓存存储方式为sqlite,对于mongo和redis数据库,该参数表示设置数据库的连接方式。使用install_cache()函数实现请求缓存时,一般不需要单独设置任何参数,只需要使用默认参数即可。判断缓存是否存在的代码如下:#_*_coding:utf-8_*_#作者:liuxiaowei#创建时间:1/30/228:32AM#文件:判断缓存是否存在.py#IDE:PyCharm#导入requests_cache模块importrequests_cache#导入网络请求模块importrequests#设置缓存requests_cache.install_cache()#清除缓存requests_cache.clear()#定义测试地址url='http://httpbin.org/get'#第一次发送网络请求r=requests.get(url)#false表示没有缓存print('Isthereacache:',r.from_cache)#第二次发送网络请求r=requests.get(url)#True表示有缓存print('Isthereacache:',r.from_cache)程序运行结果如下:是否有缓存:False是否有缓存:True用于反爬措施,在多个请求中设置延迟是一个不错的选择。但是,如果缓存是在第一次请求之后产生的,那么第二次请求就不需要设置延迟了。为此,Requests-Cache模块可以使用自定义的钩子函数来合理判断是否需要设置延时操作。示例代码如下:#_*_coding:utf-8_*_#作者:liuxiaowei#创建时间:1/30/228:57AM#文件:使用钩子函数判断是否需要设置延时.py#IDE:PyCharm#导入Requests_Cache模块importrequests_cache#导入时间模块导入时间#设置缓存requests_cache.install_cache()#清除缓存requests_cache.clear()#定义钩子函数defmake_throttle_hook(timeout=0.1):defhook(response,*args,**kwargs):print(response.text)#如果没有缓存则添加延迟ifnotgetattr(response,'from_cache',False):print('wait',timeout,'seconds!')#等待指定时间time.sleep(timeout)else:#有缓存输出Trueprint('是否有请求缓存!',response.from_cache)returnresponsereturnhookif__name__=='__main__':requests_cache.install_cache()requests_cache.clear()s=requests_cache.CachedSession()s.hooks={'response':make_throttle_hook(2)}#配置钩子函数#模拟发送第一个网络请求ts.get('http://httpbin.org/get')#模拟发送第二次网络请求s.get('http://httpbin.org/get')程序运行结果:第一次运行结果:{“args":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip,deflate","Host":"httpbin.org","User-Agent":"python-requests/2.27.1","X-Amzn-Trace-Id":"Root=1-61f5e91a-5c923abe41da544561b5f400"},"origin":"139.209.219.102","url":"http://httpbin.org/get"}等待2秒获取第二个请求结果{"args":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip,deflate","Host":"httpbin.org","User-Agent":"python-requests/2.27.1","X-Amzn-Trace-Id":"Root=1-61f5e91a-5c923abe41da544561b5f400"},"origin":"139.209.219.102","url":"http://httpbin.org/get"}第二次请求是否有缓存!True从上面的运行结果来看,可以通过配置钩子函数来实现:在第一个在第一个请求中,因为没有请求缓存,执行了2秒等待延迟;在第二个请求中,没有执行2秒延迟,输出是否有请求缓存行为True说明Requests-Cache模块支持4种不同的存储机制,分别是money、sqlite、mongoDB、redid。具体如下:§memory:将缓存以字典的形式存储在内存中,程序运行后缓存会被销毁§sqlite:将缓存存储在sqlite数据库中§mongoDB:将缓存存储在mongoDB数据库§redis:将缓存存储在redis数据库中backend参数可以赋值,设置方法如下:#导入Requests_Cache模块importrequests_cache#将缓存设置为内存存储机制requests_cache.install_cache(backend='memory')#设置缓存为sqlite数据库的存储机制requests_cache.install_cache(backend='sqlite')#设置缓存为mongoDB数据库的存储机制requests_cache.install_cache(backend='mongoDB')#设置缓存为redis数据库的存储机制requests_cache.install_cache(backend='redis')设置存储机制为mongoDB和redis数据库,需要解压并安装相应的运行模块和数据库。安装模块的命令如下:pipinstallpymongopipinstallredis强大的Requests-HTML模块Requests-HTML模块是requets模块的兄弟,由同一个开发者开发。Requests-HTML模块不仅包含了requests模块的所有功能,还增加了对JavaScript、数据提取和真实浏览器模拟的支持。使用Requests-HTML模块实现网络请求(1)get()请求通过'pipinstallrequests-html'命令安装模块,然后在Requests-HTML模块中导入HTMLSession类,然后需要创建一个HTMLsession对象,通过session实例发送网络请求,示例代码如下:#_*_coding:utf-8_*_#作者:liuxiaowei#创建时间:1/30/223:48PM#文件:使用Requests-HTML模块实现网络requests.py#IDE:PyCharm#ImportHTMLSessionclassfromrequests_htmlimportHTMLSession#创建HTML会话对象session=HTMLSession()#定义请求地址url='http://news.youth.cn/'#发送网络请求r=session.get(url)#打印网络请求的URL地址print(r.html)程序运行结果如下:(2)当post()请求实现网络请求时,POST请求也是一种比较常见的请求方式。使用Requests-HTML实现POST请求与req??uests的实现方法类似。两者都需要单独设置表单参数数据,但也需要通过session实例发送网络请求。示例代码如下:#_*_coding:utf-8_*_#作者:liuxiaowei#创建时间:1/30/224:44PM#文件:post()request.py#IDE:PyCharm#导入HTMLSessionclassfromrequests_htmlimportHTMLSession#创建HTMLSession对象session=HTMLSession()#模拟表单登录数据data={'user':'admin','password':123456}#发送POST请求r=session.post('http://httpbin.org/post',data=data)#判断请求是否成功ifr.status_code==200:print(r.text)程序的结果如下:{"args":{},"data":"","files":{},#formdata"form":{"password":"123456","user":"admin"},"headers":{"Accept":"*/*","Accept-Encoding":"gzip,deflate","Content-Length":"26","Content-Type":"application/x-www-form-urlencoded","Host":"httpbin.org",#User-Agent对应值"User-Agent":"Mozilla/5.0(Macintosh;IntelMacOSX10_12_6)AppleWebKit/603.3.8(KHTML,likeGecko)Version/10.1.2Safari/603.3.8","X-Amzn-Trace-Id":"Root=1-61f6509d-56a381b4543229480fe07e56"},"json":null,"origin":"139.209.219.102","url":"http://httpbin.org/post"}从上面的运行结果中,不仅可以看到表单对应的表单内容,还看到User-Agent对应的值不是requests模块发送网络请求时返回的默认值(python-requests/2.27.1),而是真实的浏览器请求头信息,和那个是一样的由请求发送dule对网络请求的小改进(3)修改请求头信息在请求头信息方面,Requests-HTML模块可以通过指定headers参数来修改默认的浏览器请求头信息。修改请求头信息的关键代码如下:ua={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/97.0.4692.99Safari/537.36Edg/97.0.1072.76'}r=session.post('http://httpbin.org/post',data=data,headers=ua)§UserAgent类添加到Requests-HTML模块中,可以是用于随机生成请求头。示例代码如下:#_*_coding:utf-8_*_#作者:liuxiaowei#创建时间:1/30/229:06PM#文件:生成随机请求头信息.py#IDE:PyCharm#导入HTMLSessionclassfromrequests_htmlimportHTMLSession,UserAgent#创建一个HTML会话对象session=HTMLSession()#创建一个随机请求头ua=UserAgent().randomr=session.get('http://httpbin.org/get',headers={'user-agent':ua})#判断请求是否成功ifr.status_code==200:#以文本格式打印返回结果print(r.text)程序运行结果如下:{"args":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip,deflate","Host":"httpbin.org",#请求头信息"User-Agent":"Mozilla/5.0(X11;Ubuntu;Linuxx86_64;rv:17.0)Gecko/20100101Firefox/17.0.6","X-Amzn-Trace-Id":"Root=1-61f69454-0b37eb40198f0f4b237fc7e8"},"origin":"139.209.219.102","url":"http://httpbin.org/get"}{"args":{},"headers":{"Accept":"*/*","加速器ept-Encoding":"gzip,deflate","Host":"httpbin.org",#请求头信息"User-Agent":"Mozilla/5.0(Macintosh;英特尔MacOSX10_8_2)AppleWebKit/537.17(KHTML,如Gecko)Chrome/24.0.1309.0Safari/537.17","X-Amzn-Trace-Id":"Root=1-61f693aa-0d20428a3a73766723017536"},"origin":"139.209.219.102","url":"http://httpbin.org/get"}备注:上面的操作是在Anaconda的Jupiternotebook下运行Pycharm报错,应该是解释器的问题。以前在提取数据的时候之前是使用requests模块来实现爬虫程序的,还是需要配置伙伴来解析HTML代码,Requests-HTML模块做了比较大的升级,不仅支持CSS选择器,还支持XPath节点提取方法CSS选择器CSS选择器需要用到HTML的find()方法,该方法包含5个参数,其语法格式及参数含义如下:find(selector:str='*',containing:_Containing=None,clean:bool=False,first:bool=False,_encoding:str=None)§选择器:使用CSS选择器定位网页元素§续aining:通过指定文本获取网页元素§clean:是否清除HTML