pyppeteer拦截某个get请求并将其修改为post并传递参数的方法。
由于爬取的网站有cloufare验证,因此选择使用pyppeteer进行模拟登录,然后获取视频流。但是如果登录和获取流写在一起的话耗时很久,所以将登录的部分提取出来保存cookie
由于获流的请求方式为post请求,故将stream网址重置,修改请求方法并增加param。
# -*- coding: UTF-8 -*-
import asyncio
import random
from urllib.parse import unquote
from pyppeteer import launch
from pyppeteer import launcher
import requests
from requests.adapters import HTTPAdapter
import re
import json
# 获取redis里面存储的cookie
def get_redis(name):
HOST = '45.91.101.88'
PORT = '6379'
PASSWORD = 'bet365pass'
data = {}
sr = StrictRedis(host=HOST, port=PORT, password=PASSWORD, decode_responses=True, db=0)
data = sr.get(name + '_guides')
except Exception as e:
print(e)
finally:
return data
# 模拟浏览器方法
async def GetStream(stream_id):
if '--enable-automation' in launcher.DEFAULT_ARGS:
launcher.DEFAULT_ARGS.remove("--enable-automation")
browser = await launch(
{'handleSIGINT': False, 'handleSIGTERM': False, 'handleSIGHUP': False},
headless=True, dumpio=True, userDataDir=r'./text',
args=['--no-sandbox', '--disable-setuid-sandbox', '--disable-blink-features=AutomationControlled'])
web = await browser.createIncognitoBrowserContext()
page = await web.newPage()
await page.setViewport({
"width": 1068,
"height": 480
await page.setUserAgent("Linux/Deepin")
cookies = json.loads(get_redis('cookies'))
for i in cookies:
await page.setCookie(i)
await page.setRequestInterception(True)
page.on('request', lambda req: asyncio.ensure_future(intercept_request(req, stream_id)))
response = await page.goto('https://www.365sb.com/streamingapi/v2/stream')
responseBody = await response.text()
url = responseBody.split('&')[2].split("=")[1]
StreamContent(url)
# 关闭浏览器
await page.close()
await browser.close()
# 请求拦截器函数,设置拦截条件并可作修改
async def intercept_request(interceptedRequest:Request, stream_id):
interceptedRequest.headers["content-type"] = "application/x-www-form-urlencoded"
param = 'l=10&m={}&t=446&sl=4'.format(stream_id)
data = {
'method': 'POST',
'postData': param, # 注意格式,格式错误无法重置请求
'url': interceptedRequest.url,
'headers': interceptedRequest.headers
await interceptedRequest.continue_(data)
关于拦截器的位置,如果拦截器放置到goto后面,则只能拦截到加载页面之后的请求和响应。
请求拦截器拦截完成后一定要await interceptedRequest.continue_(),不然可能造成其他请求被拦截后无法再次加载出来。
JavaWeb Struts2的拦截器我们都能很熟悉,在请求交给Action处理之前,先在拦截器中处理,处理完之后再交给Action。
在Django中如何实现相同的效果?
2.Django中间件
这个是我的项目的目录结构。
首先,先在app目录(也就是我项目的web目录)中新建一个文件命名为middleware.py
里面加入以下代码:
from django.utils.deprecation import MiddlewareMixin # Django 1.10.x
except ImportError:
MiddlewareMixin = object #
if (process.env.NODE_ENV == 'development') {
baseUrl = '';
} else if (process.env.NODE_ENV == 'production') {
baseUrl = '生产地址';
export {
baseUrl,//导出baseUrl
在这里我首先设置了开发
下载文本中的网页源码,由于需要向下拉动滚动条所以使用pyppeteer渲染网页,并执行js代码,可是发现开启无界面的时候似乎执行不了js代码,还有异步的时候好像也执行不了js代码
import asyncio
from pyppeteer import launch
import re, os,time
async def create_page():
browser = await launch(headless=True, dumpio=True)
return browser
pyppeteer拦截请求不成功,报错:RuntimeWarning: Enable tracemalloc to get the object allocation traceback
pyppeteer用到拦截请求的时候,按照度娘上面的方法很多都没成功,各种错误,其中遇到的:RuntimeWarning: Enable tracemalloc to get the object allocation traceback错误
意思是 调用异步函数,没有关键字await
这时灵光一闪,加上关键字aw
# 执行js 点击
# js 代码
xx = """document.querySelector('a[data-logintype="phonepwd"]').click()"""
self.page.evaluate(xx)
# 直接点击
await self.page.click('div.account-center-submit')
await self.page.reload()
await self.page.waitFor(1000) # 等待
page.setRequestInterception(true)拦截器的使用方法和场景
现附上Puppeteer的Api的链接https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md
实用场景(没错就是实用):比如我用Puppeteer模拟某个网页,然后我只想抓到这条网页的url的response的内容,或者我需要截图...
文章目录介绍环境部署pip installchromium下载快速使用应用技巧启动参数优化常用的参数其他参数示例窗口/可视区最大化隐藏浏览器特征拦截请求
注意,讲解的模块叫做 Pyppeteer,不是 Puppeteer。
Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来控制 Chrome 浏览器的一些操作,当然也可以用...
在PyCharm中,按住Command键(Windows、Linux用户按住Ctrl键),鼠标左键点击
from pyppeteer import launch中的 launch,自动跳转到Pyppeteer源代码中的 launcher.py文件
把代码往上翻,在第61行左右,找到如下的代码:
AUTOMATION_ARGS = [
‘–enable-automation’,
‘–password-store=basic’,
‘–use-mock-keychain’,
将其改成:
AUTOMATION_
对于使用模拟登陆等操作来爬虫的手段,已经很容易被检测了,网上很多教程是说在网站所有js代码执行之前来执行下面几个js代码来到达效果:
js1 = '''() =>{Object.defineProperties(navigator,{ webdriver:{ get: () => false}})}'''
js2 = '''() => {alert(window.navig...
完成404的响应
上一个版本中我们已经实现了根据浏览器中用户在地址栏上输入的URL中的抽象路径去static目录下寻找对应资源进行响应的工作。
但是会存在路径输入有误,导致定位不对(要么定位的是一个目录,要么该文件不存在),此时再发送响应的响应正文时使用文件输入流读取就会出现异常提示该资源不存在。
这是一个典型的404情况,因此我们在ClientHandler处理请求的环节,在实例化File对象根据抽象路径定位webapps下的资源后,要添加一个分支,若该资源存在则将其响应回去,如果不存在则要响应404状态
pyppeteer github 地址:https://github.com/miyakogi/pyppeteer
pyppeteer 英文文档地址:https://miyakogi.github.io/pyppeteer/ pyppeteer 官方文档 API Reference :https://miyakogi.github.io/pyppeteer/reference.html
puppeteer( Nodejs 版 selenium ...
### 回答1:
关于pyppeteer拦截websocket的问题,我可以回答。Pyppeteer是一个基于Python的无头浏览器控制库,可以通过它来模拟人类的浏览行为。Pyppeteer中的websocket拦截功能可以用于拦截浏览器中的WebSocket请求,并对请求进行自定义处理。具体操作可以查阅相关文档和示例代码。
### 回答2:
pyppeteer 是一个非常强大的 Python 库,使用它可以对 Chrome 或者 Chromium 进行远程控制。如果想要拦截 WebSocket,可以使用 pyppeteer 提供的 WebSocket 相关的 API 来实现。
首先,我们需要使用 `pyppeteer.page.Page` 类的 `expose_function` 方法在 JavaScript 环境中注册一个回调函数。这个回调函数将会在每当有 WebSocket 打开时被调用。示例如下:
```python
async def handle_websocket(future, msg):
# 在这里处理 WebSocket 相关的逻辑
print('Handle WebSocket: {}'.format(msg))
# 你可以在这里进行拦截、修改或者记录 WebSocket 的数据
page = await browser.newPage()
# 注册回调函数
await page.expose_function('handleWebSocket', handle_websocket)
然后,在每次打开 WebSocket 时,可以通过在 JavaScript 中调用注册函数,来将 WebSocket 的信息传递给 Python 进行处理。示例如下:
```javascript
// 创建 WebSocket 连接
const ws = new WebSocket('wss://example.com');
// 在 WebSocket 打开时,调用注册的回调函数,将 WebSocket 信息传递给 Python
ws.onopen = () => {
window.handleWebSocket('ws opened');
// 在 WebSocket 关闭时,调用注册的回调函数,将 WebSocket 信息传递给 Python
ws.onclose = () => {
window.handleWebSocket('ws closed');
通过这种方法,你可以在 `handle_websocket` 回调函数中处理 WebSocket 数据,可以拦截、修改或记录 WebSocket 的内容,以满足你的特定需求。
以上就是使用 pyppeteer 拦截 WebSocket 的基本方法,希望对你有所帮助。
### 回答3:
pyppeteer是一个基于Python的无头浏览器控制库,可以用于模拟浏览器行为,实现自动化测试、数据爬取等功能。在pyppeteer中,我们可以通过拦截websocket来实现对浏览器的网络请求的控制和监控。
要拦截websocket,我们可以使用pyppeteer的Page对象的`waitForRequest()`和`waitForResponse()`方法。首先,我们可以使用`waitForRequest()`方法来等待页面发起的websocket请求。例如,我们可以使用以下代码来等待页面中发起的websocket请求:
request = await page.waitForRequest(lambda request: request.url.startswith('ws://'))
这样,当页面中发起websocket请求时,代码将会暂停执行,直到请求发起,然后将请求对象赋值给`request`变量。
然后,我们可以使用`waitForResponse()`方法来等待服务器对websocket请求的响应。例如,我们可以使用以下代码来等待服务器对websocket请求的响应:
response = await page.waitForResponse(lambda response: response.request.url.startswith('ws://'))
这样,当服务器对websocket请求进行响应时,代码将会暂停执行,直到接收到响应,然后将响应对象赋值给`response`变量。
在拦截到websocket请求和响应后,我们可以进行进一步的操作,比如修改请求参数、过滤响应数据等。这样,我们就可以实现对websocket的拦截和控制。
总而言之,使用pyppeteer可以很方便地拦截websocket,通过`waitForRequest()`和`waitForResponse()`方法可以实现对浏览器的网络请求的控制和监控,从而达到我们的目的。希望以上回答能够帮到你!