开发者问题收集

从 ajax 驱动的弹出框中的工具提示中抓取文本

2019-04-30
475

我知道之前有人问过类似的问题,但似乎没有一个适用于这种特殊情况。我在几个网站上都遇到过这个问题,所以对于这个问题,我随机选择了 SO 自己的标签列表的第一页。

如果你看第一页上的第一个条目,你会看到这个:

enter image description here

显示标签描述的开头、问题总数以及今天和本周提出的问题数量。这些信息很容易选择:

from selenium.webdriver import Chrome
driver = Chrome()
driver.get('https://stackoverflow.com/tags')

例如,关注 JavaScript 标签:

dat = driver.find_elements_by_xpath("//*[contains(text(), 'week')]/ancestor::div[5]/div/div[1]/span/parent::*")
for i in dat:
    print(i.text)

输出:

    javascript× 1801272
JavaScript (not to be confused with Java) is a high-level, dynamic, multi-paradigm, object-oriented, prototype-based, weakly-typed language used for both client-side and server-side scripting. Its pri…
703 asked today, 4757 this week

现在变得更加复杂(至少对我来说):如果将鼠标悬停在 JavaScript 标签上,将出现此弹出框:

在此处输入图像描述

该框包含完整的标签描述,以及问题和关注者的(四舍五入)数量。如果将鼠标悬停在“1.2m watchers”元素上,则会看到以下工具提示:

在此处输入图片说明

这是此特定框的调用网址:

https://stackoverflow.com/tags/javascript/popup?_=1556571234452

该目标项目(以及问题总数)包含在此 html 中 spantitle 中:

<div class="-container">
<div class="-arrow js-source-arrow"></div>
<div class="mb12">
        <span class="fc-orange-400 fw-bold mr8">
            <svg aria-hidden="true" class="svg-icon va-text-top iconFire" width="18" height="18" viewBox="0 0 18 18"><path d="M7.48.01c.87 2.4.44 3.74-.57 4.77-1.06 1.16-2.76 2.02-3.93 3.7C1.4 10.76 1.13 15.72 6.8 17c-2.38-1.28-2.9-5-.32-7.3-.66 2.24.57 3.67 2.1 3.16 1.5-.52 2.5.58 2.46 1.84-.02.86-.33 1.6-1.22 2A6.17 6.17 0 0 0 15 10.56c0-3.14-2.74-3.56-1.36-6.2-1.64.14-2.2 1.24-2.04 3.03.1 1.2-1.11 2-2.02 1.47-.73-.45-.72-1.31-.07-1.96 1.36-1.36 1.9-4.52-2.03-6.88L7.45 0l.03.01z"/></svg>
            <span title="1195903">1.2m</span> watchers
        </span>

        <span class="mr8"><span title="1801277">1.8m</span> questions</span>

        <a class="float-right fc-orange-400" href="/feeds/tag/javascript" title="Add this tag to your RSS reader"><svg aria-hidden="true" class="svg-icon iconRss" width="18" height="18" viewBox="0 0 18 18"><path d="M1 3c0-1.1.9-2 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V3zm14.5 12C15.5 8.1 9.9 2.5 3 2.5V5a10 10 0 0 1 10 10h2.5zm-5 0A7.5 7.5 0 0 0 3 7.5V10a5 5 0 0 1 5 5h2.5zm-5 0A2.5 2.5 0 0 0 3 12.5V15h2.5z"/></svg></a>
</div>
        <div>JavaScript (not to be confused with Java) is a high-level, dynamic, multi-paradigm, object-oriented, prototype-based, weakly-typed language used for both client-side and server-side scripting. Its primary use is in rendering and manipulating of web pages. Use this tag for questions regarding ECMAScript and its various dialects/implementations (excluding ActionScript and Google-Apps-Script). <a href="/questions/tagged/javascript">View tag</a></div></div>

我无法弄清楚如何将所有这些信息放在一起以获得类似于这样的输出(或数据框),对于第一个中提到的所有标签页面:

Tag: JavaScript
Total questions: 1801277 #or whatever it is at the time this is performed
Watchers: 1195902 #same
.
.
etc.

为了抢先发表可能的评论,请允许我补充一下:我知道 SO 有一个用于此类搜索的 API,但 (i) 正如我所提到的,我随机选择了 SO 的标签页面,我想尽可能通用地解决这个问题;(ii) 如果我理解正确的话, 这无法通过 SO API 完成 ;(iii) 即使可以,我仍然想学习如何使用抓取技术来做到这一点。

1个回答

以下构造了检索该信息然后从这些URL中提取所需信息所需的最小URL,然后将所需的信息插入变量,这些变量被插入列表, row/code ,将>结果 。最终列表在末尾转换为数据框。

您可以使用

645707278

循环所有页面本周的数字等。由于未报告每个标签的同一时间段。如果您可以说明您想要如何处理,我将更新答案。看起来单位可以是日,每周或一个月(其中2个)。

我认为,在时间段/月等中提出的问题是动态加载的,因此您并不总是有两个测量值。为此,如果

语句来处理此问题,我添加了 。您可以继续发出请求,直到通过测试 len 频率 直到== 2。 530311755


使用原始代码与硒相结合以确保加载动态内容:< /p> 294439915

QHarr
2019-04-30