用html和Pypetteer python发送点击请求

用html和Pypetteer python发送点击请求,python,web-scraping,Python,Web Scraping,我试图登录到一个网站,点击一个按钮,然后抓取一些数据。该页面必须呈现,因为它都是JavaScript(因此,如果您[例如]在web浏览器中查看源代码,则该页面不可用) 除了发送点击外,一切正常 当我尝试使用requests\uhtml包发送click时,它似乎没有做任何事情,尽管没有抛出错误。我知道它在很大程度上依赖于pyppeteer,所以我一直在尝试在文档之间切换,但是整个异步编程对我来说非常混乱 import asyncio import requests_html # Login in

我试图登录到一个网站,点击一个按钮,然后抓取一些数据。该页面必须呈现,因为它都是JavaScript(因此,如果您[例如]在web浏览器中查看源代码,则该页面不可用)

除了发送点击外,一切正常

当我尝试使用
requests\uhtml
包发送click时,它似乎没有做任何事情,尽管没有抛出错误。我知道它在很大程度上依赖于
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

根据请求\u html最新版本,您可以将脚本参数传递给html对象的呈现方法。这相当于执行(pyppeteer)页面属性的方法,请参见(第523行)。例如(警告:快速脏代码):


请记住提供适当的睡眠时间间隔,以确保渲染完成。我已经对它进行了测试,结果是正确的(当点击按钮时,我可以在应用脚本后找到该按钮,页面正在执行额外的请求以添加更多信息)。

因此,我知道您提到您不想使用Selenium,但根据我的经验,这似乎要容易得多。我知道PhantomJS不受欢迎,但为什么不使用chromedriver?@K-Log最后,我就是这么做的。在花了必要的时间设置Selenium和Chromedriver之后,我能够在大约5分钟内用Selenium重新编写整个过程。如果有一天可能的话,在
html\u请求中仍然可以做得很好!
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)