python selenium post请求_selenium爬虫中的post坑
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坑相关推荐
- python+selenium实现的谷歌爬虫(超详细)
python+selenium实现的谷歌爬虫 接到一个需求,需要从谷歌图库中爬取图片.于是按照之前的爬取国内网站的图片的方法,进入谷歌图库的图片页面,打开谷歌开发者工具,选中network面板,然后翻 ...
- python urllib post请求_python爬虫(五)_urllib2:Get请求和Post请求
本篇将介绍urllib2的Get和Post方法,更多内容请参考:python学习指南 urllib2默认只支持HTTP/HTTPS的GET和POST方法 urllib.urlencode() urll ...
- python selenium post请求_python selenium 如何使用post | 猴头客
Selenium是一款比较常见的web应用自动化测试系统,它支持多种浏览器,多用于在爬虫中解决JavaScript渲染问题.由于selenium原生代码似乎是不带post方式的,笔者会以headles ...
- python selenium 下拉列表_从下拉列表中选择python selenium选项
我试图使用下面的代码使用selenium(python)从网页上的下拉列表中选择一个选项.在from selenium import webdriver from selenium.webdriver ...
- python分布式编程_python分布式爬虫中的rules有什么用
python分布式爬虫中的rules有什么用 发布时间:2020-11-30 14:04:49 来源:亿速云 阅读:100 作者:小新 这篇文章主要介绍python分布式爬虫中的rules有什么用,文 ...
- python 消息队列 flask_python分布式爬虫中消息队列知识点详解
当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...
- python+selenium多线程与多进程爬虫
使用python+selenium抓取深圳证券交易所本所公告数据,刚开始是用单进程爬取的,最近将代码修改了一下,分别用多进程和多线程进行抓取,速度非常快.如果对selenium不了解的请移步别的地方学 ...
- Python+Selenium多线程基础微博爬虫
一.随便扯扯的概述 大家好,虽然我自上大学以来就一直在关注着CSDN,在这上面学到了很多知识,可是却从来没有发过博客(还不是因为自己太菜,什么都不会),这段时间正好在机房进行期末实训,我们组做的是一个 ...
- 使用selenium和phantomjs解决爬虫中对渲染页面的爬取
selenium+phantomjs,headerlesschrome 一.selenium+phantomjs 1.selenium是什么:是一个浏览器的自动化测试框架,通过selenium可以写代 ...
最新文章
- java 通用方法_java – 类型的通用方法
- linux桥接模式下配置静态ip
- 程序员的幸福感和颈椎病
- 人工智能秘史(四):憧憬人机共生的“DARPA梦想家”
- 最新遇到的面试题20210319
- 手机能写python代码_用手机写Python代码!可以随时随地学Python!
- 用户微信好友关系属于个人隐私吗?深圳南山法院说不属于...
- sql select distinct常见错误_这8种常见的SQL错误用法,80%的程序员还在犯
- iPhone开发:类似iChat的聊天泡泡
- SolidWorks2016 从入门到入坟 下载安装+画图
- Mathematica基础
- 不积跬步无以至千里013
- 51单片机系列——定时/计数器
- “青少年编程能力等级”第一、第二部分:图形化编程 Python编程 含测试样题
- php 将信息写入文件格式,PHP 将信息写入文件
- Linux下批量重命名文件或文件夹(rename命令)
- 常用TCP/UDP端口号大全
- CF337A Maze 解题报告
- mysql如何减少主从复制延迟?
- 大数据可视化热门工具