Selenium和Requests搭配使用

2023-09-20 16:53:19

前要

之前有提过, 用selenium控制本地浏览器, 提高拟人化,但是效率比较低,今天说一种selenium和requests搭配使用的方法
注意: 一定要先了解怎么远程控制浏览器,之后再按照这个来

selenium控制本地浏览器(二选一)
https://blog.csdn.net/weixin_44388373/article/details/121989842
https://blog.csdn.net/weixin_45081575/article/details/112621581

1. CDP

CDP 全称为 Chrome Devtools-Protocol

通过执行 CDP 命令,可以在网页加载前运行一段代码,进而改变浏览器的指纹特征
允许使用工具来检测、检查、调试和分析 Chromium、Chrome 和其他基于 Blink 的浏览器。

2. 通过requests控制浏览器

看这里!!!
这里值得注意是安装 websocket 模块,要按照这以下顺序

  1. pip install webscoket
  2. pip install websocket-client
# 之前的代码启动浏览器,selenium调用没问题
# 调用方式1
"C:\Program Files\Google\Chrome\Application\chrome.exe"  --remote-debugging-port=9222 --user-data-dir="随便找个空文件夹路径"

# 调用方式2
start chrome --remote-debugging-port=9222 --user-data-dir="C:\Users\1\Desktop\chrome"

# 代码调用
import os
os.popen('start chrome --remote-debugging-port=9222 --user-data-dir="C:\Users\1\Desktop\chrome"')

# 但是如果让requests调用会出错(无权限,禁止调用)
# 需要在语句中加入 --remote-allow-origins=* 
import os
os.popen('start chrome --remote-debugging-port=9222 --remote-allow-origins=* --user-data-dir="C:\Users\1\Desktop\chrome"')

2. 1 代码一

这里用的是 小菜欸 大佬的文章: 【Selenium】Python & Selenium 执行 CDP
我只是摘抄了一部分, 大佬讲的更详细, 推荐各位去看看

# 这里插入代码片
# -*- coding: utf-8 -*-
# @Time   : 2022-08-27 12:00
# @Name   : py_cdp.py

import json
import requests
import websocket


def websocket_conn():
    # websocket_conn 连接浏览器
    resp = requests.get('http://127.0.0.1:9222/json')  # 有不懂的看上一篇文章
    assert resp.status_code == 200
    ws_url = resp.json()[0].get('webSocketDebuggerUrl')
    return websocket.create_connection(ws_url)


def execute_cdp(conn: websocket, command: dict):
    # 执行  dp
    conn.send(json.dumps(command))
    # 接受websocket的响应,并将字符串转换为 dict()
    return json.loads(conn.recv())


def main():
    conn = websocket_conn()
    # js = "alert('hello world')" # 弹窗 hello world
    # js = "console.log('hello world')" # 控制台打印 hello world
    js = "location.href='https://www.bilibili.com'"  # 页面跳转
    command = {
        'method': 'Runtime.evaluate',  # 处理 传进去的 expression
        'id': int(1),	# id需要传一个整型,否则会报错,可以随便填一个数字
        'params': {'expression': js}   # 要执行的js语句
    }
    resp = execute_cdp(conn, command)
    print(resp)


if __name__ == '__main__':
    main()

运行效果看下面动图,js代码中指定页面跳转到 B站。
在这里插入图片描述

2. 2 代码2

这里用的是 合天网安实验室 的文章: 利用远程调试获取Chromium内核浏览器Cookie
这个也只摘抄了一部分, 推荐各位去看看
代码可以获取本地浏览器所有Cookie, 包括保存到本地的Cookie信息

import json
import requests
import websocket
# 添加以后发送如下数据包就可以成功获取Cookie
GET_ALL_COOKIES_REQUEST = json.dumps({"id": 1, "method": "Storage.getCookies"})


def hit_that_secret_json_path_like_its_1997():
    response = requests.get("http://127.0.0.1:9222/json")
    websocket_url = response.json()[0].get("webSocketDebuggerUrl")
    return websocket_url


