所以Requests库不是万能的
我们日常事情中,纯挚的HTTP请求,措施员都倾向于使用万能的python Requests库。但大大都场景下,我们的需求页面不是纯静态网页,,网页加载过程中陪同有大量的JS文件参预页面的整个衬着过程,且页面的每一步操纵可能都能找到异步加载XHR的影子。所以Requests库不是万能的,Requests-Html库就能解决一部分问题,前提是您知道这个过程加载了哪些js文件。小爬的实际事情中,更倾向于Requests+selenium的模式来完成整个网页信息的爬取。
能用Requests库直接请求获得数据的,就直接用requests的Session类来请求,碰到页面中JS载入较多的,就切换到selenium来执行。
那么问题来了,如何从requests优雅地切换到selenium来完成整个网页的自动化过程呢?很多时候,我们的页面信息爬取,处事器都是要求用户先登陆的,然后每次请求的时候保证会话session和根基cookies不乱,就可以一直保证后台的登陆状态。那么requests库的cookies如何传给selenium用呢?这样切换到selenium时,我们不用再次登陆,而是直接用requests给的cookies绑定到 selenium下,请求方针网页,打开的网页就可以天然是登陆状态了。
我们先使用requests库来登陆,代码凡是是这样(需要抓包看后台的post请求的data参数,我们请求前结构这个参数就可以了,每个网页的登陆的data参数不尽不异):
loginData={‘redirect‘:‘‘,‘username‘:username,‘password‘:psw} session = requests.Session() r=session.post(‘%sportal/u/a/login.do‘%base_url,loginData)
完成这部操纵后,我们可以通过Post请求的status_code是否即是200来判断页面是否告成登陆。一旦登陆告成,则我们的session请求该网站后续的网页时,这个session就可以一直连结下去了。
接下来,我么要拿到requests登陆网站后的cookies,它是requests的Cookiejar类的一个实例。Cookiejar简单来说就是获取响应的cookie,cookie是存储在浏览器的一些信息,包孕用户的登陆信息和一些操纵,我们从处事器中获取的响应信息中,有时候也会包罗一些cookie信息。
问题是这个cookiejar东西不是我们常见的字范例cookies东西,我们需要操作requests库的utils.dict_from_cookiejar要领来把cookiejar东西转换为python的字典东西。
cookies=session.cookies cookies=requests.utils.dict_from_cookiejar(cookies)
得到的cookies概略如下形式:
但是这依然不是selenium撑持的cookies格局。实际上,selenium使用driver.get_cookies()要领得到的cookies如下:列表中包罗多个cookie字典,每个字典中包罗多个键值对,而所有的键中,有的不是必需的,但是“name","value"这两个键是必填的。
[{‘domain‘: ‘.yourdomain.com‘, ‘httpOnly‘: False, ‘name‘: ‘HAP_HTTP_PATH‘, ‘path‘: ‘/‘, ‘secure‘: False, ‘value‘: ‘:80/hap‘},{},{}]
所以,我们只需要将我们上文转化后的cookies字典转化为selenium能认得的cookies即可,要领如下:
driver.get(base_url)
"""通报request cookie给 selenium用""" for k,v in cookies.items(): driver.add_cookie({"name":k,"value":v})需要注意的是,必需先要driver.get(your url),然后才华使用driver.add_cookie要领,否则selenium会报错。
至此,我们的selenium就告成添加了requests中捕获的响应的cookies,我们的selenium就不用再被处事器要求先登陆了。requests就和selenium完成了无缝跟尾,完美!
requests库结合selenium库配合完成web自动化和爬虫事情
标签:
原文地点:https://www.cnblogs.com/new-june/p/12095905.html
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/33107.html