【问题标题】:C# Clicking LI in UL for web scaping purposes.C# 在 UL 中单击 LI 以进行网络抓取。
【发布时间】:2018-06-28 22:16:54
【问题描述】:

我正在尝试抓取页面:https://www.investing.com/equities/statoil-technical

我想要实现的是点击 5 分钟、15 分钟、30 分钟等按钮并阅读点击后发生变化的枢轴点表。

我尝试了许多不同的方法。 System.Windows.Forms.Browser、ChromiumWebBrowser (Cef) 和现在的带有 JavaScript 的 ChromiumWebBrowser。

像这样:

         script = " var ul = document.getElementById('pairSublinksLevel1'); " +
            " var items = ul.getElementsByTagName('li'); " +
            " var Financials = 0; " +

            // Find and click the Financials Botton
            " for (var o = 0; o < items.length; o++) " +
            " { " +
            "   if (items[o].textContent = 'Financials') {" +
            "   Financials = o;}" +
            " } " +
            " items[Financials].click() ; " +

            // should I set " setTimeout(function(){}, 3000); " ?

            " var lis = document.getElementById('pairSublinksLevel1').getElementsByTagName('li'); " +
            " var TechnicalAnalysis = 0; " +

            // Find and click the Technical Analysis sub menu
            " for (var o = 0; o < lis.length; o++) " +
            " { " +
            "   if (lis[o].textContent = 'Technical Analysis') {" +
            "   TechnicalAnalysis = o;}" +
            " } " +

            " lis[TechnicalAnalysis].click();" +
            // should I set " setTimeout(function(){}, 3000); " ?


            // Get the bottons ( 5mins, 15mins, 30mins etc)
            " var TimePeriods = document.getElementById('timePeriodsWidget').getElementsByTagName('li'); " +
            " TimePeriods[5].click(); " +
            // should I set " setTimeout(function(){}, 3000); " ?

            " var x = document.getElementById('curr_table'); " + 
            " var xHTML= x.innerHTML ;";

            var task = LocalBrowser.EvaluateScriptAsync(script, timeout);
            task.Wait();

问题是,当我将“ TimePeriods[5].click(); 更改为按钮 3 或 1 或其他任何内容时,xHTML 不会改变。

我已经在 DOM 中尝试过。我在浏览器中试过。 我被困住了。

有人可以提示我正确的方向吗? 向我展示如何点击 LI :

<ul class="tabsBoxSubMenu techStudiesTabsSubMenu innerPage " id="timePeriodsWidget" data-view="normal">
<li pairid="376" data-period="300" class="first">
<li pairid="376" data-period="900" class="">
<li pairid="376" data-period="1800" class="">
<li pairid="376" data-period="3600" class="selected ">
<li pairid="376" data-period="18000" class="">
<li pairid="376" data-period="86400" class="">
<li pairid="376" data-period="week" class="">
<li pairid="376" data-period="month" class="">
</ul>

并获得

<table class="genTbl closedTbl crossRatesTbl" id="curr_table">
<thead>
<tr>
<th class="first left noWrap">Name</th>
<th class="noWrap">S3</th>
<th class="noWrap">S2</th>
<th class="noWrap">S1</th>
<th class="noWrap">Pivot Points</th>
<th class="noWrap">R1</th>
<th class="noWrap">R2</th>
<th class="noWrap">R3</th>
</tr>
</thead>
<tbody>
</table>

LI 点击生成的代码?

谢谢 哈康

【问题讨论】:

    标签: javascript c# html automation screen-scraping


    【解决方案1】:

    问题是您试图单击LI 元素,但加载表格和更改HTML 的操作实际上是由LI 的子A 元素触发的。

    所以,类似:TimePeriods[5].children[0].click(); 就可以了。

    // 我应该设置“setTimeout(function(){}, 3000);”吗?

    是的,您可以使用setTimeout 来延迟对表中数据的抓取或使用某种 DOM 更改检测技术,因为单击会触发 AJAX 调用,并且表中的数据很可能不可用马上。

    无论如何,我必须建议您抓取 politely,因为该过程可能会使目标网站超载,甚至可能涉及法律问题。

    【讨论】:

    • 谢谢你。我不会用请求挤满网站。我从来没有想过要叫孩子们的点击。谢谢你。快速浏览后,它似乎并没有改变结果,但我会更深入地研究它。谢谢你,哈康
    • 我已经尝试了我在帖子中使用的示例。我也尝试过单击 DOM 中的子项。但是,innerHTML 似乎是一样的。看起来按钮脚本没有运行。但感谢您的努力。问候,哈康
    • 非常感谢!我非常专注于从 JavaScript 中获取结果页面,以至于我花了一些时间才想到在浏览器中查看脚本!感谢您为我指明了正确的方向,不要担心法律问题。它是供个人使用的,每天可能会打 15-30 个电话。
    • 很高兴听到您解决了问题。如果它确实对您的问题有帮助,请适当地标记答案。作为旁注,我使用 PhantomJS 进行网站自动化获得了非常好的结果。 .NET 集成浏览器在某些情况下缺乏对 JavaScript 的呈现支持。没用过Cef,简单的情况下用起来比较麻烦。
    猜你喜欢
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2021-09-01
    相关资源
    最近更新 更多