def gimme_those_cookies(ws_url):
    ws = websocket.create_connection(ws_url)
    ws.send(GET_ALL_COOKIES_REQUEST)
    result = ws.recv()
    ws.close()
    response = json.loads(result)
    print(response)
    cookies = response["result"]["cookies"]
    return cookies


def to_cookie_dict(data):
	# name:cookie的名称 必须有
	# value:cookie对应的值,动态生成的, 必须有
	# domain:服务器域名
	# expiry:Cookie有效终止日期
	# path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie
	# httpOnly:防脚本攻击
	# secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时# 
	# {'domain': '.gonggaotong.net', 'httpOnly': False, 'name': 'Hm_lpvt_5aed315e6cf23667dff3f1224c5dcb60', 'path': '/', 'secure': False, 'value': '1642657344'}
	
	# 筛选cookie
    if 'bilibili.com' in data['domain']:
        cookie_dict = {data['name']: data['value'], 'Domain': data['domain'], 'Path': data['path'], 'Expires': data['expires']}
        print(cookie_dict)
        return cookie_dict


ws_url = hit_that_secret_json_path_like_its_1997()
print(ws_url)
data_list = gimme_those_cookies(ws_url)
print(data_list)

cookie_dict_list = [to_cookie_dict(data) for data in data_list]
# 遍历多个cookie字典,将每个字典中的key和value格式化为key=value的字符串
cookie_str_list = []
for cookie_dict in cookie_dict_list:
    if cookie_dict:
        for k, v in cookie_dict.items():
            cookie_str_list.append('{}={}'.format(k, v))

# 使用;将多个key=value字符串连接在一起
cookie_str = ';'.join(cookie_str_list)
print(cookie_str)

获取到的Cookie
在这里插入图片描述

3. 通过selenium获取cookie, requests携带cookie请求

先用selenium登录网站, 然后获取cookie, requests携带cookie访问

测试网站: http://exercise.kingname.info/exercise_login_success

import json
import requests
import websocket

GET_ALL_COOKIES_REQUEST = json.dumps({"id": 1, "method": "Storage.getCookies"})


def hit_that_secret_json_path_like_its_1997():
    response = requests.get("http://127.0.0.1:9222/json")
    websocket_url = response.json()[0].get("webSocketDebuggerUrl")
    return websocket_url


def gimme_those_cookies(ws_url):
    ws = websocket.create_connection(ws_url)
    ws.send(GET_ALL_COOKIES_REQUEST)
    result = ws.recv()
    ws.close()
    response = json.loads(result)
    print(response)
    cookies = response["result"]["cookies"]
    return cookies


def to_cookie_dict(data_list):
    cookie_dict = {}
    for data in data_list:
        if 'kingname' in data['domain']:
            cookie_dict[data['name']] = data['value']
    return cookie_dict


def login(res):
    if not '登录成功' in res:
        print('未登录')
    else:
        print('已登陆')


ws_url = hit_that_secret_json_path_like_its_1997()
data_list = gimme_those_cookies(ws_url)
cookie_dict = to_cookie_dict(data_list)
print(cookie_dict)

# 一个是把cookie先写成字典形式,然后把字典转换为cookiejar
s = requests.Session()  # 开启一个会话Session
res = s.get('http://exercise.kingname.info/exercise_login_success')
login(res.text)

# requests.utils.cookiejar_from_dict 转换为cookiejar
# requests.utils.dict_from_cookiejar 转换位字典
s.cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
res = s.get('http://exercise.kingname.info/exercise_login_success')
print(res.status_code)
login(res.text)

结果如下:
在这里插入图片描述

更多推荐

六、不root不magisk不xposed lsposed frida原生修改定位

系列文章目录第一章安卓aosp源码编译环境搭建第二章手机硬件参数介绍和校验算法第三章修改安卓aosp代码更改硬件参数第四章编译定制rom并刷机实现硬改(一)第五章编译定制rom并刷机实现硬改(二)第六章不root不magisk不xposedlsposedfrida原生修改定位第七章安卓手机环境检测软件分享第八章硬改之设

