Selenium是一款比较常见的web应用自动化测试库,它支持多种浏览器,多用于在爬虫中解决JavaScript渲染问题。

当requests,urllib*无法正常获取网页内容的时候,用它模拟浏览器进行网页加载,可以得到一些无法直接在网页源代码里面看到的内容。

利用selenium及其相关的库,笔者大概尝试过搭配headless chrome、headless firefox,以及快要凉凉的过气选手phantomjs。这几种无界面浏览器当然各有千秋,这里不做过多评论。

由于selenium原生代码似乎是不带post方式的,故此在测试用例时,很是费了一些精力。在这里,笔者会以headless firefox模式为例,简单谈一下在selenium下如何进行post数据。

第三方库

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

或者也可以去gayhub上自行clone:https://github.com/cryzed/Selenium-Requests

当然,这个库使用起来也是很简单的:# selenium.webdriver from the seleniumrequests module

from seleniumrequests import Firefox

# Simple usage with built-in WebDrivers:

webdriver = Firefox()

response = webdriver.request('GET', 'https://www.google.com/')

print(response)

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

['Android', 'Chrome', 'Firefox', 'Ie', 'Opera', 'PhantomJS', 'Remote', 'RequestMixin', 'Safari', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__warningregistry__', 'request']

想象一下画面,爬一次页面弹就会给你弹一个浏览器出来,这TM真酸爽。

HTML文件大法好

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

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

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

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

Ajax代行天子令

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

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

XMLHttpRequest示例片段:brower = webdriver.Firefox(firefox_options=fireFoxOptions)

js = """var xmlhttp=new XMLHttpRequest();

xmlhttp.open("GET","http://127.0.0.1/get.php",false);

xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");xmlhttp.setRequestHeader("User-Agent","Mozilla/5.0");

xmlhttp.setRequestHeader("Cookie","");

xmlhttp.send("test=1");

return xmlhttp.responseText;

"""

brower.implicitly_wait(30)

#time.sleep(30)

resp = brower.execute_script(js)

Jquery示例片段:jquery = open("jquery.min.js", "r").read()

driver = webdriver.Firefox(firefox_options=fireFoxOptions)

driver.execute_script(jquery)

ajax_query = '''

$.ajax('%s', {

type: %s,

data: %s,

headers: { "User-Agent": "Mozilla/5.0" },

crossDomain: true,

xhrFields: {

withCredentials: true

},

success: function(){}

});

''' % (url, request_type, data)

ajax_query = ajax_query.replace(" ", "").replace("\n", "")

resp = driver.execute_script("return " + ajax_query)

但这样做还是有缺陷,通过driver.get预访问一次将要请求的URL,我们能解决跨域的问题。

但是由于w3g的安全设定,我们无法自行在JS中预置cookie(可以通过跨域传递解决)、Referer等等危险的头部参数。

如若我们需要fuzz请求包头部一些冷门的参数(如Referer),这种法子就会有一定的局限性。笔者暂时也没有找到其他办法解决,希望有大佬能给点建议。

尾声

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

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

python selenium post请求_selenium爬虫中的post坑相关推荐

  1. python+selenium实现的谷歌爬虫(超详细)

    python+selenium实现的谷歌爬虫 接到一个需求,需要从谷歌图库中爬取图片.于是按照之前的爬取国内网站的图片的方法,进入谷歌图库的图片页面,打开谷歌开发者工具,选中network面板,然后翻 ...

  2. python urllib post请求_python爬虫(五)_urllib2:Get请求和Post请求

    本篇将介绍urllib2的Get和Post方法,更多内容请参考:python学习指南 urllib2默认只支持HTTP/HTTPS的GET和POST方法 urllib.urlencode() urll ...

  3. python selenium post请求_python selenium 如何使用post | 猴头客

    Selenium是一款比较常见的web应用自动化测试系统,它支持多种浏览器,多用于在爬虫中解决JavaScript渲染问题.由于selenium原生代码似乎是不带post方式的,笔者会以headles ...

  4. python selenium 下拉列表_从下拉列表中选择python selenium选项

    我试图使用下面的代码使用selenium(python)从网页上的下拉列表中选择一个选项.在from selenium import webdriver from selenium.webdriver ...

  5. python分布式编程_python分布式爬虫中的rules有什么用

    python分布式爬虫中的rules有什么用 发布时间:2020-11-30 14:04:49 来源:亿速云 阅读:100 作者:小新 这篇文章主要介绍python分布式爬虫中的rules有什么用,文 ...

  6. python 消息队列 flask_python分布式爬虫中消息队列知识点详解

    当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...

  7. python+selenium多线程与多进程爬虫

    使用python+selenium抓取深圳证券交易所本所公告数据,刚开始是用单进程爬取的,最近将代码修改了一下,分别用多进程和多线程进行抓取,速度非常快.如果对selenium不了解的请移步别的地方学 ...

  8. Python+Selenium多线程基础微博爬虫

    一.随便扯扯的概述 大家好,虽然我自上大学以来就一直在关注着CSDN,在这上面学到了很多知识,可是却从来没有发过博客(还不是因为自己太菜,什么都不会),这段时间正好在机房进行期末实训,我们组做的是一个 ...

  9. 使用selenium和phantomjs解决爬虫中对渲染页面的爬取

    selenium+phantomjs,headerlesschrome 一.selenium+phantomjs 1.selenium是什么:是一个浏览器的自动化测试框架,通过selenium可以写代 ...

最新文章

  1. java 通用方法_java – 类型的通用方法
  2. linux桥接模式下配置静态ip
  3. 程序员的幸福感和颈椎病
  4. 人工智能秘史(四):憧憬人机共生的“DARPA梦想家”
  5. 最新遇到的面试题20210319
  6. 手机能写python代码_用手机写Python代码!可以随时随地学Python!
  7. 用户微信好友关系属于个人隐私吗?深圳南山法院说不属于...
  8. sql select distinct常见错误_这8种常见的SQL错误用法,80%的程序员还在犯
  9. iPhone开发:类似iChat的聊天泡泡
  10. SolidWorks2016 从入门到入坟 下载安装+画图
  11. Mathematica基础
  12. 不积跬步无以至千里013
  13. 51单片机系列——定时/计数器
  14. “青少年编程能力等级”第一、第二部分:图形化编程 Python编程 含测试样题
  15. php 将信息写入文件格式,PHP 将信息写入文件
  16. Linux下批量重命名文件或文件夹(rename命令)
  17. 常用TCP/UDP端口号大全
  18. CF337A Maze 解题报告
  19. mysql如何减少主从复制延迟?
  20. 大数据可视化热门工具

热门文章

  1. 聊聊国内企业服务SAAS平台
  2. java jtable在哪个包中,javajtable添加
  3. iOS开发之第三方支付微信支付教程,史上最新最全第三方微信支付方式实现、微信集成教程,微信实现流程
  4. STM32入门100步 第5期 STM32内部通信功能
  5. 功能机和Andorid 语言支持
  6. Waves效果器离线安装包-Waves v9.6 Offline Install WiN-MAC
  7. miRTarBase 数据库简介
  8. deflategzip区别
  9. 2021年高处安装、维护、拆除考试资料及高处安装、维护、拆除理论考试
  10. 支付系统设计中,如何防止重复支付?