gpt4 book ai didi

python - 使用 requests_html 和 pyppeteer python 发送点击

转载 作者:行者123 更新时间:2023-12-04 11:37:05 25 4
gpt4 key购买 nike

我正在尝试登录一个网站,单击一个按钮,然后抓取一些数据。必须呈现页面,因为它全部使用 JavaScript(因此如果您 [例如] 在 Web 浏览器中查看源代码,则不可用)。

除了发送点击的时间外,一切正常。

当我尝试使用 requests_html 发送点击时包,它似乎没有做任何事情,尽管没有抛出错误。我知道它严重依赖 pyppeteer ,所以我一直试图在文档之间跳转,但整个异步编程的事情对我来说非常困惑。

import asyncio
import requests_html

# Login information
payload = {
'email': 'example@gmail.com',
'password': 'Password123'
}

# Start a session
with requests_html.HTMLSession() as s:
p = s.post('https://www.website.com/login', data=payload)

# Send the request now that we're logged in
r = s.get('https://www.website.com/data')

# Render the JavaScript page so it's accessible
r.html.render(keep_page=True, scrolldown=5, sleep=5)

async def click():
await r.html.page.click(
selector='button.showAll',
options={'delay':3, 'clickCount':1},
)

asyncio.get_event_loop().run_until_complete(click())

print(r.html.html)
r.html.html包含来自 JS 的渲染 HTML,但不包含单击按钮。我已经确认按钮正在被点击,但我怀疑新页面没有以某种方式被“保存”,而且 r.html.html正在返回预先点击的页面。

我宁愿不使用已弃用的 PhantomJS/Selenium。 Scrapy 真的很重,我宁愿不依赖 Scrapy + Splash 来完成这件事——我想我已经很接近了! MechanicalSoup 不适用于 JavaScript。

最佳答案

根据 request_html 最新 documentation您可以通过 脚本 的参数渲染 html 对象的方法。这相当于执行 评估 (pyppeteer) 的方法 属性(property),见 requests_html.py (行:523)。例如(警告:快速和肮脏的代码):

from requests_html import HTMLSession

session = HTMLSession()
r = session.get("http://xy.com")

script = """
() => {
const item = document.getElementById("foo");
if(item) {
item.click()
}
}
"""

r.html.render(sleep=sleep, timeout=timeout, script=script)
切记提供合适的 sleep 间隔以确保渲染完成。我已经对其进行了测试,结果是正确的(当单击按钮时,页面正在执行额外的请求以添加更多信息,我在应用脚本后能够找到)。

关于python - 使用 requests_html 和 pyppeteer python 发送点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52264028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com