论文阅读《2022WWW:Rethinking Graph Convolutional Networks in Knowledge Graph Completion》

论文链接论文工作简介KCN在建模图结构方面很有效。基于GCN的KGC模型通常使用编码器-解码器框架,GCNs和KGE模型分别充当编码器和解码器。许多基于GCN的KGC模型虽然引入了额外的计算复杂度,但未能超越最先进的KGE模型?作者发现GCNs中的图结构并没有对KGC的性能有显著提升,相反实体表示的转换为性能带来提升。

Vue 组件的单元测试

1、基本的示例单元测试是软件开发非常基础的一部分。单元测试会封闭执行最小化单元的代码,使得添加新功能和追踪问题更容易。Vue的单文件组件使得为组件撰写隔离的单元测试这件事更加直接。它会让你更有信心地开发新特性而不破坏现有的实现,并帮助其他开发者理解你的组件的作用。这是一个判断一些文本是否被渲染的简单的示例:<templ

Rxjs操作符理解篇

创建运算符ajaxbindCallback:把回调API转化为返回Observable的函数bindNodeCallback:把Node.js式回调API转换为返回Observable的函数。deferemptyfromfromEventfromEventPatterngenerateintervalofrangeth

【音视频笔记】Mediacodec+Muxer生成mp4,浏览器无法播放问题处理

文章目录背景解决过程曲线修复方案解决问题根源背景最近在测试视频录制功能时发现,AudioRecord+MediaCodec+MediaMuxer生成的MP4,PC浏览器无法播放,但是Android、Windows、Mac的播放器应用都能正常播放。虽然不禁想吐槽浏览器视频组件的容错性差,但我也意识生成的文件格式肯定也是有

Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单

项目说明随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要求;通过电子化平台提高招投标工作的公开性和透明性;通过电子化招投标,使得招标采购的质量更高、速度

Spring MVC 八 - 内置过滤器

SpringMVC内置如下过滤器:FormDataForwardedHeadersShallowETagCORSFormData浏览器可以通过HTTPGET或HTTPPOST提交formdata(表单数据),但是非浏览器客户端可以通过HTTPPUT、HTTPDELETE、HTTPPATCH提交表单数据。但是Servle

如何使用 Node.js和Express搭建服务器?

如何使用NodeJs搭建服务器1.准备工作1.1安装Node.js2.安装express2.1初始化package.json2.2安装express2.3Express应用程序生成器1.准备工作1.1安装Node.jsNode.js是一个开源、跨平台的JavaScript运行时环境。下载链接:Node.js官网下载建议

【数据分享】我国主要城市的商圈范围数据(免费获取\shp格式)

大家对于商圈这个概念肯定都不陌生!商圈,简单来说,就是商业聚集的区域。我国比较知名的商圈有比如北京的三里屯商圈、上海的南京东路商圈。商圈是城市商业发展的重要体现,一个城市的商圈越多、商圈范围越大、商圈能级越高,代表这个城市的商业越发达!商圈的概念也越来越深入人心,比如在大众点评上可以以商圈(商区)为规则进行店铺搜索,比

【Redis】Redis实现分布式锁

【Redis】Redis常见面试题(1)文章目录【Redis】Redis常见面试题(1)1.为什么要用分布式锁2.Redis如何实现分布式锁3.Redis接受多个请求模拟演示4.使用Redis实现分布式锁会存在什么问题4.1一个锁被长时间占用4.2锁误删【Redis】Redis常见面试题(1)1.为什么要用分布式锁之前

Pandas 数据变形和模型分析

数据概念数据比对在本练习中,我们使用灵活的比较技术对不同的DataFrame进行比较importpandasaspdimportrandomrandom.seed(123)list1=[['A']*3,['B']*5,['C']*7]charlist=[xforsublistinlist1forxinsublist]r

热文推荐