利用selenium获取接口数据
起因:页面展示的内容被隐藏了部分,无法获取完整内容
处理方案:
1.利用request模拟接口获取返参,模拟了请求头,但操作时一直无法获得数据,报错:org.apache.catalina.connector.ClientAbortException。未深究,大概率是服务器安全问题
selenium获取请求头可参考:https://blog.csdn.net/qq_31042199/article/details/119278315
但是跟selenium库有冲突好像,不知道是否需要把selenium卸载了再安装seleniumwire,待后续有时间验证一下。
2.通过webdriver提供的API查询,使用的函数是Network.getResponseBody
代码:
import json
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import timecaps = {'browserName': 'chrome','loggingPrefs': {'browser': 'ALL','driver': 'ALL','performance': 'ALL',},'goog:chromeOptions': {'perfLoggingPrefs': {'enableNetwork': True,},'w3c': False, },
}
driver = webdriver.Chrome(desired_capabilities=caps)driver.get('https://partner.oceanengine.com/union/media/login/')
# 必须等待一定的时间,不然会报错提示获取不到日志信息,因为絮叨等所有请求结束才能获取日志信息
time.sleep(3)request_log = driver.get_log('performance')
print(request_log)for i in range(len(request_log)):message = json.loads(request_log[i]['message'])message = message['message']['params']# .get() 方式获取是了避免字段不存在时报错request = message.get('request')if(request is None):continueurl = request.get('url')if(url == "https://s3.pstatp.com/bytecom/resource/union_web2/media/manifest.json"):# 得到requestIdprint(message['requestId'])# 通过requestId获取接口内容content = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': message['requestId']})print(content)break
3.以上方法在操作中一直报错“no resource with given identifier found”,经排查,requestId是可以获取的,后来发现该接口是Ajax,selenium抓取Ajax接口的数据用如下demo(这个demo中包含了动态url获取过程):
import os, time, json
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesif __name__ == '__main__':# 引入chromedriverchrome_options = webdriver.ChromeOptions()# chrome_options.add_argument('--headless')# chrome_options.add_argument('--no-sandbox')# chrome_options.add_argument("--disable-extensions")# chrome_options.add_argument("--disable-gpu")prefs = {'download.default_directory': os.getenv('OS_LOG_PATH')}chrome_options.add_experimental_option('prefs', prefs)# make chrome log requestscapabilities = DesiredCapabilities.CHROME# caps['goog:loggingPrefs']capabilities["goog:loggingPrefs"] = {"performance": "ALL"} # newer: goog:loggingPrefs# capabilities['acceptSslCerts'] = True#browser = webdriver.Chrome(executable_path=r'/opt/google/chrome/chromedriver', options=chrome_options)browser = webdriver.Chrome(executable_path=r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe', options=chrome_options,desired_capabilities=capabilities)browser.implicitly_wait(3)browser.get("https://#########")# 输入账号browser.implicitly_wait(3)username_inputbox = browser.find_elements(By.XPATH, '//*[@id="app"]/section/div[1]/div/div[1]/div/div[2]/form/div[1]/div/div/div/input')[0]username_inputbox.click()browser.implicitly_wait(3)username_inputbox.clear()username_inputbox.send_keys("#######")# 输入密码browser.implicitly_wait(3)password_inputbox = browser.find_elements(By.XPATH, '//*[@id="app"]/section/div[1]/div/div[1]/div/div[2]/form/div[2]/div/div/div/input')[0]password_inputbox.click()browser.implicitly_wait(3)password_inputbox.clear()password_inputbox.send_keys("#######")# 点击登录browser.implicitly_wait(3)submit_btn = browser.find_elements(By.XPATH, '//*[@id="app"]/section/div[1]/div/div[1]/div/div[2]/form/div[3]/div/button')[0]submit_btn.click()# 等待5秒time.sleep(5)#-------------------------------------------------base_url = "https://#########"browser.get(base_url)time.sleep(3)# extract requests from logslogs_raw = browser.get_log("performance")logs = [json.loads(lr["message"])["message"] for lr in logs_raw]def log_filter(log_):return (# is an actual responselog_["method"] == "Network.responseReceived"# and jsonand "json" in log_["params"]["response"]["mimeType"])for log in filter(log_filter, logs):request_id = log["params"]["requestId"]resp_url = log["params"]["response"]["url"]print(request_id)print(f"Caught {resp_url}")json_str = json.dumps(browser.execute_cdp_cmd("Network.getResponseBody", {"requestId": request_id}), indent=4)# 创建一个params.json文件with open(f'{request_id}.json', 'w') as f:f.write(json_str) # 将json_str写到文件中browser.quit()
后续如遇见更多的获取接口数据的情况,再做补充
利用selenium获取接口数据相关推荐
- Selenium UI 自动化获取接口数据
Selenium UI 自动化获取接口数据 1.前端向接口的传参: 2.捕获到接口返回的内容后,判断前端是否有按照接口返回的内容进行展示 针对第一点,我上家公司是做旅游的,旅客预订完人数.房间数后前端 ...
- Python 获取接口数据,解析JSON,写入文件
Python 获取接口数据,解析JSON,写入文件 用于练手的例子,从国家气象局接口上获取JSON数据,将它写入文件中,并解析JSON: 总的来说,在代码量上,python代码量要比java少很多.而 ...
- 利用Tushare获取金融数据
利用Tushare获取金融数据 开发背景 Tushare社区 Tushare安装 Tushare使用 Tushare获取金融数据 1.获取A股列表 2.获取单只A股行情数据 3.获取多只A股数据 4. ...
- win摄像头怎么在linux,如何利用Video4Linux获取摄像头数据
Video4Linux是Linux下用于获取视频和音频数据的API接口,在这篇文章中,着重阐述如何利用Video4Linux获取摄像头数据,以实现连续影像的播放. 1. 摄像头的安装 在 Linux下 ...
- 用selenium获取土地交易数据并用百度智慧云API图片转文字
用selenium获取土地交易数据并用百度智慧云API图片转文字 1.数据获取 1.1 分析网页结构 1.2 selenium的坑 1.3 获取所有网页的标题和链接 1)selenium查找链接 2) ...
- 【Power Automate系列教程】利用API获取JSON数据定时每日自动写入List
利用API获取JSON数据定时每日自动写入List 在知识星球的后台有个看数据的界面: 通过简单的抓包可以看到是个json数据,那么就有了想法! 获取到请求的api,发现规律: https://api ...
- python爬虫— 利用js2xml 获取 script 数据
处理script中数据的最新方法,请看这个 主要介绍利用js2xml来获取<script>数据 1. 待获取网页:url:https://s.taobao.com/search?q=%E6 ...
- 微信小程序之获取接口数据展示
上篇说到获取编辑框文本,没看过去看看. 本片介绍简单的接口数据获取,并且展示,采取模拟数据,拉取数据方式方法.文章最后附上DEMO 本篇暂未考虑美化问题,只看功能.如图: 一.简单介绍 1> w ...
- 获取Flickr API key及利用Python获取Flickr数据
本文主要参考此篇博客,使用Python按坐标查找Flickr照片数据,感谢原博主. 1.申请Flickr的开发密钥,注册登陆Flickr(个人利用QQ邮箱进行了注册登陆).注册登陆(注意登陆此网站,需 ...
- R语言 | 利用tushare获取股票数据实例
作者的tushare ID:456548 自学深度学习模型,因为本人热爱在支付宝上买基金,于是突发奇想,用深度学习预测涨跌. 首要要获取基金的数据,但是基金数据不好获取,就获取对应的行业指数数据用于分 ...
最新文章
- guibuilder 皮肤_和平精英返场皮肤投票排名介绍-返场皮肤哪个好
- mysql table alter_MySQL-ALTER TABLE命令学习[20180503]
- linux中操作数据库的使用命令记录
- 蓝牙基础知识进阶——Physical channel
- 开工第一天,这个超时问题把我干趴下了
- html设置功能区菜单,html – 具有“3D”效果的功能区
- tomcat配置SSL加密网站
- 10个高效的摸鱼神器,你错过几个?
- css 文字不规则排版,DIV CSS解决不规则文字排版
- WPF如何实现跨线程更新UI控件
- java中赛场统分的情况
- R语言报错 变数的长度不一样,需要改成元素自变量对应的名称
- [ERROR] Please refer to XXXXXXXXXXX for the individual test result
- ajax 中的contentType
- 去掉连接图片的虚线框
- [笔试题目] 简单总结笔试和面试中的海量数据问题
- 菜鸟自学02:下载参考基因组及构建bowtie2索引
- 保持屏幕唤醒的几种方式总结
- 十位以内得自幂数_10以内加减法技巧,一年级数学考试必考
- 常见的有规律的单复数转换(随笔)