【问题标题】:How to execute a specific js request without loading the whole web page?如何在不加载整个网页的情况下执行特定的 js 请求?
【发布时间】:2018-01-04 22:24:33
【问题描述】:

我正在尝试从webpage 中获取单个元素 - 多个视图(现在眼睛图像附近左上角的2128 数字)。该数字是某些 javascript 函数的结果,因此它在源页面代码中不存在,我无法通过 http 请求获取它。我也不想用 Selenium webdriver 下载整个页面。有什么方法可以在不下载的情况下从页面运行单个 javascript 代码?

【问题讨论】:

  • 我当然希望不会。
  • 这取决于javascript从哪里得到它;运气好的话,它可以从一些 REST / GraphQL 微服务中提取出来,你可以直接得到它。最坏的情况,是的,它可能取决于首先下载整个页面。唯一知道的方法是深入研究 javascript 并弄清楚它在做什么。
  • 请参阅:How do I do X? SO 的期望是,提出问题的用户不仅会进行研究以回答他们自己的问题,还会分享研究、代码尝试和结果。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案!另见:How to Ask
  • @JeffC 抱歉,我花了一整天的时间搜索,但没有找到任何相关案例。所有示例都是关于从 Selenium webdriver 运行 JS 代码,我决定不把它们放在这里以免分心。

标签: javascript python selenium


【解决方案1】:

你可以避免使用selenium而直接使用requests,但是在这种情况下这需要两个步骤——首先从初始网页获取短URL值,然后获取来自单独端点的视图:

import re

import requests


pattern = re.compile(r'data-shorturl="https://r.rbc.ru/(.*?)"')
with requests.Session() as session:
    session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}
    response = session.get("https://www.rbc.ru/society/05/01/2018/5a4e9de19a7947e2bef693a1?from=main")

    short_url = pattern.search(response.text).group(1)

    response = session.get("https://www.rbc.ru/redir/stat/{short_url}".format(short_url=short_url))

    data = response.json()
    print(data["show"])

当前打印7712。

请注意,在这种情况下使用正则表达式来提取短 URL 值是完全可以的,因为我们不使用正则表达式解析 HTML 标记和结构,而只是提取文档中某处的 URL 字符串的特定部分。

【讨论】:

  • 你能告诉我你是怎么猜到第二个请求的链接的 - https://www.rbc.ru/redir/stat/?
  • @Vlad 刚刚打开浏览器开发人员工具 - 网络选项卡并浏览了 XHR 请求内容。这有点像在黑暗中拍摄,但有效。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
  • 2019-07-07
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
相关资源
最近更新 更多