将python请求与javascript页面一起使用

将python请求与javascript页面一起使用,python,web-scraping,python-requests,Python,Web Scraping,Python Requests,我试图将Requests框架与python()结合使用,但我试图访问的页面使用javascript获取我想要的信息 我曾尝试在web上搜索解决方案,但事实上,我正在使用关键字javascript进行搜索,我得到的大部分内容都是如何使用javascript语言进行搜索 是否有必要对使用javascript的页面使用requests框架?您必须发出与javascript相同的请求(使用请求库)。您可以使用任意数量的工具(包括内置于Chrome和Firefox中的工具)来检查来自javascript的

我试图将Requests框架与python()结合使用,但我试图访问的页面使用javascript获取我想要的信息

我曾尝试在web上搜索解决方案,但事实上,我正在使用关键字javascript进行搜索,我得到的大部分内容都是如何使用javascript语言进行搜索


是否有必要对使用javascript的页面使用requests框架?

您必须发出与javascript相同的请求(使用请求库)。您可以使用任意数量的工具(包括内置于Chrome和Firefox中的工具)来检查来自javascript的http请求,只需自己从Python发出此请求。

虽然Selenium看起来很吸引人而且很有用,但它有一个无法修复的主要问题:性能。通过计算浏览器所做的每一件事,您将需要更多的功能。即使是PhantomJS也不能与简单的请求竞争。我建议您仅在确实需要单击按钮时使用Selenium。如果您只需要javascript,我建议您使用PyQt(检查以了解它)

但是,如果您想使用Selenium,我建议使用Chrome而不是PhantomJS。许多用户在PhantomJS中遇到问题,网站根本无法在PhantomJS中工作。Chrome也可以是无头(非图形化)的

首先,确保您已经安装了ChromeDriver,Selenium在使用Google Chrome时依赖它

然后,通过在URL中检查Google Chrome版本60或更高版本,确保您拥有该版本chrome://settings/help

现在,您只需执行以下代码:

from selenium.webdriver.chrome.options import Options
from selenium import webdriver

chrome_options = Options()
chrome_options.add_argument("--headless")

driver = webdriver.Chrome(chrome_options=chrome_options)
如果您不知道如何使用Selenium,下面是一个快速概述:

driver.get("https://www.google.com") #Browser goes to google.com
查找元素: 使用元素或元素方法。示例:

driver.find_element_by_css_selector("div.logo-subtext") #Find your country in Google. (singular)
  • 驱动程序。通过_css_选择器(css_选择器)查找_元素#匹配此css选择器的每个元素
  • 驱动程序。通过类名称(类名称)查找元素
  • 驱动程序。通过_id(id)查找_元素#具有以下id的每个元素
  • 驱动程序。通过链接文本(链接文本)查找元素
  • 驱动程序。通过部分链接文本(部分链接文本)查找元素
  • driver.find_element_by_name(name)#name=argument的每个元素
  • driver.find_element_by_tag_name(tag_name)#使用tag name参数的每个元素
好的!我找到了一个元素(或元素列表)。但是我现在该怎么办?

以下是可以对元素元素执行的方法:

  • elem.tag_name#可以在一个窗口中返回按钮
  • elem.get_属性(“id”)#返回元素的id
  • elem.text#元素的内部文本
  • elem.clear()#清除文本输入
  • 元素是否显示()#对于可见元素为True,对于不可见元素为False
  • 元素is_enabled()#对于启用的输入为True,否则为False
  • 元素是否选中()#是否选中此单选按钮或复选框元素
  • elem.location#表示屏幕上元素的X和Y位置的字典
  • 元素。单击()#单击元素
  • elem.send_键(“legend27”)#在elem中键入legend27(用于文本输入)
  • elem.submit()#提交elem参与的表单
特殊命令:

  • driver.back()#单击后退按钮
  • driver.forward()#单击前进按钮
  • driver.refresh()#刷新页面
  • driver.quit()#关闭浏览器,包括所有选项卡
  • foo=driver.execute_脚本(“return'hello';”)#执行javascript(可以获取返回值!)

好消息:现在有一个支持javascript的请求模块:

我认为,作为一个额外的好处,这可以包装
美丽的小组
,这样你就可以做类似的事情了

r.html.find('#myElementID').text

它返回HTML元素的内容,正如您所期望的那样。

它是Pypetteer或smth的包装器:)我觉得有点不一样

    @property
    async def browser(self):
        if not hasattr(self, "_browser"):
            self._browser = await pyppeteer.launch(ignoreHTTPSErrors=not(self.verify), headless=True, args=self.__browser_args)

        return self._browser

使用Selenium或支持jQuery的请求速度较慢。更有效的方法是在网站检查浏览器上的JavaScript后找出生成的cookie,然后获取cookie并将其用于每个请求

在一个示例中,它通过以下cookies工作:

在本例中检查javascript后生成的cookie是“cf_clearance”。 因此,只需创建一个会话。 更新cookie和标头,如下所示:

s = requests.Session()
s.cookies["cf_clearance"] = "cb4c883efc59d0e990caf7508902591f4569e7bf-1617321078-0-150"
s.headers.update({
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
               AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
        })

而且你很好,不需要像Selenium这样的JavaScript解决方案。这是一种更快、更高效的方法。你只需要在打开浏览器后获取一次cookie即可。

因此,没有办法让请求使用JavaScript。不,请求是一个http库。它不能运行JavaScript。我使用Chrome工具调试网站,并查找Javascript正在调用。到目前为止,您可以看到我创建的结果,这是最好的。您还可以获得很好的JSON,以便更容易获取数据。应该是
r.html.find(“#myElementID”).text
?以及
r=session.get('http://www.yourjspage.com“)
?在解决了菲尔指出的问题后,我仍然“RuntimeError:无法在现有事件循环中使用HTMLSession。请改用AsyncHTMLSession。”@KubaFYI是的,他们可以开始将内容转移到python3@HuckIt要解决此问题,将导入
AsyncHTMLSession
而不是
htmlession
,并使用
wait session.get(url.result().arender()调用渲染
。我刚刚遇到了这个问题,我就是这样解决的。正如在文档请求中所写的那样,html在后台使用Chromium。所以它是Chromium浏览器,由请求(如包装器)控制。
s = requests.Session()
s.cookies["cf_clearance"] = "cb4c883efc59d0e990caf7508902591f4569e7bf-1617321078-0-150"
s.headers.update({
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
               AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
        })