当前位置:   article > 正文

python selenium 如何使用post_seleniumbase触发post请求

seleniumbase触发post请求

Selenium是一款比较常见的web应用自动化测试系统,它支持多种浏览器,多用于在爬虫中解决JavaScript渲染问题。由于selenium原生代码似乎是不带post方式的,笔者会以headless firefox模式为例,简单谈一下在selenium下如何进行post数据。

 

第三方库

以seleniumrequests为例,这个库是一个selenium扩展,使得selenium下也可以使用requests的功能,我们可以采用pip安装:

pip install selenium-requests

或者也可以去gayhub上自行clone:

https://github.com/cryzed/Selenium-Requests

当然,这个库使用起来也是很简单的:

  1. # selenium.webdriver from the seleniumrequests module
  2. from seleniumrequests import Firefox
  3. # Simple usage with built-in WebDrivers:
  4. webdriver = Firefox()
  5. response = webdriver.request('GET', 'https://www.google.com/')
  6. print(response)

不过这个库也有它的缺点,不方便自定义一些驱动模式参数,无法设置headless状态(也许是我自己瞎几把搞没试出来)。有兴趣的朋友可以自行研究下,其支持如下:

  1. >>> dir(seleniumrequests)
  2. ['Android', 'Chrome', 'Firefox', 'Ie', 'Opera', 'PhantomJS', 'Remote', 'RequestMixin', 'Safari', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__warningregistry__', 'request']

HTML文件大法好

个人不太喜欢这种法子,不过好像有一部分人比较推崇。其原理是解析了原生的post请求后,将其传递的参数重构为form表单,最后再将这些新生成的代码存入html网页。

最后,程序会再借用selenium定位submit元素,触发事件提交表单。

窃以为这种方法不太妥帖,每开一个网页程序就得生成一个新的html文件。先不论程序是否一定具有写和删的权限,做法本身是显得比较繁琐的。

FB上貌似有类似介绍这种方法的文章,这里就不贴代码了。

Ajax代行天子令

Ajax模拟post发送请求,这是笔者自己采用过的办法。当然,效果一般般,我相信应该有更好的。

无论是原生JS的XMLHttpRequest,还是Jquery,都可以模拟生成ajax post请求,最后再借助selenium执行JS代码。

XMLHttpRequest示例片段:

  1. brower = webdriver.Firefox(firefox_options=fireFoxOptions)
  2. js = """var xmlhttp=new XMLHttpRequest();
  3. xmlhttp.open("GET","http://127.0.0.1/get.php",false);
  4. xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  5. xmlhttp.setRequestHeader("User-Agent","Mozilla/5.0");
  6. xmlhttp.setRequestHeader("Cookie","");
  7. xmlhttp.send("test=1");
  8. return xmlhttp.responseText;
  9. """
  10. brower.implicitly_wait(30)
  11. #time.sleep(30)
  12. resp = brower.execute_script(js)

Jquery示例片段:

  1. jquery = open("jquery.min.js", "r").read()
  2. driver = webdriver.Firefox(firefox_options=fireFoxOptions)
  3. driver.execute_script(jquery)
  4. ajax_query = '''
  5. $.ajax('%s', {
  6. type: %s,
  7. data: %s,
  8. headers: { "User-Agent": "Mozilla/5.0" },
  9. crossDomain: true,
  10. xhrFields: {
  11. withCredentials: true
  12. },
  13. success: function(){}
  14. });
  15. ''' % (url, request_type, data)
  16. ajax_query = ajax_query.replace(" ", "").replace("\n", "")
  17. resp = driver.execute_script("return " + ajax_query)

尾声

总而言之,selenium没有自带原生post方式是一个遗憾,而且其调用headless模式的浏览器,渲染和启动也显得太慢了些,难以适用于单机高并发。

还是那句话,由于selenium其本身的定位和特性。个人窃以为在资源有限的情况下,它不太适用于高并发的大规模测试,做低效精准的辅助也许尚可。

建议

可以用Selenium模拟登陆后 再把cookies保存下来,放到urllib.request里用。
不过selenium页面加载顺序 网速也会引起一系难控制的bug有的难受。
还可以去试试phantomjs 效率比selenium 高一些,不会再弹出个浏览器,是后台运行的。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/90093
推荐阅读
相关标签
  

闽ICP备14008679号