使用带有javascript页面的python请求

时间:2014-10-15 22:31:12

标签: python web-scraping python-requests

我正在尝试使用python(http://docs.python-requests.org/en/latest/)的Requests框架,但我试图访问的页面使用javascript来获取我想要的信息。

我试图在网上搜索一个解决方案,但事实上我正在搜索关键字javascript我得到的大部分内容是如何使用javascript语言。

是否有使用请求框架的页面使用javascript?

6 个答案:

答案 0 :(得分:26)

您将不得不使用javascript创建相同的请求(使用Requests库)。您可以使用任意数量的工具(包括Chrome和Firefox中内置的工具)来检查来自javascript的http请求,并自行从Python发出此请求。

答案 1 :(得分:15)

虽然Selenium看起来很诱人且有用,但它有一个无法解决的主要问题:性能。通过计算浏览器所做的每件事,您将需要更多的功能。甚至PhantomJS也不会与简单的请求竞争。我建议您在真正需要单击按钮时才使用Selenium。如果你只需要javascript,我推荐PyQt(检查https://www.youtube.com/watch?v=FSH77vnOGqU来学习它。)

但是,如果您想使用Selenium,我推荐Chrome over PhantomJS。很多用户都遇到PhantomJS的问题,其中一个网站根本无法在Phantom中运行。 Chrome也可以是无头的(非图形化的)!

首先,请确保您已安装了Chlenium所依赖的ChromeDriver,以便使用Google Chrome。

然后,通过在网址chrome:// settings / help

中查看,确保您拥有版本为60或更高版本的Google Chrome

现在,您需要做的就是以下代码:

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

寻找元素: 使用ELEMENTS或ELEMENT方法。实例:

driver.find_element_by_css_selector("div.logo-subtext") #Find your country in Google. (singular)
  • driver.find_element(s)_by_css_selector(css_selector)#与此CSS选择器匹配的每个元素
  • driver.find_element(s)_by_class_name(class_name)#具有以下类的每个元素
  • driver.find_element(s)_by_id(id)#每个具有以下ID的元素
  • driver.find_element(s)_by_link_text(link_text)#每个人都有完整的链接文字
  • driver.find_element(s)_by_partial_link_text(partial_link_text)#每个都有部分链接文字。
  • driver.find_element(s)_by_name(name)#Name = argument
  • 的每个元素
  • driver.find_element(s)_by_tag_name(tag_name)#每个带有标记名称参数的元素

确定!我找到了一个元素(或元素列表)。但我现在该怎么办?

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

  • elem.tag_name#可以返回。
  • 中的按钮
  • elem.get_attribute(" id")#返回元素的ID。
  • elem.text#元素的内部文本。
  • elem.clear()#清除文本输入。
  • elem.is_displayed()#True表示可见元素,False表示隐身元素。
  • elem.is_enabled()#True表示已启用的输入,否则为False。
  • elem.is_selected()#是否选中了此单选按钮或复选框元素?
  • elem.location#表示屏幕上元素的X和Y位置的字典。
  • elem.click()#点击 elem
  • elem.send_keys(" thelegend27")#将thelegend27输入 elem (对文字输入有用)
  • elem.submit()#提交 elem 参与的表格。

特殊命令:

  • driver.back()#单击“后退”按钮。
  • driver.forward()#单击“前进”按钮。
  • driver.refresh()#刷新页面。
  • driver.quit()#关闭浏览器,包括所有选项卡。
  • foo = driver.execute_script(" return' hello&#39 ;;")#执行javascript(可以带回程值!)

答案 2 :(得分:6)

好消息:现在有一个支持javascript的请求模块:https://pypi.org/project/requests-html/

from requests_html import HTMLSession

session = HTMLSession()

r = session('http://www.yourjspage.com')

r.html.render()  # this call executes the js in the page

我认为,BeautifulSoup可以作为奖励,所以您可以做类似的事情

r.find('#myElementID').text

它将按预期返回HTML元素的内容。

答案 3 :(得分:2)

我没有足够的声誉来发表评论,但我想分享使用“ requests_html”包的经验。

它实际上将网页上的所有内容下载到本地以执行所有操作。对我来说,这是极度冒险的。输出如下:

r.html.render()  # this call executes the js in the page
[W:pyppeteer.chromium_downloader] start chromium download.
Download may take a few minutes.
100%|██████████| 84299992/84299992 [00:18<00:00, 4644126.66it/s]
[W:pyppeteer.chromium_downloader] 
chromium download done.
[W:pyppeteer.chromium_downloader] chromium extracted to: .../Library/Application Support/pyppeteer/local-chromium/575458

答案 4 :(得分:-1)

它是围绕pyppeteer还是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

答案 5 :(得分:-1)

使用 Selenium 或 jQuery 启用的请求很慢。在网站检查浏览器上的 JavaScript 之后找出哪个 cookie 生成并获取该 cookie 并将其用于您的每个请求会更有效。

在一个示例中,它通过以下 cookie 起作用:

在此示例中检查 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。