使用curl自动执行点击

时间:2018-07-07 22:09:10

标签: bash curl automation

作为序言,我想提一提,我对编程一无所知。我正在做的所有事情都在网上查找,因此,如果您提出的问题对您来说似乎是虚无的,对不起。预先感谢。


我正在处理#1网页,例如http://website.com/page.php?action=showall,其中显示了http://website.com/someotherpage.php?ID=12345形式的链接,我必须单击其中的链接。我是在Mac终端上输入的

curl 'http://website.com/login.php' -XPOST --data 'email=EMAIL&pass=PASS&submit=+'  --cookie-jar ./login
curl --cookie ./login http://website.com/someotherpage.php?ID=[1-12345]

但是网页1不一定包含1到12345范围内的所有ID;实际上不存在此范围内的某些ID。我想知道是否可以仅打开上述形式的网页一中包含的网址。在页面源上,它们被列为

<a href='someotherpage.php?ID=223670'>Open</a>

此外,网页#1一次仅显示50个链接,因此单击完成后,我必须刷新并单击下50个链接。如何循环显示?

1 个答案:

答案 0 :(得分:1)

可能,是的,但是curl无法单独完成,bash并不是解析HTML的 适合 脚本语言。但是,如果使用更好的脚本语言(例如PHP,Python,Perl或几乎所有支持libxml + libcurl的语言),这将很容易。例如,安装php-cli,然后尝试以下php脚本:

#!/usr/bin/env php
<?php
$email = '???';
$password = '???';
$ch = curl_init ();
curl_setopt_array ( $ch, array (
        CURLOPT_COOKIEFILE => "", // enables cookie handling in ram, without needing a file.
        CURLOPT_URL => 'http://website.com/login.php',
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => http_build_query ( array (
                'email' => $email,
                'pass' => $pass,
                'submit' => '' 
        ) ),
        CURLOPT_RETURNTRANSFER => 1 
) );
$html = curl_exec ( $ch );
$domd = @DOMDocument::loadHTML ( $html );
$xp = new DOMXPath ( $domd );
foreach ( $xp->query ( '//a[text()="Open"]' ) as $openUrl ) {
    $url = "http://website.com/" . $openUrl->getAttribute ( "href" );
    echo "visiting $url     ..";
    curl_setopt ( $ch, CURLOPT_URL, $url );
    curl_exec ( $ch );
    echo " done.\n";
}

这将解析并访问带有确切文本“ Open”的任何<a>链接,该链接是通过XPath //a[text()="Open"]

获取的

其中

  1. //的意思是start from the very top of the document
  2. a的意思是find <a> tags
  3. [...]的意思是with conditions
  4. text()的意思是“获取要扫描的元素的文本内容”
  5. ="Open"-检查其内容是否完全“打开”